使用 Microsoft Paradox Driver (*.db) 透過 ODBC 連線 Paradox 資料庫,執行 UPDATE 或 DELETE 時拋出:
另一種非常常見的原因是聯接包含的鏈接 ODBC 表的索引不是唯一的。在這種情況下,SQL 無法保證表中的記錄是唯一,該表中字段的值將隨查詢發生更改。
Paradox 驅動程式要求 被更新資料表必須擁有唯一索引(主鍵或 Unique Index),否則無法定位唯一記錄進行更新/刪除。單純建立普通索引不足夠,必須是 唯一 索引。
.db 檔案。.px 索引檔(如 CUSTOMER.PX)。using System;
using System.Data.Odbc;
public class ParadoxHelper
{
private readonly string _connStr;
public ParadoxHelper(string folderPath)
{
_connStr = $@"Driver={{Microsoft Paradox Driver (*.db )}};DriverID=538;Fil=Paradox 5.X;DefaultDir={folderPath};Dbq={folderPath};CollatingSequence=ASCII;";
}
public void ExecuteNonQuery(string sql)
{
using (var conn = new OdbcConnection(_connStr))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
}
public object ExecuteScalar(string sql)
{
using (var conn = new OdbcConnection(_connStr))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = sql;
return cmd.ExecuteScalar();
}
}
}
// 使用範例
var db = new ParadoxHelper(@"C:\Data\ParadoxDB");
db.ExecuteNonQuery("UPDATE Customers SET ContactName='New Name' WHERE CustNo=1001");
Console.WriteLine(db.ExecuteScalar("SELECT COUNT(*) FROM Customers"));
| 問題 | 原因 | 解決 |
|---|---|---|
| 找不到驅動程式 | 64 位元程式需 64 位元 Paradox ODBC 驅動 | 安裝 64 位元驅動或將專案設為 x86 (Prefer 32-bit) | 中文亂碼 | Paradox 5.x 預設 ANSI,編碼頁不符 | 連接字串加 CollatingSequence=ASCII 或對應代碼頁 |
| 同時開啟鎖定衝突 | Paradox 使用 .lck 檔鎖定,多程式並存易衝突 | 錯峰存取、或遷移至 SQLite/SQL Server |
| 欄位名稱含空格/保留字 | SQL 解析失敗 | 用雙引號括住:UPDATE "Customer Table" SET "Contact Name"=... |
Paradox 為 90 年代產物,已無主流支援。新專案強烈建議:
Database Desktop 匯出 CSV → 批次匯入新資料庫。C# 操作 Paradox 失敗「索引不唯一」的核心解法是:用 Database Desktop 為資料表建立唯一索引(產生 .px 檔)。本文提供完整連接字串、CRUD 封裝、常見坑點對策與遷移建議,助你快速解決舊系統維護問題,並規劃長遠技術棧升級。