SqlCommandBuilder 如何执行其操作以及如何阻止 ReSharper 删除它的建议?

2024-03-30

我不明白怎么办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事件仅在行实际更新时发生。

所以......三个具体问题:

  1. 如何防止 ReSharper 建议删除此行?
  2. 像这样编程一个类是不是不好的做法SqlCommandBuilder,其中代码没有以任何方式表明创建实例正在对SqlDataAdapter通过了?
  3. 这是一个设计模式 http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29?

如果您不使用该变量,则绝对没有必要。如果它的构造函数中发生了一些事情is有用,你仍然可以调用它:

var builder = new SqlCommandBuilder(da);

应该:

new SqlCommandBuilder(da);

这应该可以在不改变代码行为的情况下处理警告。看起来有点奇怪,如果这真的有必要,我对设计提出质疑SqlCommandBuilder一点点。但实际上,这样的用法本质上与普通方法调用相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SqlCommandBuilder 如何执行其操作以及如何阻止 ReSharper 删除它的建议? 的相关文章

随机推荐