我不明白怎么办SqlCommandBuilder http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommandbuilder.aspx做它的事。我有以下代码:
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
没有在任何地方使用,我不调用GetUpdateCommand()
方法,就像他们所做的那样MSDN http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommandbuilder.aspx。我只创建SqlCommandBuilder
,传递给它一个SqlDataAdapter
。但代码运行得很好。
如果你看一下代码,看起来就像是这样的行
var builder = new SqlCommandBuilder(da);
可以安全删除。事实上,ReSharper 建议删除它。但如果我这样做了,代码就不会再运行了,因为SqlDataAdapter
不知道如何执行更新。
在调试模式下,我注意到执行该行后,SqlDataAdapter
's UpdateCommand
财产仍在null
。来自MSDN http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommandbuilder.aspx-docs 我明白了SqlCommandBuilder
将自身注册到RowUpdated
事件的SqlDataAdapter
.
但是当该事件被触发时它会做什么呢?是个SqlDataBuilder
实际上执行更新本身吗?
如果我删除了,我还注意到了其他事情SqlCommandBuilder
, my DaRowUpdated
方法在 InvalidOperationException 发生之前触发一次da.Update
陈述。我原本没想到。我想RowUpdated
事件仅在行实际更新时发生。
所以......三个具体问题:
- 如何防止 ReSharper 建议删除此行?
- 像这样编程一个类是不是不好的做法
SqlCommandBuilder
,其中代码没有以任何方式表明创建实例正在对SqlDataAdapter
通过了?
- 这是一个设计模式 http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29?