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

ExecuteNonQuery函数抛出异常:C#日历项目SQL插入失败求助

问题排查:MS SQL ExecuteNonQuery触发异常导致程序终止

我正尝试操作MS SQL数据库,但ExecuteNonQuery函数触发异常导致程序终止。我正在开发一个可保存预约的简易日历项目,以此熟悉C#(此前使用经验较少,若有低级错误请见谅)。

触发异常的代码:

using System.Data.SqlClient;

namespace Kalender
{
    public partial class EventForm : Form
    {
        public EventForm()
        {
            InitializeComponent();
        }

        public string conString = "Data Source=WS-UN-010122;Initial Catalog=calender;Integrated Security=True";

        private void EventForm_Load(object sender, EventArgs e)
        {
            txtdat.Text = UserControlDays.static_tag + "." + Form1.static_monat + "." + Form1.static_jahr;
        }

        private void btnsave_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(conString);
            con.Open();
            string sql = "INSERT INTO tbl_calender(Ereignis,Datum)values(?,?)";
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandText = sql;
            cmd.Parameters.AddWithValue("Ereignis", txtevent.Text);
            cmd.Parameters.AddWithValue("Datum", txtdat.Text);
            cmd.ExecuteNonQuery(); // <--------- Exception
            MessageBox.Show("gespeichert");
            cmd.Dispose();
            con.Close();
        }
    }
}

异常原因及解决方法:

  • 参数占位符错误:MS SQL Server的SqlClient组件要求用@作为参数占位符,而非代码中的?,这会直接导致SQL语法错误。
  • 日期类型不匹配:如果数据库中Datum字段是datetime/date类型,直接传入字符串格式的日期(如dd.MM.yyyy)会引发类型转换异常,数据库无法正确解析该字符串。
  • 资源未安全释放:当前代码未处理异常场景下的连接/命令资源释放,容易造成数据库连接泄漏。

修正后的代码:

using System.Data.SqlClient;

namespace Kalender
{
    public partial class EventForm : Form
    {
        public EventForm()
        {
            InitializeComponent();
        }

        // 用readonly修饰连接字符串,避免被意外修改
        private readonly string conString = "Data Source=WS-UN-010122;Initial Catalog=calender;Integrated Security=True";

        private void EventForm_Load(object sender, EventArgs e)
        {
            txtdat.Text = $"{UserControlDays.static_tag}.{Form1.static_monat}.{Form1.static_jahr}";
        }

        private void btnsave_Click(object sender, EventArgs e)
        {
            // 使用using语句自动管理连接资源,异常时也能确保释放
            using (SqlConnection con = new SqlConnection(conString))
            {
                con.Open();
                // 替换参数占位符为@,符合MS SQL规范
                string sql = "INSERT INTO tbl_calender(Ereignis,Datum) VALUES (@Ereignis, @Datum)";
                // using包裹SqlCommand,自动释放命令资源
                using (SqlCommand cmd = new SqlCommand(sql, con))
                {
                    cmd.Parameters.AddWithValue("@Ereignis", txtevent.Text);
                    
                    // 解析日期字符串为DateTime类型,确保与数据库字段类型匹配
                    if (DateTime.TryParseExact(txtdat.Text, "d.M.yyyy", null, System.Globalization.DateTimeStyles.None, out DateTime eventDate))
                    {
                        cmd.Parameters.AddWithValue("@Datum", eventDate);
                        cmd.ExecuteNonQuery();
                        MessageBox.Show("gespeichert");
                    }
                    else
                    {
                        MessageBox.Show("Ungültiges Datumsformat!");
                    }
                }
            }
        }
    }
}

关键修改说明:

  1. 将SQL语句中的?替换为@前缀的参数名,匹配SqlClient的参数传递规则。
  2. 增加DateTime.TryParseExact解析日期字符串,确保传入数据库的是标准DateTime类型,同时能提示用户日期格式是否合法。
  3. 使用using语句包裹SqlConnection和SqlCommand,自动处理资源释放,避免连接泄漏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:24:22