如何在 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);

这将只为具有RowStateModified 的行发送更新。

注意:每个 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()

在 C# 中使用 SqlDataAdapter 更新数据库

SqlDataAdapter 如何在内部工作?

SqlDataAdapter.update() 不更新数据库

使用 SqlDataAdapter 更新 SQL Server 数据库

SqlDataAdapter.Update(数据表)不工作(不更新数据库)