You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:54:27