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

我在以下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(); } } } } 

似乎Password是OLE DB提供程序中的保留关键字 。 使用方括号,如[Password] 。 但作为最佳实践,请将其更改为非保留字。

OleDbCommand不支持命名参数。

从文件 ;

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

SELECT * FROM Customers WHERE CustomerID =?

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

在文档中它说 必须使用,实际上 ,它不是。 命名参数确实有效,但名称无关紧要; 它仍然是CommandText参数的位置以及重要的添加顺序。

并且不要再使用AddWithValue了。 有时可能会产生意外结果。 使用.Add()方法或它的重载。

阅读: 我们可以停止使用AddWithValue()吗?

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

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