是什么原因导致“指定的格式无效”?从Linq到SQL

本文关键字:无效 Linq SQL 格式 是什么 | 更新日期: 2023-09-27 18:08:25

我真的很困惑!我在另一个表上有非常类似的代码,工作得很好。

我正在使用Linq到Sql在表中插入一行,它只会在

时工作
  1. 部分触发器被禁用。
  2. 我将总成本列(SQL货币,c#十进制)设置为0。

触发器汇总一组行的总成本,然后更新另一个表上的总成本。

<

触发代码/strong>

    ;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。总成本是不可兑换的货币。我试过使用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时,它会发生。

** Update **

这是我使用的通用的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();
        }

好的,所以我的其他代码也不再工作了。我唯一改变的是扳机。

发现这个问题与有用的链接到2篇文章:Linq-To-SQL在插入时无效强制转换,而不是在更新

可能是bug

是什么原因导致“指定的格式无效”?从Linq到SQL

在我测试它时,在我的触发器中有一个select语句。所以触发器返回一个实体集,但是Linq to Sql创建期望一个64位int。我删除了选择语句,插入再次工作。