首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

OleDb 批次更新 Access 遇到「INSERT INTO 語法錯誤」根因與解決:保留字衝突與 QuotePrefix/Suffix 設定

     編輯:ASP.NET 基礎

問題重現

使用 `OleDbDataAdapter` + `OleDbCommandBuilder` 自動產生 `INSERT`/`UPDATE`/`DELETE` 指令寫入 Access,執行時拋出:

System.Data.OleDb.OleDbException: 'INSERT INTO 陳述式的語法錯誤。'

根因分析

  1. `OleDbCommandBuilder` 依據 `SelectCommand` 的欄位名稱自動產生 SQL。
  2. Access 保留字(如 `Number`、`Date`、`Key`、`Order`、`Group`、`Desc` 等)若作為欄位名,必須用 **方括號 `[]` 包裹**。
  3. 預設 `OleDbCommandBuilder` 不會自動加上方括號,導致產生 `INSERT INTO Table (Number) VALUES (...)` 而非 `INSERT INTO Table ([Number]) VALUES (...)`。

解決方案:設定 QuotePrefix / QuoteSuffix

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 句加方括號?

即使 `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;
}

延伸:Access 常見保留字清單 (需加括號)

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

最佳實踐建議

  1. 命名規範:新資料表設計時避開保留字(如用 `Num` 代替 `Number`、`CreateDate` 代替 `Date`)。
  2. 既有資料庫:一律在 `OleDbCommandBuilder` 設定 `QuotePrefix="["`、`QuoteSuffix="]"`。
  3. 參數化查詢:若手寫 SQL,請用 `INSERT INTO Table ([Number]) VALUES (?)` 參數化,避免注入與語法問題。
  4. 除錯技巧:`builder.GetInsertCommand().CommandText` 可檢視自動產生的 SQL,確認括號正確。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved