c# - 使用 OleDbCommandBuilder 时 Access SQL 语法错误

标签 c# ms-access oledb

我打算在 C# 中使用 OleDbDataAdapter 在 Access 数据库中插入数据,但我收到一条错误消息 INSERT INTO 命令中的语法错误

BackgroundWorker worker = new BackgroundWorker();
OleDbDataAdapter dbAdapter new OleDbDataAdapter();
OleDbConnection dbConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\PMS.mdb");
worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += InsertJob;
worker.ProgressChanged += InsertJobCompleted;
worker.RunWorkerAsync(args);

InsertJob 函数是:

private void InsertJob(object sender, DoWorkEventArgs e)
{
     var args = (InsertJobArgs)e.Argument;
     try
        {
            dbAdapter.SelectCommand = new OleDbCommand("SELECT * FROM Sheet", dbConnection);                
            dbAdapter.Fill(args.DataTable);
            var builder = new OleDbCommandBuilder(dbAdapter);
            var row = args.DataTable.NewRow();

            row["UserName"] = args.Entry.UserName;
            row["Password"] = args.Entry.Password;
            args.DataTable.Rows.Add(row);

            dbAdapter.InsertCommand = builder.GetInsertCommand();               
            dbAdapter.Update(args.DataTable);
            builder.Dispose();
        }
        catch (Exception ex)
        {
            args.Exception = ex;
            worker.ReportProgress(0, args);
            return;
        }
        worker.ReportProgress(100, args);
}

我收到在线错误:dbAdapter.Update(args.DataTable);

我尝试用 visual studio 调试它,发现所有 InsertCommand 参数值都是 null

我尝试在调用 dbAdapter.Update(args.DataTable);

之前通过这段代码手动插入它
dbAdapter.InsertCommand.Parameters[0].Value = args.Entry.UserName;
dbAdapter.InsertCommand.Parameters[1].Value = args.Entry.Password;

最佳答案

试试这个:

紧接在行之后

var builder = new OleDbCommandBuilder(dbAdapter);

添加两行

builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";

这将告诉 OleDbCommandBuilder 将表名和列名括在方括号中,生成如下所示的 INSERT 命令

INSERT INTO [TableName] ...

而不是默认形式

INSERT INTO TableName ...

如果任何表名或列名包含空格或“有趣”字符,或者它们恰好是 Access SQL 中的保留字,则需要方括号。 (在你的情况下,我怀疑你的表有一个名为 [Password] 的列,并且 PASSWORD 是 Access SQL 中的保留字。)

关于c# - 使用 OleDbCommandBuilder 时 Access SQL 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32020070/

相关文章:

c# - 通过C#从Arduino读取串行数据

c# - 使用 Linq 从 3 个集合创建项目

ms-access - 数据宏: Using default values if LookupRecord does not find a match

C# Oledb like 语句不返回任何结果

c# - 如何在我的程序中使用 .NET 类型字符串?

c# - 将 Jasig 的中央身份验证服务 (CAS) 与 ASP.NET MVC 一起使用 4/5

vba - 将文本框控件传递给专用子功能

ms-access - Access - 从表单中的图像控件导出图像

c# - OleDbConnection 获取 "External component has thrown an exception."

sql-server - OLEDE错误: Login failed for user 'DOMAIN\ComputerName$' .;28000