使用 `OleDbDataAdapter` + `OleDbCommandBuilder` 自動產生 `INSERT`/`UPDATE`/`DELETE` 指令寫入 Access,執行時拋出:
System.Data.OleDb.OleDbException: 'INSERT INTO 陳述式的語法錯誤。'
using (var conn = new OleDbConnection(connStr))
using (var adapter = new OleDbDataAdapter("SELECT ID, [Number], Name FROM MyTable", conn))
{
var builder = new OleDbCommandBuilder(adapter)
{
QuotePrefix = "[", // 關鍵:欄位名稱前綴
QuoteSuffix = "]" // 關鍵:欄位名稱後綴
};
var ds = new DataSet();
adapter.Fill(ds, "MyTable");
var row = ds.Tables["MyTable"].NewRow();
row["Number"] = "00063"; // 保留字欄位
row["Name"] = "Test";
ds.Tables["MyTable"].Rows.Add(row);
adapter.Update(ds, "MyTable"); // 成功
}
即使 `SELECT ID, [Number], Name`,`CommandBuilder` 產生 INSERT 時**不會保留**查詢中的方括號,必須透過 `QuotePrefix/Suffix` 告知引擎「此資料源的識別碼包裹字元」。
public static OleDbCommandBuilder CreateSafeBuilder(OleDbDataAdapter adapter, string tableName)
{
var builder = new OleDbCommandBuilder(adapter);
// Access/Excel 通用方括號;SQL Server 用雙引號或括號
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";
return builder;
}
Number, Date, Time, Key, Order, Group, Desc, Asc, Index, Table, View,
Procedure, Function, Trigger, Constraint, Default, Check, References,
Primary, Foreign, Unique, Not, Null, And, Or, Between, Like, In, Exists,
Select, Insert, Update, Delete, Create, Drop, Alter, Grant, Revoke