将记录添加到 Access 数据库时出现“INSERT INTO 语句中的语法错误”

Posted

技术标签:

【中文标题】将记录添加到 Access 数据库时出现“INSERT INTO 语句中的语法错误”【英文标题】:"Syntax error in INSERT INTO statement" when adding record to Access database 【发布时间】:2015-05-03 21:51:30 【问题描述】:

我已经搜索了几个小时来解决这个问题,但我所阅读的内容没有任何帮助。尝试将此记录添加到 Access 数据库时出现此错误。我要保存的文件名为 Cats.accdb,其中有一个名为 Cats 的表。

表格列名: CatId(类型:文本) CatName(文本) 头发(文本) 尺寸(文本) CareType(文本) 备注(文本) AdoptDate(日期/时间通用日期)、Weight(双精度)、Age(整数)(我在 C# 代码中注释了对这些列的任何引用,以尝试仅使用普通的旧文本框进行调试。起初我以为是因为与使用 DateTimePicker 有关,但在注释掉后仍然会抛出错误。)

C# 代码

Cat temp = new Cat(txtCatName.Text, txtHair.Text, txtSize.Text, txtCareType.Text, txtNotes.Text);

public string AddCat()
    
        string strFeedback = "";

        string strSQL = "INSERT INTO Cats (CatName, Hair, Size, CareType, Notes) VALUES (@CatName, @Hair, @Size, @CareType, @Notes)"; 

        OleDbConnection conn = new OleDbConnection();

        string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=Data\Cats.accdb; Persist Security Info=False;";
        conn.ConnectionString = strConn; 

        OleDbCommand comm = new OleDbCommand();
        comm.CommandText = strSQL;  
        comm.Connection = conn; 
        comm.Parameters.AddWithValue("@CatName", CatName); 
        comm.Parameters.AddWithValue("@Hair", Hair);
        comm.Parameters.AddWithValue("@Size", Size);
        comm.Parameters.AddWithValue("@CareType", CareType);
        comm.Parameters.AddWithValue("@Notes", Notes);
        //comm.Parameters.AddWithValue("@AdoptDate", AdoptDate);
        //comm.Parameters.AddWithValue("@Weight", Weight);
        //comm.Parameters.AddWithValue("@Age", Age);

        
            conn.Open();
            strFeedback = comm.ExecuteNonQuery().ToString() + " record has been added successfully!";
            conn.Close();
        
        catch (Exception err)
        
            strFeedback = "ERROR: " + err.Message;
        
        return strFeedback;

lblFeedback.Text = temp.AddCat();

感谢您提供的任何帮助!

【问题讨论】:

抱歉,我已经删除了那个标签。 谢谢(特别是@guffa)...我遇到了同样的问题,你们刚刚解决了...我桌上的一个字段是保留字(我没有不知道是哪一个,所以我所做的只是在每个字段名称中放一个括号 - 一个是“插入语句”)。像这样: string insertOnDB = "插入 [Users] ([Username],[Password],[CreatedOn],[FullName],[Gender],[AccountType],[Status])values(?,?,?,? ,?,?,?)";再次感谢您 【参考方案1】:

Size 是 reserved keyword。在名称周围添加括号以指定它是一个标识符:

string strSQL = "INSERT INTO Cats (CatName, Hair, [Size], CareType, Notes) VALUES (@CatName, @Hair, @Size, @CareType, @Notes)"; 

或者,将字段名称更改为不是关键字的名称。

【讨论】:

非常感谢!我在将其更改为 CatName 之前使用了 Name,因为它被标记为保留字,所以我什至没有想到那个(显然)。你的建议解决了我的问题!【参考方案2】:

在 MS Access OLEDB 中,我相信您使用位置标记而不是参数名称。

string strSQL = "INSERT INTO Cats (CatName, Hair, Size, CareType, Notes) VALUES (?, ?, ?, ?, ?)";

【讨论】:

No Access 接受其大表亲使用的相同参数语法。 (或者更好的是,OleDB 提供者不在乎)但这并不意味着 OleDb 可以识别这些名称并允许您更改提供值的顺序 对不起,你是对的。我查看了没有“jet”一词的连接字符串,却没有意识到它已被取代。

以上是关于将记录添加到 Access 数据库时出现“INSERT INTO 语句中的语法错误”的主要内容,如果未能解决你的问题,请参考以下文章

在依赖表上插入 Access 数据库时出现问题 [重复]

在Access 2010中运行追加查询时出现“表已存在”错误

在 MS Access VBA 中添加两个等于零的变量时出现奇怪的结果

在 Access 中附加 tabledef 时出现错误 3045 或 3356

当我尝试通过 C# 将日期插入 Access 数据库时出现“INSERT INTO 语句中的语法错误”错误

使用 Workbench 将 MS Access 迁移到 MySQL 时出现日期时间错误