C#执行SQL插入操作时报System.Data.SqlClient.SqlException异常如何解决
错误原因及修复方案
- SQL语法错误:SQL Server 不支持直接使用带空格的标识符,无论是列名还是参数名:
- 你代码里INSERT语句的列名带空格,必须用方括号
[]包裹才能被正确识别 - 参数名不允许包含空格,需要调整为无空格的命名格式(例:把
@Registration Number改成@RegistrationNumber)
- 你代码里INSERT语句的列名带空格,必须用方括号
- 逻辑错误:代码调用了两次
cmd.ExecuteNonQuery(),会导致同一条记录被重复插入两次 - 资源泄漏风险:未手动释放数据库连接、命令对象,长期运行会耗尽数据库连接池资源,建议使用
using语句自动完成资源释放
修正后的代码
private void btnInsert_Click(object sender, EventArgs e) { // 使用using自动释放连接资源 using (SqlConnection conn = new SqlConnection(@"Data Source=TS-G5\SQLEXPRESS;Initial Catalog=EsoftProj;Integrated Security=True")) using (SqlCommand cmd = new SqlCommand(@"INSERT INTO SES ([Registration Number], [Student Name], [Date of Birth], Gender, [Contact Number], [Course enrolled in]) VALUES (@RegistrationNumber, @StudentName, @DateOfBirth, @Gender, @ContactNumber, @CourseEnrolledIn)", conn)) { conn.Open(); // 参数名去掉空格,和SQL语句里的占位符一一对应 cmd.Parameters.Add("@RegistrationNumber", SqlDbType.Text).Value = RegNumTB.Text; cmd.Parameters.Add("@StudentName", SqlDbType.Text).Value = StudentNameTB.Text; cmd.Parameters.Add("@DateOfBirth", SqlDbType.Date).Value = DoBPick.Value.Date; cmd.Parameters.Add("@Gender", SqlDbType.Text).Value = GMale.Checked ? "Male" : "Female"; cmd.Parameters.Add("@ContactNumber", SqlDbType.Text).Value = ContactNumTB.Text; cmd.Parameters.Add("@CourseEnrolledIn", SqlDbType.Text).Value = CourseEnrSel.GetItemText(CourseEnrSel.SelectedItem); // 只执行一次插入,用变量接收影响行数 int affectedRows = cmd.ExecuteNonQuery(); if (affectedRows > 0) { MessageBox.Show("Record inserted"); } else { MessageBox.Show("Record failed"); } } }
排查小提示
后续遇到SqlException时,可以加try-catch块捕获异常,打印ex.Message即可看到具体的错误原因,比如是语法错误、权限不足还是连接失败,比单纯的异常类型提示更有参考价值。
内容的提问来源于stack exchange,提问作者Zass
相关产品推荐
相关产品推荐

