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

点击保存按钮触发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:40:54