INSERT INTO 语句中的语法错误在 Access 中插入

Syntax error in INSERT INTO statement Insert in Access

我用access2016数据库在c sharp中创建了一个Accounts Project,在这个项目中我想在​​用户管理表单中输入用户数据,当我点击保存按钮时出现这个错误

"System.Data.OleDb.OleDbException: Syntax error in INSERT INTO statement" in c#.

这是我的代码;

public partial class frmUsers : MetroFramework.Forms.MetroForm
{
    OleDbConnection con = new OleDbConnection(ConfigurationManager.AppSettings ["con"]);
    OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\DataBase.accdb;");

    public frmUsers()
    {
        InitializeComponent();
    }


    private void btnSave_Click(object sender, EventArgs e)
    {
        //string InsertPur= "insert into [Users] (UserCode,UserName,UserID,Password,Designation,ContactNo,UserType) values (" + txtUserCode.Text + ", '" + txtUserName.Text + "','" + txtUserID.Text + "','" + txtPassword.Text + "','" + txtDesignation.Text + "'," + txtContactNo.Text + ",'" + cboxUserType.Text + "')";
        OleDbDataAdapter da = new OleDbDataAdapter("insert into Users(UserCode,UserName,UserID,Password,Designation,ContactNo,UserType) values (" + txtUserCode.Text + ", '" + txtUserName.Text + "', '" + txtUserID.Text + "', '" + txtPassword.Text + "', '" + txtDesignation.Text + "', " + txtContactNo.Text + ", '" + cboxUserType.Text + "')", con);

        DataSet ds = new DataSet();
        da.Fill(ds);    //**Error Pointed here**
        ViewData();

        clearData();
        txtUserName.Focus();
    }
}

您在某些文本框周围遗漏了单引号,例如 txtUserCode 并且...应该是 '" + txtUserCode + "'。 但是,您应该始终使用 parameterized queries 来避免 SQL 注入。您的代码应该是这样的:

OleDbDataAdapter da = new OleDbDataAdapter("insert into Users(UserCode,UserName,...) values"
                                                  + " (@UserCode,@UserName,...)", con);
da.InsertCommand.Parameters.AddWithValue("@UserCode", txtUserCode.Text);
//Other parameters

虽然直接指定类型并使用 Value 属性 比 AddWithValue 更好。

Can we stop using AddWithValue() already?

密码 是 Access SQL 中的保留字,因此在您的字符串中使用 [Password]

您的代码存在格式错误,如果与您的真实代码相同,则应予以修复:

在您的文本框中,您需要像这样在 txtUserCode 周围添加单引号,否则它不会被注册为整个参数

'" + txtUserCode + "'

你真的不应该将你的数据直接放入你的查询中,因为它会导致安全问题并且人们将 sql 注入其中。当 possible.Here 是某种原因时,请尝试使用参数化查询。

Why do we always prefer using parameters in SQL statements?

  • 您需要使用参数。始终指定数据类型并传递参数值以匹配架构存储(如果正在存储整数,则将整数作为值传递)。如果适用,请始终指定列的架构存储长度,例如 string/varchar.
  • 您需要对列名进行转义,以便使用保留字不会导致错误。
  • 您不应该在不使用连接时保持打开状态。
  • (设计)切勿以纯文本形式存储密码。
  • 对于插入语句,不需要使用数据适配器,直接使用命令对象。

对于 Microsoft Access,参数是基于位置的而不是命名的,您应该使用 ? 作为占位符符号,尽管如果您使用名称参数,代码也可以工作,前提是它们的顺序相同。

请参阅 [OleDbCommand.Parameters 属性][1]

的文档

Remarks

The OLE DB .NET Provider does not support named parameters for passing parameters to an SQL statement or a stored procedure called by an OleDbCommand when CommandType is set to Text. In this case, the question mark (?) placeholder must be used. For example:

SELECT * FROM Customers WHERE CustomerID = ?

Therefore, the order in which OleDbParameter objects are added to the OleDbParameterCollection must directly correspond to the position of the question mark placeholder for the parameter in the command text.

请确保包括将使用参数的预期模式类型和模式长度(如果适用)。

我还建议您始终在实例周围使用 using 语句,其中类型实现 IDisposable 就像 OleDbConnection 这样即使抛出异常也始终关闭连接代码。

更改代码:我猜到了数据类型和长度,你应该根据模式修正那些

using (var conn = new OleDbConnection(connectionStringHere))
using (var cmd = conn.CreateCommand())
{
    cmd.CommandText = "INSERT INTO Users([UserCode],[UserName],[UserID],[Password],[Designation],[ContactNo],[UserType]) VALUES (?,?,?,?,?,?,?)";

    cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 100) {Value = txtUserCode.Text});
    cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 100) {Value = txtUserName.Text});
    cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 100) {Value = txtUserID.Text});
    cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 100) {Value = txtPassword.Text});
    cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 100) {Value = txtDesignation.Text});
    cmd.Parameters.Add(new OleDbParameter("?", OleDbType.Integer) {Value = int.Parse(txtContactNo.Text) });
    cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 100) {Value = cboxUserType.Text});

    conn.Open();
    var numberOfRowsInserted = cmd.ExecuteNonQuery();
}