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

C# 向 VFP (FoxPro) 資料庫插入 Numeric 欄位:ODBC 參數化失效與 SQL 直寫替代方案

     編輯:關於C語言

問題現場:DataAdapter.Update 更新 Numeric 欄位失敗

使用 OdbcDataAdapter + OdbcCommandBuilder 自動生成 INSERT/UPDATE 指令時,對 Numeric(16,0) 欄位指派 Convert.ToDecimal(10),執行 Update() 拋出:


ERROR [22018] [Microsoft][ODBC Visual FoxPro Driver] Data type mismatch.

根因分析

  • VFP ODBC 驅動程式對參數化查詢的 Numeric 型別對應有缺陷
  • CommandBuilder 產生的參數型別推斷錯誤,導致驅動程式拒絕資料
  • 但直接執行 SQL UPDATE table SET Num=10 卻正常

解決方案:手寫 SQL 指令繞過 CommandBuilder


string connStr = @"Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=D:\Data\;Exclusive=No;Collate=Machine;";

using (var conn = new OdbcConnection(connStr))
{
    conn.Open();
    
    // INSERT - 直接寫 SQL,避免參數化型別問題
    string sql = "INSERT INTO table1 (DateFrom, Num) VALUES ({^2005-09-10}, 10)";
    using (var cmd = new OdbcCommand(sql, conn))
    {
        cmd.ExecuteNonQuery();
    }
    
    // UPDATE 同理
    string updSql = "UPDATE table1 SET Num = 20 WHERE ID = 1";
    using (var cmd = new OdbcCommand(updSql, conn))
    {
        cmd.ExecuteNonQuery();
    }
}

VFP SQL 日期字面值格式

  • {^YYYY-MM-DD}:標準日期格式 (如 {^2005-09-10})
  • {YYYY-MM-DD}:亦可接受
  • CTOD("2005-09-10"):字串轉日期函式

VFP ODBC 限制補充

  • 不支援 INSERT-SELECT:INSERT INTO t1 SELECT * FROM t2 會報錯
  • 不支援參數化子查詢:複雜參數化指令易失效
  • 大量資料操作建議:匯出 CSV → VFP APPEND FROM 或使用 OLE DB Provider for VFP 9.0

替代提供者:Microsoft OLE DB Provider for VFP 9.0

  • 下載:Microsoft 官網搜尋 "Microsoft OLE DB Provider for Visual FoxPro 9.0"
  • 連接字串:Provider=VFPOLEDB.1;Data Source=D:\Data\;
  • 功能較完整、支援更多 SQL 語法、但同樣為 32 位元、已停止維護

長期建議:資料遷移

VFP 已終止支援 (2015 年),驅動程式僅 32 位元、相容性差。建議將 .dbf 資料遷移至 SQL Server Express / LocalDB / SQLite / PostgreSQL,使用現代 ORM (EF Core/Dapper) 開發,徹底解決驅動程式、並發、編碼、部署等歷史包袱。

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