Linq2Sql は、ストアド プロシージャのテーブル値パラメーターをサポートしていません ( 1、2 )。
このため、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
その有効期間を管理したままにするだけですか、それとも従うべきパターンがありますか?
編集:
実験では、開いたままにしておくと正常に動作し、アンビエント トランザクションがあればそれを自動的に尊重することが示されています。しかし、私はそれについてしっかりしたアドバイスをしたいと思います。