質問
コンサルタントがチェックインしたコードを確認していましたが、SQLCLR が使用されていることに気付きました。経験が無いので、どんなものなのか調べてみようと思いました。彼らが使っていることに気づきました
Dim cn As New SqlConnection("server=LOCALHOST;integrated security=yes;database=" & sDb)
の代わりに
DIM conn As New SqlConnection("context connection=true")
最初は localhost なので、何が違うのでしょう?
解決
コンテキスト接続は、ユーザーがすでに確立しているサーバーへの接続を使用します。したがって、データベース コンテキスト、接続オプションなどを継承します。
localhost を使用すると、通常の共有メモリ接続を使用してサーバーに接続します。これは、ユーザーの接続を使用したくない場合 (つまり、別のデータベースに接続したい場合、または別のオプションを使用して接続したい場合など)。
ほとんどの場合、サーバーへの個別の接続が作成されないため、コンテキスト接続を使用する必要があります。
また、別の接続を使用するということは、ユーザーのトランザクションの一部ではなく、通常のロック セマンティクスの対象となることを意味することに注意してください。
他のヒント
大規模なオフィスの電話システムを考えてみましょう。
私のオフィスには内線電話システムがあります。ただし、すべての電話には外部電話番号 (実際の TELCO 回線のグループの 1 つを利用する仮想番号) もあります。別のオフィスの内線番号に直接ダイヤルすることで電話をかけることができ、通話は社内電話システム (1 ホップ) を介してルーティングされます。あるいは、その電話の公衆番号にダイヤルすると、通話はビルのシステムから TELCO 交換局にルーティングされ、その後ビルのシステムを経由してオフィス内線に戻ります (3 ホップ)。
最初の SQL 接続は、接続文字列で指定されたサーバーに接続するときの標準 SQL 接続と同じように動作します。新しい接続は、標準のネイティブ SQL 接続を使用して作成されます。これは、別のオフィスの電話の完全な公衆電話番号にダイヤルするのと同じように動作します。確かに、ローカル マシンに接続していますが、接続のルーティングは異なります。
コンテキスト接続には、SQLCLR オブジェクトを実行している既存の接続を使用する新しい SqlConnection インスタンスがあります。既存のローカルコンテキストを使用しています。これは、オフィスメイトの内線に直接ダイヤルするようなものです。ローカルコンテキストでより効率的。
私は肯定的ではありませんが、コンテキスト接続を使用すると、SQLCLR オブジェクトへの呼び出しもコンテキストのトランザクションに参加すると考えています。私が間違っていたら誰か訂正してください。
ピーター