0

我需要更新一些具有相同字段的表。

现在我对每个表都有一个单独的更新语句,如下所示:

try
        {
            using (SqlConnection conn = new SqlConnection(cCon.getConn()))
            {

                using (SqlCommand cmd = conn.CreateCommand())
                {
conn.Open();
                    cmd.CommandText = "update table0 set active= 'N' where id=@id";
                    cmd.Parameters.Add(new SqlParameter("@id", id));
                    cmd.ExecuteNonQuery();

                    cmd.Parameters.Clear();
                    cmd.CommandText = "update table1 set active= 'N' where id= @id ";
                    cmd.Parameters.Add(new SqlParameter("@id", id));
                    cmd.ExecuteNonQuery();

                    cmd.Parameters.Clear();
                     cmd.CommandText = "update table2 set active= 'N' where id= @id "
                    cmd.Parameters.Add(new SqlParameter("@id", id));
                    cmd.ExecuteNonQuery();

                    cmd.Parameters.Clear();
                    cmd.CommandText = "update table4 set active= 'N' where id= @id "
                    cmd.Parameters.Add(new SqlParameter("@id", id));
                    cmd.ExecuteNonQuery();
                }
            }
        }

我可以优化代码以减少调用次数吗?也许将所有更新合并到 1 个命令文本中并且只执行一次?

因为它的参数都是一样的,我认为这应该是可能的?还是我应该只做一个存储过程?

4

3 回答 3

1

理想情况下,您将调用存储过程来处理此问题。但是在语句批处理中使用相同的参数也可以:

cmd.CommandText = @"update table0 set active= 'N' where id=@id;
      update table1 set active= 'N' where id= @id;
      update table2 set active= 'N' where id= @id;
      update table4 set active= 'N' where id= @id;";
cmd.Parameters.Add(new SqlParameter("@id", id));
cmd.ExecuteNonQuery();
于 2013-03-27T15:59:07.637 回答
1
const string query = @"update {0} set active= 'N' where id=@id;";

public string GetCommandText(string table)
{
    return string.Format(query, table);
}

public IEnumerable<string> GetTables()
{
    yield return "table0";
    yield return "table1";
    yield return "table2";
    yield return "table4";
}

using (SqlCommand cmd = conn.CreateCommand())
{
    cmd.Parameters.Add(new SqlParameter("@id", id));
    cmd.CommandText = GetTables().Select(GetCommandText).Aggregate((s, s1) => s + s1);

    conn.Open();
    cmd.ExecuteNonQuery();
}
于 2013-03-27T16:04:42.703 回答
0

你删除

cmd.Parameters.Clear();

并且您只使用此代码一次

 cmd.Parameters.Add(new SqlParameter("@id", id));

所以 :

cmd.CommandText = "update table0 set active= 'N' where id=@id";
                    cmd.Parameters.Add(new SqlParameter("@id", id));
                    cmd.ExecuteNonQuery();


                    cmd.CommandText = "update table1 set active= 'N' where id= @id ";
                    cmd.ExecuteNonQuery();

                     cmd.CommandText = "update table2 set active= 'N' where id= @id "
                    cmd.ExecuteNonQuery();

                    cmd.CommandText = "update table4 set active= 'N' where id= @id "
                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
于 2013-03-27T15:56:58.803 回答