老实说,我对此感到困惑!在另一张桌子上,我的代码很相似,效果很好。Linq to SQL中导致“指定的转换无效”的原因是什么?
我在使用LINQ到SQL表中插入一行,并当任
- 触发的一部分被禁用的用户才能使用。
- 我总费用列(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
这可能是一个错误。
可以显示异常的确切*详细信息,理想情况下是LINQ代码而不是SQL? – 2013-04-10 17:00:11
TSQL可以很容易地推断出你不打算的类型。计算一个位列是一个很好的例子。听起来很明显,但要确保你没有由此造成的类型不匹配。 – 2013-04-10 17:05:56
尽管它没有触发器,但我检查了dbml的设计器页面上的所有字段,但没有注意到任何不良类型。我甚至删除并重新添加所有表到dbml。 – Lifes 2013-04-10 17:13:46