Question posted 2013 · +3 upvotes
I am going to INSERT data in Access Database using OleDbDataAdapter in C# but i got an error with message Syntax Error in INSERT INTO Command
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);
And InsertJob Function is:
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);
}
I recieve Error on line : dbAdapter.Update(args.DataTable);
I tried to debug it with visual studio and found that All the InsertCommand Parameters Values are null
And I tried to insert it manually by this code before call to dbAdapter.Update(args.DataTable);
dbAdapter.InsertCommand.Parameters[0].Value = args.Entry.UserName;
dbAdapter.InsertCommand.Parameters[1].Value = args.Entry.Password;
Accepted answer +10 upvotes
Try this:
Immediately after the line
var builder = new OleDbCommandBuilder(dbAdapter);
add the two lines
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";
That will tell the OleDbCommandBuilder to wrap table and column names in square brackets, producing an INSERT command like
INSERT INTO [TableName] ...
instead of the default form
INSERT INTO TableName ...
The square brackets are required if any table or column names contain spaces or “funny” characters, or if they happen to be reserved words in Access SQL. (In your case, I suspect that your table has a column named [Password], and PASSWORD is a reserved word in Access SQL.)
4 code variants in this answer
- Variant 1 — 1 lines, starts with
var builder = new OleDbCommandBuilder(dbAdapter); - Variant 2 — 2 lines, starts with
builder.QuotePrefix = "["; - Variant 3 — 1 lines, starts with
INSERT INTO [TableName] ... - Variant 4 — 1 lines, starts with
INSERT INTO TableName ...
Top ms-access Q&A (6)
- How can I modify a saved Microsoft Access 2007 or 2010 Import Specification? +31 (2008)
- OleDbCommand parameters order and priority +28 (2009)
- Is there an equivalent to the SUBSTRING function in MS Access SQL? +26 (2009)
- What do I need to read Microsoft Access databases using Python? +25 (2009)
- MS Access library for python +24 (2009)
- is there any replacement of Access? +21 (2009)
ms-access solutions on this site
.