Visual C#.NET错误:System.Data.dll中发生未处理的“System.Data.OleDb.OleDbException”类型异常

时间:2017-03-23 11:06:06

标签: c# database ms-access oledb oledbdataadapter

美好的一天,大家。我是visual c#.net的新手。我正在使用OleDb,这是用于MS Access数据库。我在插入数据到MS Access数据库时遇到问题,我不知道这里有哪个错误。在我的理论中,我的算法是如何构造糟糕的。我一直收到这个OleDb异常错误,这是“附加信息:INSERT INTO语句中的语法错误。”

这是我的代码:

我的数据库表中有3个字段,称为“usersTable”。其中包括:user_name,password和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;
}

1 个答案:

答案 0 :(得分:1)

您需要更改构建OleDbCommandBuilder的行。

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

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

当然,您也可以更改该列名称并删除问题的所有来源。

顺便说一句,我强烈建议没有一个全局类来保持所有变量在程序的生命周期中保持活着状态。它们将成为您计划的持久麻烦源。连接未关闭和处理,具有先前使用参数和文本的命令,更改其配置的适配器等等。最好在需要时实例化这些对象并在之后销毁它们。在性能方面不是一个很大的成本