使用 OdbcDataAdapter 將 DataTable 寫入 VFP DBF 時,Numeric(16,0) 欄位指派 Convert.ToDecimal(10) 不報錯,但呼叫 Update() 丟出:
System.Data.Odbc.OdbcException: ERROR [22018] [Microsoft][ODBC Visual FoxPro Driver] Data type mismatch.
VFP ODBC 驅動程式對 Numeric 型別的參數綁定極為嚴格:DataTable 欄位型別若為 Decimal,驅動程式可能嘗試傳送帶小數點的字串,導致型別不符。直接用 SQL INSERT 字串則無此問題。
using System.Data.Odbc;
string connStr = @"Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=D:\DataDBF\;Exclusive=No;Collate=Machine;BackgroundFetch=Yes;";
using (OdbcConnection conn = new OdbcConnection(connStr))
{
conn.Open();
// VFP 日期常值格式 {^YYYY-MM-DD},數值直接寫數字
string sql = "INSERT INTO table1 (DateFrom, Num) VALUES ({^2005-09-10}, 10)";
using (OdbcCommand cmd = new OdbcCommand(sql, conn))
{
cmd.ExecuteNonQuery();
}
}
| 型別 | 常值格式 | 範例 |
|---|---|---|
| Date | {^YYYY-MM-DD} | {^2005-09-10} |
| DateTime | {^YYYY-MM-DD HH:MM:SS} | {^2005-09-10 14:30:00} |
| Numeric/Integer | 直接寫數字 | 10, 3.14 |
| Character | 單引號包裹 | 'Hello' |
| Logical | .T. / .F. | .T. |
Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=D:\DataDBF\table1.dbf;Exclusive=No;Collate=Machine;BackgroundFetch=Yes;
INSERT INTO t1 SELECT * FROM t2(需拆分為多筆 INSERT)。操作 VFP DBF 時,優先使用參數化 SQL 字串,避開 DataAdapter.Update 的型別綁定坑。長期專案建議遷移至 SQL Server / SQLite 等現代資料庫。