1

Linq2Sql は、ストアド プロシージャのテーブル値パラメーターをサポートしていません ( 12 )。

このため、DataContext にテーブル値パラメーターの醜いサポートを追加しています (一貫性を保ち、同じデータ コンテキスト内からプロシージャを呼び出すことができるようにするためです)。

を呼び出しthis.Connection.CreateCommand()、にキャストしSqlCommand(SqlCommandいずれにせよ TVP をサポートするため)、それらを含むすべてのパラメーターを手動でリストしSqlDbType.StructuredますExecuteNonQuery

これはうまくいきます。
しかし。
ヘルパー メソッド内では、コンテキスト接続が閉じている可能性があるため、コンテキスト接続を開く必要があります。接続を手動で開いたので、手動で閉じる必要がありますか?

私はこれら
を経験しました:Linqを使用している場合、SQL接続を手動で閉じる必要がありますか? DataContext を使用する場合、いつデータベースへの接続が開始されますか
?

しかし、彼らは実際には私の質問に答えません。結果が列挙されると接続が閉じられることは理解していますが、それよりも複雑です。メソッドの呼び出しは、結果の列挙とは異なり、読み取り専用操作ではありません。
さらに、アンビエント トランザクションがある場合DataContext、最初のメソッド呼び出しの後に接続を確実に閉じません。

using (var ambient_tran = new System.Transactions.TransactionScope())
{
    using (var dx = new SomeDataContext()) 
    {
        dx.CallMethodOne(foo, bar);
        dx.CallMethodTwo(bar, baz); // executed on same connection and same transaction,
                                    // can see uncommitted data entered by CallMethodOne
    }

    ambient_tran.Complete();
};

このため、接続に関して何をするのが正しいのかわかりません。
接続を開いてDataContextその有効期間を管理したままにするだけですか、それとも従うべきパターンがありますか?


編集:

実験では、開いたままにしておくと正常に動作し、アンビエント トランザクションがあればそれを自動的に尊重することが示されています。しかし、私はそれについてしっかりしたアドバイスをしたいと思います。

4

1 に答える 1

-1

分散トランザクションが必要ない場合は、System.Trasactions の使用を避けてください。代わりに、TextMetalプロジェクトのサンプル コードを参照し、Plumbing 名前空間に注意してください。質問がある場合は、私にメールしてください。MSDTC のわずかな手間はなく、適切に生成された ADO.NET/LINQ to SQL、作業単位パターン、および適切に設計されたデータ アクセス コードがいくつかあります。

System.Transactions を使用するやむを得ない理由がある場合でも、接続がプールに解放された後、トランザクション コーディネーターがコミット/ロールバックを管理するため、できるだけ早く接続を閉じることをお勧めします。

于 2012-09-13T15:07:00.580 に答える