0

老实说,我对此感到困惑!我在另一个工作得很好的桌子上有非常相似的代码。

我正在使用 Linq to 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 to 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我的数据上下文时会发生这种情况。

** 更新 **

这是我使用的通用 repo 类。

        /// <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

1 回答 1

2

当我测试它时,我的触发器中有一个 select 语句。所以触发器返回了一个实体集,但是 Linq to Sql 创建需要一个 64 位的 int。我删除了 select 语句,插入再次起作用。

于 2013-04-10T19:21:16.297 回答