点击保存按钮触发System.Data.SqlClient.SqlException语法错误求助
修复SqlException语法错误及代码优化
问题分析
- SQL语法错误:
values子句中存在连续逗号(@OTHER,,@GOZAR,,@ID),这是触发语法错误的直接原因。 - 字段与参数顺序不匹配:INSERT语句的字段列表顺序是
ID,NAME,INNUM,...GOZAR,但参数列表顺序从@NAME开头、最后才是@ID,会导致数据插入到错误字段。 - 全局命令复用问题:全局声明的
SqlCommand会在多次点击保存时重复添加参数,引发后续执行异常。 - IP参数控件匹配问题:字段
IP对应的参数值用了IP2.Text,需确认控件是否正确。
修复后的完整代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using DevComponents.DotNetBar; using System.Data.SqlClient; namespace itfamco { public partial class frminfo : OfficeForm { public frminfo() { InitializeComponent(); } // 提取连接字符串,便于维护 private readonly string _connectionString = @"Data Source=ABDOLI;Initial Catalog=FORM;User ID=sa;Password=Pass1921"; private void frminfo_Load(object sender, EventArgs e) { } private void btnsave_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(ID.Text)) { MessageBox.Show("لطفا کد را واردکنید"); return; } // 使用using自动释放数据库资源,避免泄漏 using (SqlConnection con = new SqlConnection(_connectionString)) using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = con; // 修正SQL语句:移除多余逗号,调整参数顺序与字段列表一致 cmd.CommandText = @"INSERT INTO TIT(ID, NAME, INNUM, TNUM, PHONENUM, IP, MAC, BOS, MONITOR, MK, PHONE, PRINTER, TPHONE, JOB, OTHER, GOZAR) VALUES(@ID, @NAME, @INNUM, @TNUM, @PHONENUM, @IP, @MAC, @BOS, @MONITOR, @MK, @PHONE, @PRINTER, @TPHONE, @JOB, @OTHER, @GOZAR)"; // 按字段顺序添加参数,确保数据对应正确 cmd.Parameters.AddWithValue("@ID", int.Parse(ID.Text)); cmd.Parameters.AddWithValue("@NAME", string.IsNullOrEmpty(NAME.Text) ? (object)DBNull.Value : NAME.Text); cmd.Parameters.AddWithValue("@INNUM", string.IsNullOrEmpty(INNUM.Text) ? (object)DBNull.Value : INNUM.Text); cmd.Parameters.AddWithValue("@TNUM", string.IsNullOrEmpty(TNUM.Text) ? (object)DBNull.Value : TNUM.Text); cmd.Parameters.AddWithValue("@PHONENUM", string.IsNullOrEmpty(PHONENUM.Text) ? (object)DBNull.Value : PHONENUM.Text); cmd.Parameters.AddWithValue("@IP", string.IsNullOrEmpty(IP2.Text) ? (object)DBNull.Value : IP2.Text); cmd.Parameters.AddWithValue("@MAC", string.IsNullOrEmpty(MAC.Text) ? (object)DBNull.Value : MAC.Text); cmd.Parameters.AddWithValue("@BOS", string.IsNullOrEmpty(BOS.Text) ? (object)DBNull.Value : BOS.Text); cmd.Parameters.AddWithValue("@MONITOR", string.IsNullOrEmpty(MONITOR.Text) ? (object)DBNull.Value : MONITOR.Text); cmd.Parameters.AddWithValue("@MK", string.IsNullOrEmpty(MK.Text) ? (object)DBNull.Value : MK.Text); cmd.Parameters.AddWithValue("@PHONE", string.IsNullOrEmpty(PHONE.Text) ? (object)DBNull.Value : PHONE.Text); cmd.Parameters.AddWithValue("@PRINTER", string.IsNullOrEmpty(PRINTER.Text) ? (object)DBNull.Value : PRINTER.Text); cmd.Parameters.AddWithValue("@TPHONE", string.IsNullOrEmpty(TPHONE.Text) ? (object)DBNull.Value : TPHONE.Text); cmd.Parameters.AddWithValue("@JOB", string.IsNullOrEmpty(JOB.Text) ? (object)DBNull.Value : JOB.Text); cmd.Parameters.AddWithValue("@OTHER", string.IsNullOrEmpty(OTHER.Text) ? (object)DBNull.Value : OTHER.Text); cmd.Parameters.AddWithValue("@GOZAR", string.IsNullOrEmpty(GOZAR.Text) ? (object)DBNull.Value : GOZAR.Text); con.Open(); cmd.ExecuteNonQuery(); MessageBox.Show("ثبت انجام شد"); } // using块结束自动关闭连接 } private void groupPanel3_Click(object sender, EventArgs e) { } private void PHONENUM_TextChanged(object sender, EventArgs e) { } } }
额外优化说明
- 用
using语句管理SqlConnection和SqlCommand,确保数据库资源及时释放。 - 替换空字符串判断为
string.IsNullOrEmpty,逻辑更严谨。 - 调整参数添加顺序与SQL字段顺序一致,彻底避免数据错位问题。
内容的提问来源于stack exchange,提问作者Captain AR
相关产品推荐
相关产品推荐

