C#通过OleDb操作Access执行INSERT语句报语法错误如何解决
问题根因
你遇到的Syntax error in INSERT INTO statement异常,直接触发原因是:SQL语句中使用的表名USER、字段名PASSWORD都是Microsoft Jet OLEDB引擎的内置保留关键字,未做特殊标记的情况下,引擎会将其识别为语法关键字而非你自定义的表、字段名,直接导致解析失败。
除此之外你的代码还存在两个隐患:
- 采用字符串拼接方式构造SQL,只要输入内容包含单引号等特殊字符,就会破坏SQL语法结构,同时存在严重SQL注入风险
- 手动维护全局连接对象的开关状态,一旦执行过程中抛出异常,会出现连接未释放、状态异常的问题
修复后可直接运行的代码
// 建议将连接字符串写到配置文件统一维护,此处仅做演示 private const string ConnStr = @"provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Joker\Desktop\LOGIN_DB.mdb"; private void button1_Click(object sender, EventArgs e) { // 用using块自动释放连接、命令资源,不需要手动维护全局连接的Open/Close状态 using (OleDbConnection Con = new OleDbConnection(ConnStr)) { // 保留关键字必须用方括号包裹,OleDb参数化查询用?作为顺序占位符 string query = "INSERT INTO [USER] ([USERNAME], [PASSWORD]) VALUES (?, ?)"; using (OleDbCommand Cmd = new OleDbCommand(query, Con)) { // 严格按照SQL中字段的顺序传入参数,OleDb驱动不支持具名参数匹配 Cmd.Parameters.AddWithValue("@username", TEXTBOX1.TEXT); Cmd.Parameters.AddWithValue("@pwd", TEXTBOX2.TEXT); Con.Open(); Cmd.ExecuteNonQuery(); } } }
注意事项
- Access的OleDb驱动参数化查询按传入顺序匹配占位符,和参数名无关,必须和SQL里的字段顺序一一对应
- 所有用到Access保留关键字作为表名、字段名的场景,都必须用方括号
[]包裹标识符,否则会持续触发语法错误 - 不要使用全局共享的数据库连接对象,
using块会在代码执行完后自动关闭连接、释放资源,比手动调用Close()更可靠,不会出现异常时连接泄漏的问题 - Microsoft.Jet.OLEDB.4.0是32位驱动,如果运行时抛出驱动未找到的异常,需要将项目的生成目标平台修改为x86,不能用Any CPU或者x64配置。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

