2013-04-10 82 views
0

老實說,我對此感到困惑!在另一張桌子上,我的代碼很相似,效果很好。Linq to SQL中導致「指定的轉換無效」的原因是什麼?

我在使用LINQ到SQL表中插入一行,並當任

  1. 觸發的一部分被禁用的用戶才能使用。
  2. 我總費用列(SQL錢,C#十進制)設置爲0。

觸發總結了一組行的總成本,然後更新在不同的表中的總成本。

觸發代碼

;WITH CalculatedTotals AS 
    (
     SELECT A.ID, SUM(B.TotalCost) AS TotalCost 
     FROM dbo.TableA A 
     INNER JOIN dbo.TableB B ON B.GroupID = A.ID 
     GROUP BY A.ID 
    ) 

    UPDATE A 
    SET A.TotalCost = CT.TotalCost 
    FROM dbo.TableA A 
    INNER JOIN CalculatedTotals CT ON A.ID = CT.ID 

在這段代碼中,CalculatedTotals.TotalCost是一個可空INT,而TableA.TotalCost是不可爲空的錢。我試過使用IsNull,Convert等。當使用Linq到Sql時,我總是得到相同的異常。但是,直接使用SQL插入行可以正常工作。再次,我有與另一個工作表類似的代碼。我正在使用.NET 4.

有什麼不對?

更新

InvalidCastException的堆棧跟蹤:

at System.Data.SqlClient.SqlBuffer.get_Int64() 
    at System.Data.SqlClient.SqlDataReader.GetInt64(Int32 i) 
    at Read_Object(ObjectMaterializer`1) 
    at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicInsert(TrackedObject item) 
    at System.Data.Linq.ChangeDirector.StandardChangeDirector.Insert(TrackedObject item) 
    at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) 
    at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 
    at System.Data.Linq.DataContext.SubmitChanges() 
    at Repository`2.Save() in C:\...\Repository.cs:line 104 
    at TableBManager.CreateTableB(TableB tableB) in C:\...\TableBManager.cs:line 45 
    at MyService.SetTableB(TableB tableB) in C:\...\MyService.cs:line 371 
    at SyncInvokeSetExtraFormItem(Object , Object[] , Object[]) 
    at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) 
    at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 

當我嘗試我呼籲SubmitChanges我的數據上下文它發生。

**更新**

這是我使用的通用回購類。

 /// <summary> 
     /// Creates the item. 
     /// </summary> 
     /// <param name="entity">The entity.</param> 
     public void CreateItem(T entity) 
     { 
      _db.GetTable<T>().InsertOnSubmit(entity); 
     } 

     /// <summary> 
     /// Saves this instance. 
     /// </summary> 
     public void Save() 
     { 
      _db.SubmitChanges(); 
     } 

更新

好了,所以我的其他代碼是不工作了兩種。我唯一改變的就是觸發器。

更新

發現這個SO許多有用的鏈接問題到2篇:Linq-To-SQL Invalid Cast on insert, not on update

這可能是一個錯誤。

+4

可以顯示異常的確切*詳細信息,理想情況下是LINQ代碼而不是SQL? – 2013-04-10 17:00:11

+0

TSQL可以很容易地推斷出你不打算的類型。計算一個位列是一個很好的例子。聽起來很明顯,但要確保你沒有由此造成的類型不匹配。 – 2013-04-10 17:05:56

+0

儘管它沒有觸發器,但我檢查了dbml的設計器頁面上的所有字段,但沒有注意到任何不良類型。我甚至刪除並重新添加所有表到dbml。 – Lifes 2013-04-10 17:13:46

回答

1

從測試它時起,我的觸發器中就有一條選擇語句。所以觸發器正在返回一個實體集,但Linq到Sql創建期望一個64位int。我刪除了select語句,並且insert再次工作。

相關問題