我无法在以下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();
}
}
}
}
答案 0 :(得分:3)
似乎Password
是OLE DB提供程序中的reserved keyword。与[Password]
之类的方括号一起使用。但作为最佳做法,请将其更改为非保留字。
并且OleDbCommand
不支持命名参数。
OLE DB .NET提供程序不支持传递的命名参数 SQL语句或由a调用的存储过程的参数 CommandType设置为Text时的OleDbCommand。在这种情况下, 必须使用问号(?)占位符。例如:
SELECT * FROM Customers WHERE CustomerID =?
因此,将OleDbParameter对象添加到的顺序 OleDbParameterCollection 必须直接对应于的位置 命令文本中参数的问号占位符。
在文档中说?必须使用但实际,事实并非如此。命名参数做有效,但名称无关紧要;它仍然是CommandText
中参数的位置以及它们被添加的顺序。
不要再使用AddWithValue
了。 可能有时会产生意外结果。使用.Add()
method或它的重载。
阅读:Can we stop using AddWithValue()
already?
最后,您无需在con.Close()
块中使用finally
手动关闭连接,因为using
语句会自动处理它。
顺便说一句,我不得不说,accessLevelIdD
列听起来像是一个数字类型,因为它以ID
结尾。如果是(或应该或不应该),则需要将值传递为2
而不是'2'
。