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); } }
改动说明
- 先把你输入的内容按逗号/换行拆分,每个工单编号去掉前后空格,把内容里的单引号换成两个单引号(避免SQL语法错误),还加了去重,避免重复输入同一个工单号
- 只有拿到有效工单编号的时候才执行更新,空输入会弹出提示
- 同时更新两个表,和你原来Button2的逻辑保持一致,不会漏更数据
- 删掉了没用的@search参数,因为我们已经把所有要更新的工单编号直接拼到IN括号里了,不需要这个参数
- 提示语会显示实际更新了多少个工单,方便你确认是否生效
注意:当前直接拼接SQL的写法如果是公开访问的系统会有SQL注入风险,如果你的系统只是内部员工使用、没有外部人员访问的话可以正常用,后续如果要优化安全性可以再改成参数化IN的写法。
内容的提问来源于stack exchange,提问作者diglife
相关产品推荐
相关产品推荐

