5

データベースへのアクセスには、Rob Conery のMassiveを使用しています。いくつかの挿入でトランザクションをラップしたいのですが、2 番目の挿入は最初の挿入から返された ID を使用します。トランザクションでこれを行う方法は私には明らかではありません。いくつかの支援をいただければ幸いです。

var commandList = new List<DbCommand>
    {
        contactTbl.CreateInsertCommand(new
            {
                newContact.Name,
                newContact.Contact,
                newContact.Phone,
                newContact.ForceChargeThreshold,
                newContact.MeterReadingMethodId,
                LastModifiedBy = userId,
                LastModifiedDate = modifiedDate,
            }),
        branchContactTbl.CreateInsertCommand(new
            {
                newContact.BranchId,
                ContactId = ????, <-- how to set Id as identity from previous command
            }),
    };
4

2 に答える 2

2

これら 2 つの挿入の間でクエリを作成します。Massive のこのメソッドが役立つ場合があります。

public object Scalar(string sql, params object[] args) {
    object result = null;
    using (var conn = OpenConnection()) {
        result = CreateCommand(sql, conn, args).ExecuteScalar();
    }
    return result;
} 

あなたのSQLは = "select scope_identity()" になります

2013/02/26更新

Massive コードをもう一度見てみると、最後に挿入された ID を取得する信頼できる方法はありません。

上記のコードは、「select scope_identity()」を作成する接続がプールされている場合にのみ機能します。(挿入したのと同じ接続でなければなりません)。

Massivetable.Insert(..)メソッドは、「SELECT @@IDENTITY」で埋められた ID フィールドを含む Dynamic を返します。最後に挿入された ID をグローバル スコープから取得します。これは明らかなバグです (マルチスレッド シナリオで明らかです)。

于 2011-03-23T21:51:18.250 に答える
1

ストアドプロシージャでそれを行うことはできますか? scope_identity またはさらに良い出力句を使用して、必要な値を取得できます。また、すべてのテーブルへのすべての挿入が 1 つのトランザクション内にあり、いずれかが失敗した場合にロールバックできます。

于 2013-02-26T19:44:14.180 に答える