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

C# web项目如何通过文本框逗号分隔值实现SQL批量UPDATE更新

问题原因

你的代码逻辑本身拼接IN语句的部分是对的,多值不生效是3个小问题导致的:

  • 你只写了Job_Master表的更新逻辑,漏了原来Button2里要同步更新的Countertops表
  • 拼接完SQL后多余添加了完全没用到的@search参数,虽然不是核心问题但属于冗余隐患
  • 没有对输入的工单编号做单引号转义,如果输入内容带单引号会直接导致SQL执行失败

修复后可直接用的代码

protected void Button3_Click(object sender, EventArgs e)
{
    // 先处理输入的工单编号,拆分+去重+去空格+转义单引号
    List<string> search = new List<string>();
    if (!string.IsNullOrEmpty(TextBox1.Text.Trim()))
    {
        char[] characters = { ',', '\n' };
        string[] ids = TextBox1.Text.Trim().Split(characters, StringSplitOptions.RemoveEmptyEntries);
        for (int i = 0; i < ids.Length; i++)
        {
            // 转义单引号避免SQL报错
            string cleanId = ids[i].Trim().Replace("'", "''");
            if(!string.IsNullOrEmpty(cleanId) && !search.Contains(cleanId))
            {
                search.Add(cleanId);
            }
        }
    }

    // 只有拿到有效工单编号才执行更新
    if(search.Count > 0)
    {
        string inCondition = "('" + string.Join("','", search.ToArray()) + "')";
        // 拼接两个表的更新SQL
        string updateJobMaster = $"Update [Job_Master] SET [Completed] = GETDATE() WHERE [job number] IN {inCondition}";
        string updateCountertops = $"Update [Countertops] SET [Completed] = GETDATE() WHERE [jobnumber] IN {inCondition}";

        vid.Open();
        // 执行两个表的更新
        SqlCommand xp4 = new SqlCommand(updateJobMaster, vid);
        xp4.ExecuteNonQuery();
        SqlCommand xp5 = new SqlCommand(updateCountertops, vid);
        xp5.ExecuteNonQuery();
        vid.Close();

        string message = $"{search.Count}个工单已标记为完成!";
        string script = "window.onload = function(){ alert('" + message + "')};";
        ClientScript.RegisterStartupScript(this.GetType(), "SuccessMessage", script, true);
    }
    else
    {
        // 输入为空的时候提示
        string script = "window.onload = function(){ alert('请输入要标记的工单编号')};";
        ClientScript.RegisterStartupScript(this.GetType(), "ErrorMessage", script, true);
    }
}

改动说明

  1. 先把你输入的内容按逗号/换行拆分,每个工单编号去掉前后空格,把内容里的单引号换成两个单引号(避免SQL语法错误),还加了去重,避免重复输入同一个工单号
  2. 只有拿到有效工单编号的时候才执行更新,空输入会弹出提示
  3. 同时更新两个表,和你原来Button2的逻辑保持一致,不会漏更数据
  4. 删掉了没用的@search参数,因为我们已经把所有要更新的工单编号直接拼到IN括号里了,不需要这个参数
  5. 提示语会显示实际更新了多少个工单,方便你确认是否生效

注意:当前直接拼接SQL的写法如果是公开访问的系统会有SQL注入风险,如果你的系统只是内部员工使用、没有外部人员访问的话可以正常用,后续如果要优化安全性可以再改成参数化IN的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:00:04