その仕組みがわかりませんSqlCommandBuilder
。次のコードがあります。
public void TestCommandBuilder()
{
var pubsDataSet = new DataSet("Pubs");
var pubs = ConfigurationManager.ConnectionStrings["PubsConnectionString"];
var connection = new SqlConnection(pubs.ConnectionString);
SqlCommand cmd = connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT * FROM Publishers";
var da = new SqlDataAdapter(cmd);
da.Fill(pubsDataSet, "publishers");
foreach (DataRow row in pubsDataSet.Tables["publishers"].Rows)
{
row["pub_name"] = "Updated " + DateTime.Now.Minute + DateTime.Now.Second;
}
// The variable builder is not used
var builder = new SqlCommandBuilder(da);
da.UpdateBatchSize = 3;
da.RowUpdated += DaRowUpdated;
da.Update(pubsDataSet, "publishers");
}
private void DaRowUpdated(object sender, SqlRowUpdatedEventArgs e)
{
Console.WriteLine("Rows: " + e.RecordsAffected + "\r\n");
}
変数builder
はどこでも使用されておらず、 MSDNGetUpdateCommand()
のようにメソッドを呼び出していません。を作成し、 を渡すだけです。しかし、コードは正常に機能します。SqlCommandBuilder
SqlDataAdapter
コードを見ると、次の行のようです
var builder = new SqlCommandBuilder(da);
安全に削除できます。実際、ReSharper はそれを削除することを提案しています。SqlDataAdapter
しかし、そうすると、更新の実行方法がわからないため、コードは実行されなくなります。
SqlDataAdapter
デバッグ モードで、その行を実行した後、のUpdateCommand
プロパティが のままであることに気付きましたnull
。MSDN -docsから、が のイベントにSqlCommandBuilder
登録されていることがわかります。RowUpdated
SqlDataAdapter
しかし、そのイベントがトリガーされたとき、それは何をしますか? はSqlDataBuilder
実際にアップデート自体を実行していますか?
他に気付いたことは、を削除すると、ステートメントで InvalidOperationException が発生する直前にSqlCommandBuilder
、メソッドが 1 回トリガーされることです。それを予想しなかった。イベントは、行が実際に更新されたときにのみ発生すると思います。DaRowUpdated
da.Update
RowUpdated
つまり... 3 つの具体的な質問:
- ReSharper がこの行の削除を提案しないようにするにはどうすればよいですか?
- インスタンスの作成が渡された
SqlCommandBuilder
もので何かをしていることをコードがまったく示していない のようなクラスをプログラムするのは悪い習慣ですか?SqlDataAdapter
- これはデザインパターンですか?