【问题标题】:Syntax error in INSERT statement into MS AccessMS Access 中的 INSERT 语句中的语法错误
【发布时间】: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();
            }
        }
    }
}

【问题讨论】:

    标签: c# ms-access oledb oledbcommand


    【解决方案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'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多