2013-10-24 7 views
3

Я собираюсь вставить данные в базу данных Access с использованием OleDbDataAdapter в C#, но я получил сообщение об ошибке с сообщением Ошибка синтаксиса в INSERT INTO CommandAccess ошибка синтаксиса SQL при использовании OleDbCommandBuilder

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);

я пытался отладить с VI СУАЛ студии и обнаружили, что все значения InsertCommand параметры являются null

И я попытался вставить его вручную этот код перед вызовом dbAdapter.Update(args.DataTable);

dbAdapter.InsertCommand.Parameters[0].Value = args.Entry.UserName; 
dbAdapter.InsertCommand.Parameters[1].Value = args.Entry.Password; 

ответ

13

Попробуйте это:

Сразу после того, как линии

var builder = new OleDbCommandBuilder(dbAdapter); 

добавить две линии

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

Что скажет OleDbCommandBuilder обернуть имена таблиц и столбцов в квадратных скобках, производя команду ВСТАВИТЬ как

INSERT INTO [TableName] ... 

вместо формы по умолчанию

INSERT INTO TableName ... 

квадратные скобки требуется, если любые имена таблиц или столбцов содержат пробелы или «смешные» символы, или если они являются зарезервированными словами в Access SQL. (В вашем случае я подозреваю, что в вашей таблице есть столбец с именем [Пароль], а PASSWORD является зарезервированным словом в Access SQL.)

Смежные вопросы