Visual C#.NET ERROR: An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll

Visual C#.NET ERROR: An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll

大家好。我是 visual c#.net 的新手。我正在使用用于 MS Access 数据库的 OleDb。我在向 MS Access 数据库中插入数据时遇到问题,我不知道这里是哪一个出了问题。在我的理论中,我的算法构造得很糟糕。我一直收到这个 OleDb 异常错误,它是 "Additional information: Syntax error in INSERT INTO statement."

这是我的代码:

我的数据库 table 中有 3 个字段,称为 "usersTable"。分别是:user_name、密码和user_type。

adduser.cs

注意:我一直在这行代码中收到错误 global.da.Update(global.ds1, "usersTable");

using System;
using System.Data;
using System.Data.OleDb;

private void dbConnect()
    {
        global.sconn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source = D:/c# programs/soer_final/User.accdb";
        global.dbConn = new OleDbConnection(global.sconn);
        global.dbCmd.Connection = global.dbConn;
        global.dbCmd.CommandText = "Select * from usersTable";
        global.da.SelectCommand = global.dbCmd;
        global.dbConn.Open();
        global.ds1.Clear();
        global.da.Fill(global.ds1, "usersTable");
    }

 private void SaveButton_Click(object sender, EventArgs e)
        {
            try { 
                dbConnect();
                DataRow dRow = global.ds1.Tables["usersTable"].NewRow();
                dRow[0] = user_name.Text;
                dRow[1] = password.Text;
                dRow[2] = user_type.Text;


                global.ds1.Tables["usersTable"].Rows.Add(dRow);
                global.da.Update(global.ds1, "usersTable");
                global.dbConn.Close();
                MessageBox.Show("User added");
            }
           catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

Program.cs

using System.Data;
using System.Data.OleDb;

public class global
{
    public static string sconn;
    public static OleDbConnection dbConn;
    public static OleDbDataAdapter da = new OleDbDataAdapter();
    public static OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
    public static OleDbCommand dbCmd = new OleDbCommand();
    public static DataSet ds1 = new DataSet();
    public static DataRow[] foundrow;
}

您需要更改构建 OleDbCommandBuilder 的行。

OleDbCommandBuilder cb = new OleDbCommandBuilder(da) 
{ QuotePrefix = "[", QuoteSuffix = "]"};

这将强制 OleDbCommandBuilder 将生成的命令(用于更新、插入和删除操作)的字段名称括在方括号中。反过来,这避免了由于在列名 (PASSWORD) 中使用保留关键字而导致的语法错误。

当然,您也可以更改该列名称并一劳永逸地删除问题的根源。

顺便说一下,我强烈建议不要使用全局 class 来让所有这些变量在程序的生命周期内保持活动状态。它们将成为您程序的持久麻烦源。未关闭和处理的连接、带有先前使用参数和文本的命令、更改其配置的适配器等。最好在需要时实例化这些对象,然后销毁它们。就性能而言,成本并不高