WinForms文本框数据插入Access数据库时INSERT语句语法错误排查
问题分析与解决
直接触发语法错误的原因
你的INSERT语句里多了一个不必要的+符号——这个是C#里的字符串拼接符,但你错误地把它写到了SQL语句内部,SQL语法里INSERT INTO ...和VALUES之间不需要任何连接符,直接连写即可。
更关键的隐患:SQL注入与潜在语法问题
就算去掉加号,直接拼接用户输入的文本仍会有严重问题:如果用户输入的内容包含单引号(比如名字是O'Neil),会直接打断SQL语句结构引发语法错误,同时还存在SQL注入的安全风险。必须使用参数化查询彻底解决这两个问题。
修正后的代码
private void btncreate_Click(object sender, EventArgs e) { // 使用using语句自动管理连接和命令的生命周期,避免资源泄漏 using (OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=chessclub.accdb")) { con.Open(); // 参数化SQL语句,规避注入风险和语法错误 string sql = "INSERT INTO chess1db(names, schoolid, major, gender) VALUES (@Name, @SchoolId, @Major, @Gender)"; using (OleDbCommand cmd = new OleDbCommand(sql, con)) { // 为参数赋值,对应文本框内容 cmd.Parameters.AddWithValue("@Name", txtname.Text); cmd.Parameters.AddWithValue("@SchoolId", txtid.Text); cmd.Parameters.AddWithValue("@Major", txtmajor.Text); cmd.Parameters.AddWithValue("@Gender", txtgndr.Text); cmd.ExecuteNonQuery(); MessageBox.Show("Record submitted"); } } }
额外优化建议
- 不要使用静态的
OleDbConnection和OleDbCommand对象,数据库连接应该随用随创建,并用using自动释放,避免连接泄漏和多线程冲突问题。
内容的提问来源于stack exchange,提问作者Allan Sharad
相关产品推荐
相关产品推荐

