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!"); } } } } } }
关键修改说明:
- 将SQL语句中的
?替换为@前缀的参数名,匹配SqlClient的参数传递规则。 - 增加
DateTime.TryParseExact解析日期字符串,确保传入数据库的是标准DateTime类型,同时能提示用户日期格式是否合法。 - 使用
using语句包裹SqlConnection和SqlCommand,自动处理资源释放,避免连接泄漏问题。
内容的提问来源于stack exchange,提问作者markus54345
相关产品推荐
相关产品推荐

