由于“SQL 语法”错误,无法插入 MS Access [关闭]

Posted

技术标签:

【中文标题】由于“SQL 语法”错误,无法插入 MS Access [关闭]【英文标题】:Unable to insert into MS Access due to an "SQL Syntax" error [closed] 【发布时间】:2014-12-23 20:05:05 【问题描述】:

我正在尝试插入 MS Access,但在“SQL 语法”中出现错误。

我相信“密码”这个词是一个关键字。有没有办法在不更改数据库字段名称的情况下解决这个问题?

OleDbCommand cmd = new OleDbCommand("INSERT INTO profiles(
     user_name, full_name, password, profile_id) 
     VALUES (@user_name, @full_name, @password, @profile_id);");

cmd.Parameters.AddWithValue("@full_name", this.FullName);
cmd.Parameters.AddWithValue("@user_name", this.UserName);
cmd.Parameters.AddWithValue("@password", this.Password);
cmd.Parameters.AddWithValue("@profile_id", this.ProfileID);

编辑:

上面的代码有一个错字,我现在已经修正了。它没有出现在原始代码中,而是在我在这里编辑后出现的。正如许多人指出的那样,解决方法是括号。

【问题讨论】:

YouAreSalty 你有没有检查过你的插入语句如果你要添加一个参数,它的名字必须匹配这是没有道理的 @DJKRAZE 在 OleDb 中他们没有。只有参数的顺序很重要。 LarsTech 好点.. 我已经习惯使用 OracleParams 和 SqlParams,我真的认为这无关紧要.. 好收获 @Grant Winney 下次会做。我知道问题出在哪里,但我想有时我“知道”的可能是错的...... 如果操作员修复了他的代码示例,我认为这是一个有效的问题。访问不像其他 sql 环境那样宽松,并且知道与关键字相同的列名周围的括号可能对其他人有所帮助。 【参考方案1】:

将字段名称括在方括号中。

@passwords@password 之间的不匹配无关紧要,因为在将 OleDb 与 Access 一起使用时会忽略参数名称。但是,您必须按照它们在INSERT 语句中出现的顺序提供参数值 --- 所以 @user_name@full_name 之前:

    OleDbCommand cmd = new OleDbCommand("INSERT INTO profiles(user_name, full_name, [password], profile_id) VALUES (@user_name, @full_name, @passwords, @profile_id);");

    cmd.Parameters.AddWithValue("@user_name", this.UserName);
    cmd.Parameters.AddWithValue("@full_name", this.FullName);
    cmd.Parameters.AddWithValue("@password", this.Password);
    cmd.Parameters.AddWithValue("@profile_id", this.ProfileID);

从 cmets 看来,我们似乎对 password 是否是 MS Access 中的保留字存在分歧。根据微软的说法,它是一个保留字:List of reserved words in Jet 4.0

【讨论】:

顺序真的重要吗?我认为 ADO.NET 会足够聪明地重新排列参数。 是的,由于OleDb(带有MS Access)忽略了参数names,它只能使用它们的位置来将参数值与SQL中的参数“place-holders”进行匹配声明。【参考方案2】:

您可以将数据库字段放在引号或方括号中:

[password] "password"

例如:

"INSERT INTO profiles(user_name, full_name, [password], profile_id)

【讨论】:

这不是这里的问题。 @KenWhite,鉴于 OP 显示的代码,错误是 SQL Syntax 错误,这是唯一可能出现的地方。其他任何事情都需要更多代码才能准确重现问题。 @ps2goat Grant 在他的评论中指出了实际问题 OP's 案例中存在 2 个问题。也许 OP 自己没有抽查自己的查询字符串。@password and @passwords OP 帖子中的问题是password@passwords 之间的拼写错误。我没有说你的答案是错误的(这就是我没有投反对票的原因);我只是注意到这不是这里的问题,因为添加这些括号不会解决问题。

以上是关于由于“SQL 语法”错误,无法插入 MS Access [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将日期插入数据库时​​出现 SQL 语法错误(框架:codeigniter)

无法使用 c#“第 1 行的 SQL 语法错误”将数据从 Ms Access 迁移到 MySQL 工作台

错误:ER_PARSE_ERROR:您的 SQL 语法有错误;

运行时错误 3032,无法执行此操作 ms-access

SQL语法错误:无法将 NULL值插入列'',该列不允许空值。INSERT失败。怎么解决啊

MS Access SQL 语法错误