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

时间:2015-01-29 09:02:41

标签: c# ms-access oledb oledbcommand

我无法在以下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 个答案:

答案 0 :(得分:3)

似乎Password是OLE DB提供程序中的reserved keyword。与[Password]之类的方括号一起使用。但作为最佳做法,请将其更改为非保留字。

并且OleDbCommand不支持命名参数。

来自documentation;

  

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'