如何使用UpdateCommand的CommandText存储过程?

时间:2012-05-24 19:42:41

标签: c# ado.net

我有一个DataGridView用于编辑表格。以下代码用于更新表。

using (SqlConnection con = new SqlConnection("...."))
{
    con.Open();

    SqlDataAdapter da = new SqlDataAdapter("select * from T", con);
    SqlCommandBuilder cb = new SqlCommandBuilder(da);
    cb.ConflictOption = ConflictOption.OverwriteChanges;

    da.UpdateCommand = cb.GetUpdateCommand();
    // da.UpdateCommand.CommandText = "exec sp1 @p1, @p2, @p3...";
    da.InsertCommand = cb.GetInsertCommand();
    da.DeleteCommand = cb.GetDeleteCommand();
    da.Update(datatable.GetChanges());
}

我发现da.Update(datatable.GetChanges())根据修改后的列巧妙地生成了最小的set子句。

update T set c1 = @p1 where K = @p2 -- If only c1 is changed in the grid 
update T set c1 = @p1, c2 = @p2 where K = @p3 -- if both c1 and c2 is changed
update T set c4 = @p1 where K = @p2 -- if only c4 is changed
......

如何编写CommandText的存储过程?

2 个答案:

答案 0 :(得分:3)

您需要在接收参数的服务器上创建存储过程。您使用的方法是生成SQL而不使用存储过程,它通过连接将SQL发送到服务器。如果我将sproc命名为UpdateSomeUserTable:

oleDbCommand1.CommandText = "UpdateSomeUserTable";
oleDbCommand1.CommandType = System.Data.CommandType.StoredProcedure;

oleDbCommand1.Parameters["us_id"].Value = "668987";
oleDbCommand1.Parameters["us_lname"].Value = "White";
oleDbCommand1.Parameters["us_fname"].Value = "Johnson";

oleDbConnection1.Open();
oleDbCommand1.ExecuteNonQuery();
oleDbConnection1.Close();

答案 1 :(得分:0)

这是一个代码嗅觉,我不建议使用,但它的工作原理。

dataAdapter.RowUpdating +=  (sender, e) =>
{
    if (e.Command != null && !string.IsNullOrEmpty(e.Command.CommandText))
    {
       e.Command.CommandText = $"";                                
    }
};