2011-01-10 8 views
0

GetUpdateCommand()またはGetInsertCommand()を私のSqlCommandBuilderから使用すると、生成されたSqlCommandにはConnectionメンバーが設定されていますが、閉じた状態になっています。このオブジェクトに接続メンバは表示されず、SqlCommandBuilder.DataAdapter.SelectCommandの接続が開いています(更新/削除/ InsertCommandプロパティがnull)ので、どの接続を使用するのか不思議です。SqlCommandBuilderはクエリを生成するためにどのような接続を使用しますか?

GetUpdateCommand()またはGetInsertCommand()を実行する前に接続の状態を確認する必要がありますか。それとも閉じていれば内部接続を開くだけですか?あなたのSqlCommandBuilderそれは内部的にDataAdapterDataAdapter.SelectCommand.Connection.CreateCommand())に設定された接続上で新しいコマンドを作成する上でGetXXXCommandを呼び出すとき

はところで、私は、SQL Server 2008の

+0

接続が必要ですか? SELECTの –

+0

からのメタデータが必要です(このメソッドで生成されたコマンドを実行すると、ExecuteNonQueryは開いて使用可能な接続が必要です。接続の現在の状態は閉じています)。 – Antoine

答えて

0

AFAIK新しいコマンドを作成するにはSqlCommandBuilder.DataAdapter.SelectCommandの接続を使用していますが、初めてコマンドにアクセスしようとしたときにのみ実行されます。最初の試行後、コマンドインスタンスは保持され、コマンドテキストのみが再生成されます。

+0

はい、その真の呼び出しie * GetInsertCommand *は以前に返されたSqlCommand-instancesで変更されたコマンド・テキストになります。しかし、結局のところ、生成されたコマンドは* SqlCommandBuilder.DataAdapter.SelectCommand * –

+0

からの接続を使用することを意味しますが、これは接続の状態を説明するものではありません。とにかく、私はコマンドの接続を再設定することで問題をバイパスし、これまでのところ動作するようです。 – Antoine

0

による.NET 4を使用します。これは、ビルダーが作成したすべてのコマンドで接続が同じで、オープン/クローズ状態が同じである必要があることを意味します。

状態がSqlCommandBuilder.DataAdapter.SelectCommand.Connectionで開かれていても、SqlCommandBuilder.GetInsertCommand().Connectionでは開かれていないと判断するコードはどのようなものですか?

+0

GetUpdateCommand()を呼び出した後、デバッガでそれを調べています。質問のコメントで説明したように、私はExecuteNonQuery()を生成されたコマンドで実行するときにエラーをデバッグするときにこれを認識しました。 – Antoine

+0

私は暗黙のうちに、この問題に関してデバッガを信頼するのではなく、いくつかの実際のコードテストを行うか、または何かを実行する前に接続が開いていることを確認するだけです。 –

+0

パフォーマンス面では、閉じたものを開くのではなく、すでに開いている接続を使用する方が良いと思います。 – Antoine

関連する問題