MS Access 中的 INSERT 语句中的语法错误

Posted

技术标签:

【中文标题】MS Access 中的 INSERT 语句中的语法错误【英文标题】:Syntax error in INSERT statement into MS Access 【发布时间】:2015-01-29 09:02:40 【问题描述】:

我在下面的 INSERT 语句中找不到语法错误。

public partial class doRegister : System.Web.UI.Page

    protected void Page_Load(object sender, EventArgs e)
    
        string str = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\database";
        using (OleDbConnection con = new OleDbConnection(str))
        using (OleDbCommand cmd = con.CreateCommand())
        
            cmd.CommandText = "INSERT INTO users (staffID,accessLevelIdD,username,password,email) VALUES (@staffID, '2', @username,@password,@email)";
            cmd.Parameters.AddWithValue("@staffID", Request.Form["staffid"]);
            cmd.Parameters.AddWithValue("@password",Request.Form["confpassword"]);
            cmd.Parameters.AddWithValue("@username", Request.Form["username"]);
            cmd.Parameters.AddWithValue("@email", Request.Form["email"]);
            con.Open();
            try
            
                cmd.ExecuteNonQuery();
                MessageBox.Show("Successfully registered!");
                Response.Redirect("Login.aspx");
            
            catch (Exception ex)
            
                Response.Write(ex.Message);
            
            finally
            
                con.Close();
            
        
    

【问题讨论】:

【参考方案1】:

似乎Password 是 OLE DB 提供程序中的 reserved keyword。将它与方括号一起使用,例如[Password]。但作为最佳实践,请将其更改为 non-reserved 字。

而且OleDbCommand 不支持命名参数。

来自documentation;

OLE DB .NET 提供程序不支持传递命名参数 SQL 语句或存储过程的参数 当 CommandType 设置为 Text 时的 OleDbCommand。在这种情况下, 必须使用问号 (?) 占位符。例如:

SELECT * FROM Customers WHERE CustomerID = ?

因此,OleDbParameter 对象添加到 OleDbParameterCollection 必须直接对应的位置 命令文本中参数的问号占位符

在文档中它说 ?必须使用,但实际上并非如此。命名参数 do 起作用,但名称无关紧要; CommandText 中参数的位置以及添加它们的顺序仍然很重要。

不要再使用AddWithValue。它可能有时会产生意想不到的结果。使用.Add() method 或者它的重载。

阅读:Can we stop using AddWithValue() already?

最后,您无需在 finally 块中使用 con.Close() 手动关闭连接,因为 using 语句会自动处理它。

顺便说一句,我不得不说,accessLevelIdD 列从它的名字来看就像一个数字类型,因为它以ID 结尾。如果是(或应该或不应该),您需要将值传递为2 而不是'2'

【讨论】:

以上是关于MS Access 中的 INSERT 语句中的语法错误的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 中的 INSERT INTO 语法错误

MS Access 使用 SQL INSERT INTO - SELECT FROM 插入记录

MS Access 的 SQL INSERT INTO 语句

“INSERT INTO 中的语法错误”ms-access vb.net [重复]

asp.net 中的 INSERT INTO 语句中的语法错误

MS Access 2003 - Unbound Form 使用 INSERT 语句保存到表中;子表单呢?