You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用SQL Data Adapter的Update命令更新数据表中的行

使用SqlDataAdapter更新Students表的行

嘿,看你已经搞定了Insert操作,用SqlDataAdapter做更新其实思路相通,只是需要额外配置更新命令(或者用工具自动生成)。我给你两种常用的实现方式,一步步来:

方式一:手动配置UpdateCommand(更灵活,适合复杂场景)

这种方式需要我们自己写UPDATE语句和参数,能精准控制更新逻辑,还能避免SQL注入:

// 从界面获取要更新的学生ID和新的信息
int targetID = int.Parse(TextBoxID.Text); // 用来输入要更新的学生ID的文本框
string updatedName = TextBoxNewName.Text;
string updatedGender = TextBoxNewGender.Text;
int updatedMarks = int.Parse(TextBoxNewMarks.Text);

string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
using (SqlConnection con = new SqlConnection(connectionString))
{
    // 先查询出要更新的那条记录(只查目标ID,提升效率)
    SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Students WHERE ID = @TargetID", con);
    adapter.SelectCommand.Parameters.AddWithValue("@TargetID", targetID);

    // 把查询结果填充到DataTable
    DataTable studentTable = new DataTable();
    adapter.Fill(studentTable);

    if (studentTable.Rows.Count > 0)
    {
        // 获取要修改的行,更新字段值
        DataRow targetRow = studentTable.Rows[0];
        targetRow["Name"] = updatedName;
        targetRow["Gender"] = updatedGender;
        targetRow["Marks"] = updatedMarks;

        // 配置UpdateCommand:指定更新语句和参数
        adapter.UpdateCommand = new SqlCommand(
            "UPDATE Students SET Name = @NewName, Gender = @NewGender, Marks = @NewMarks WHERE ID = @TargetID", 
            con
        );
        // 给UpdateCommand添加参数
        adapter.UpdateCommand.Parameters.AddWithValue("@NewName", updatedName);
        adapter.UpdateCommand.Parameters.AddWithValue("@NewGender", updatedGender);
        adapter.UpdateCommand.Parameters.AddWithValue("@NewMarks", updatedMarks);
        adapter.UpdateCommand.Parameters.AddWithValue("@TargetID", targetID);

        // 执行更新,返回受影响的行数
        int rowsUpdated = adapter.Update(studentTable);
        if (rowsUpdated > 0)
        {
            Console.WriteLine("学生信息更新成功!"); // 或者用MessageBox弹出提示
        }
    }
    else
    {
        Console.WriteLine("未找到对应ID的学生记录!");
    }
}

关键点说明:

  • 必须通过SelectCommand先获取要更新的记录,这样SqlDataAdapter才能跟踪数据的变更状态
  • WHERE ID = @TargetID是核心:确保只更新目标行,避免误改其他记录
  • 参数化查询一定要用,不仅能防止SQL注入,还能处理字符串包含特殊字符、数值类型转换等问题

方式二:用SqlCommandBuilder自动生成命令(快捷简单)

如果你的更新逻辑比较简单,且Students表有主键(比如ID是主键),可以用SqlCommandBuilder自动生成UpdateCommand、InsertCommand和DeleteCommand,省去手动写SQL的麻烦:

int targetID = int.Parse(TextBoxID.Text);
string updatedName = TextBoxNewName.Text;
string updatedGender = TextBoxNewGender.Text;
int updatedMarks = int.Parse(TextBoxNewMarks.Text);

string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
using (SqlConnection con = new SqlConnection(connectionString))
{
    SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Students WHERE ID = @TargetID", con);
    adapter.SelectCommand.Parameters.AddWithValue("@TargetID", targetID);

    // 创建SqlCommandBuilder,它会基于SelectCommand自动生成更新命令
    SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);

    DataTable studentTable = new DataTable();
    adapter.Fill(studentTable);

    if (studentTable.Rows.Count > 0)
    {
        DataRow targetRow = studentTable.Rows[0];
        targetRow["Name"] = updatedName;
        targetRow["Gender"] = updatedGender;
        targetRow["Marks"] = updatedMarks;

        // 直接调用Update,CommandBuilder已经帮我们搞定了UpdateCommand
        int rowsUpdated = adapter.Update(studentTable);
        Console.WriteLine($"成功更新了 {rowsUpdated} 条记录!");
    }
    else
    {
        Console.WriteLine("未找到要更新的学生!");
    }
}

注意事项:

  • SqlCommandBuilder要求SelectCommand必须返回主键或唯一约束列(比如你的ID字段),否则无法确定要更新哪一行
  • 这种方式适合简单的单表更新,复杂的多表关联更新还是建议手动写命令

内容的提问来源于stack exchange,提问作者Rexksvii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:38:08