将DataGridView数据插入SQL Server数据库时遇SqlException语法错误求助
问题根源:SQL语句缺少闭合括号
你遇到的SqlException完全是因为INSERT语句的语法错误——看你写的SQL字符串:
INSERT INTO Tbl_Order(Name, Price, Quantity, Total) values(@Name, @Price, @Qty, @Total
注意到最后@Total后面少了一个闭合的)!数据库引擎解析到这里无法识别完整的语句,所以抛出了"Incorrect syntax near '@Total'"的错误。
修正后的代码&优化建议
除了补上括号,我还建议你用using块来管理数据库连接和命令对象,这样可以自动释放资源,避免手动关闭连接时可能出现的泄漏问题(比如代码抛出异常时con.Close()可能不会执行):
// 用using自动管理连接生命周期 using (SqlConnection con = new SqlConnection("Data Source=DESKTOP-R34C6VV\\SQL;Initial Catalog=Student_Databse_2019_HW1;Integrated Security=True")) { con.Open(); // 把SqlCommand也放进using块,自动释放资源 using (SqlCommand cmd = new SqlCommand("INSERT INTO Tbl_Order(Name, Price, Quantity, Total) VALUES(@Name, @Price, @Qty, @Total)", con)) { // 提前定义参数,避免循环内重复创建 cmd.Parameters.Add("@Name", SqlDbType.VarChar, 50); cmd.Parameters.Add("@Price", SqlDbType.Int); cmd.Parameters.Add("@Qty", SqlDbType.Int); cmd.Parameters.Add("@Total", SqlDbType.Int); for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) { // 注意:要确保单元格值不是DBNull,避免类型转换错误 var row = dataGridView1.Rows[i]; cmd.Parameters["@Name"].Value = row.Cells[0].Value ?? DBNull.Value; cmd.Parameters["@Price"].Value = row.Cells[1].Value != null ? Convert.ToInt32(row.Cells[1].Value) : DBNull.Value; cmd.Parameters["@Qty"].Value = row.Cells[2].Value != null ? Convert.ToInt32(row.Cells[2].Value) : DBNull.Value; cmd.Parameters["@Total"].Value = row.Cells[3].Value != null ? Convert.ToInt32(row.Cells[3].Value) : DBNull.Value; cmd.ExecuteNonQuery(); } } } dataGridView1.Rows.Clear();
额外提醒
- 我把参数的定义移到了循环外面,这样不用每次循环都重新创建参数,效率更高
- 增加了对
DBNull的判断,避免DataGridView单元格为空时出现类型转换异常 - 明确指定了参数的
SqlDbType,比AddWithValue更安全(AddWithValue可能会因为自动推断类型导致性能或转换问题)
内容的提问来源于stack exchange,提问作者Mhamad Commander
相关产品推荐
相关产品推荐

