如何在SQLDataAdapter中使用Update语句

3

我想在构建完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;

        }
    }
3个回答

6

这里的一种方法是使用 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;

最后,我们使用SqlDataAdapterUpdate方法将更新发送到数据库:

da.Update(dtSETS);

这样做的作用是只发送具有RowStateModified的行的更新。

注意:每个ADO.NET对象应该被包含在一个using块中。重构你的代码以匹配这种类型的模板:

using (SqlConnection con = new SqlConnection(...))
{
    using (SqlDataAdapter da = new SqlDataAdapter(...))
    {

    }
}

谢谢,我遇到了这个错误:必须声明标量变量“@ID”,而且代码似乎在这一行失败了:da.UpdateCommand = builder.GetUpdateCommand();。 - moe
@moe,你在使用SqlCommandBuilder时遇到了特定的错误吗? - Mike Perrenoud
是的,我遇到了这个错误:必须声明标量变量“@ID”,而且代码似乎在此行失败:da.UpdateCommand = builder.GetUpdateCommand(); - moe
@moe,请将builder行移至Fill下方并告诉我发生了什么。 - Mike Perrenoud

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和接下来的命令打开连接。


0

您需要使用SqlCommandBuilder类在断开模式下更新数据,即使用DataSet和Data Adapters。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接