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 使用 SQL INSERT INTO - SELECT FROM 插入记录
MS Access 的 SQL INSERT INTO 语句
“INSERT INTO 中的语法错误”ms-access vb.net [重复]