0

これには正直ビックリ!別のテーブルに非常によく似たコードがあり、正常に機能します。

Linq to Sql を使用してテーブルに行を挿入していますが、次のいずれかの場合にのみ機能します

  1. トリガーの一部が無効になっています。
  2. 合計コスト列 (SQL のお金、C# の 10 進数) を 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 は null 許容の int ですが、TableA.TotalCost は null 非許容の金額です。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データコンテキストを呼び出そうとすると発生します。

** アップデート **

これは、私が使用する一般的なレポ クラスです。

        /// <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 つの記事への便利なリンクを含むこの SO の質問を見つけました: 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 に答える