如何在 SQLDataAdapter 中使用更新语句
Posted
技术标签:
【中文标题】如何在 SQLDataAdapter 中使用更新语句【英文标题】:How to Use an Update Statement in SQLDataAdapter 【发布时间】:2013-12-31 18:27:34 【问题描述】:我在构建我的 sqldataadapter 后尝试运行更新语句。我的表中有名为 INIT_PHASE 的列,如果 INIT_PHASE 为空或没有数据,那么我想将其设置为 1。我已经尝试过,但我似乎无法正确更新语句。请。帮助。这是我的代码:
string ID = ddlPractice.SelectedValue;
string TYPE = DDL_TYPE.SelectedValue;
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString);
SqlDataAdapter da = new SqlDataAdapter(@"select SET_SK, UNIT_NM, TYPE, INIT_PHASE FROM myTable WHERE UNIT_NM =@ID AND TYPE = @TYPE", con);
DataTable dtSETS = new DataTable();
da.SelectCommand.Parameters.AddWithValue("@ID", (ID));
da.SelectCommand.Parameters.AddWithValue("@TYPE", (TYPE));
da.Fill(dtSETS);
if (dtSETS.Rows.Count > 0)
DataRow dtSETS_row = dtSETS.Rows[0];
long SET_SK = dtSETS_row.Field<long>("SET_SK");
if (dtSETS_row.Field<string>("INIT_PHASE") == null)
//run update command here
update myTable set INIT_PHASE = 1;
【问题讨论】:
【参考方案1】:这里的一种方法是使用SqlCommandBuilder
来构建UPDATE
语句:
string ID = ddlPractice.SelectedValue;
string TYPE = DDL_TYPE.SelectedValue;
SqlConnection con = new SqlConnection(
ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString);
SqlDataAdapter da = new SqlDataAdapter(
@"select SET_SK, UNIT_NM, TYPE, INIT_PHASE FROM myTable WHERE UNIT_NM =@ID AND TYPE = @TYPE",
con);
DataTable dtSETS = new DataTable();
da.SelectCommand.Parameters.AddWithValue("@ID", (ID));
da.SelectCommand.Parameters.AddWithValue("@TYPE", (TYPE));
da.Fill(dtSETS);
SqlCommandBuilder builder = new SqlCommandBuilder(da);
da.UpdateCommand = builder.GetUpdateCommand();
if (dtSETS.Rows.Count > 0)
DataRow dtSETS_row = dtSETS.Rows[0];
long SET_SK = dtSETS_row.Field<long>("SET_SK");
if (dtSETS_row.Field<string>("INIT_PHASE") == null)
dtSETS_row["INIT_PHASE"] = 1;
da.Update(dtSETS);
请注意以下代码行。这里我们正在构建更新命令:
SqlCommandBuilder builder = new SqlCommandBuilder(da);
da.UpdateCommand = builder.GetUpdateCommand();
在这里,我们实际上是在修改 DataRow
,以便将其 RowState
更改为 Modified
:
dtSETS_row["INIT_PHASE"] = 1;
最后,我们在SqlDataAdapter
上使用Update
方法向数据库发送更新:
da.Update(dtSETS);
这将只为具有RowState
或Modified
的行发送更新。
注意:每个 ADO.NET 对象都应包装在 using
中。重构您的代码以匹配这种类型的模板:
using (SqlConnection con = new SqlConnection(...))
using (SqlDataAdapter da = new SqlDataAdapter(...))
【讨论】:
谢谢,我收到此错误:必须声明标量变量“@ID”,并且似乎代码在此行失败:da.UpdateCommand = builder.GetUpdateCommand(); . @moe,您是否收到SqlCommandBuilder
的特定错误?
是的,我收到此错误:必须声明标量变量“@ID”,并且代码似乎在这一行失败:da.UpdateCommand = builder.GetUpdateCommand();
@moe,将builder
行移到Fill
下方,告诉我会发生什么。【参考方案2】:
如果我理解正确,你可以直接执行命令来更新这个字段
if (dtSETS_row.Field<string>("INIT_PHASE") == null)
SqlCommand cmd = new SqlCommand(@"UPDATE myTable set INIT_PHASE = 1 " +
"WHERE UNIT_NM =@ID AND TYPE = @TYPE", con);
cmd.Parameters.AddWithValue("@ID", (ID));
cmd.Parameters.AddWithValue("@TYPE", (TYPE));
cmd.ExecuteNonQuery();
您需要为 SqlDataAdapter 和以下命令打开连接
【讨论】:
【参考方案3】:您必须使用SqlCommandBuilder
类在断开连接模式下更新数据。即)数据集和数据适配器。
【讨论】:
以上是关于如何在 SQLDataAdapter 中使用更新语句的主要内容,如果未能解决你的问题,请参考以下文章
使用带参数的 SqlDataAdapter.Update()
SqlDataAdapter.update() 不更新数据库