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

C# 向 Visual FoxPro (VFP) DBF 寫入 Numeric 欄位:DataType Mismatch 解決方案

     編輯:關於C#

問題現象

使用 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 字串則無此問題。

解決方案:改用參數化 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();
    }
}

VFP SQL 日期/數值常值格式速查

型別常值格式範例
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.

補充資源

  • Microsoft OLE DB Provider for VFP 9.0:官方下載,效能與相容性優於 ODBC。
  • 連線字串備忘:
    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 等現代資料庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved