VC++ MFC 使用 ADO 連接 Access 數據庫,遷移至 SQL Server 核心只需修改連接字符串與部分 SQL 語法。本文提供完整遷移清單與代碼對比。
| 數據庫 | Provider | 連接字符串示例 |
| Access (Jet OLEDB) | Microsoft.Jet.OLEDB.4.0 | Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db.mdb; |
| Access (ACE OLEDB) | Microsoft.ACE.OLEDB.12.0 | Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\db.accdb; |
| SQL Server (OLEDB) | SQLOLEDB | Provider=SQLOLEDB;Server=192.168.1.100;Database=MyDB;UID=sa;PWD=123456; |
| SQL Server (ODBC) | MSDASQL | Driver={SQL Server};Server=192.168.1.100;Database=MyDB;UID=sa;PWD=123456; |
| SQL Server (Native Client) | SQLNCLI11 | Provider=SQLNCLI11;Server=192.168.1.100;Database=MyDB;UID=sa;PWD=123456; |
MFC ADO 代碼修改對比
原 Access 代碼
_ConnectionPtr pConn;
pConn.CreateInstance(__uuidof(Connection));
_bstr_t strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\db.mdb;";
pConn->Open(strConn, "", "", adConnectUnspecified);
// 執行 SQL
_RecordsetPtr pRs;
pRs = pConn->Execute("SELECT * FROM Users WHERE Age > 20", NULL, adCmdText);
遷移後 SQL Server 代碼
_ConnectionPtr pConn;
pConn.CreateInstance(__uuidof(Connection));
_bstr_t strConn = "Provider=SQLOLEDB;Server=192.168.1.100;Database=MyDB;UID=sa;PWD=123456;";
pConn->Open(strConn, "", "", adConnectUnspecified);
// SQL 語法基本兼容,注意:
// 1. 日期格式:Access #2023-1-1# → SQL Server '2023-01-01'
// 2. 自增列:Access AUTOINCREMENT → SQL Server IDENTITY(1,1)
// 3. 通配符:Access * ? → SQL Server % _
// 4. 保留字:SQL Server 保留字更多,用 [] 括起來
_RecordsetPtr pRs;
pRs = pConn->Execute("SELECT * FROM [Users] WHERE [Age] > 20", NULL, adCmdText);
完整遷移清單
- 連接字符串:按上表修改
- 建表腳本:Access SQL → T-SQL (數據類型、約束、索引語法調整)
- 數據遷移:SSMA (SQL Server Migration Assistant) 或 導出 CSV → BULK INSERT
- 存儲過程/視圖:Access 無存儲過程,需重寫業務邏輯為 T-SQL
- ADO 代碼:逐文件搜索連接字符串、SQL 語句、錯誤處理
- 測試驗證:單元測試覆蓋所有 CRUD、事務、併發場景
常見遷移陷阱
| 問題 | Access 行為 | SQL Server 行為 | 解決 |
| 空字符串 vs NULL | "" 等同 NULL | 截然不同 | 統一用 NULL,參數檢查 |
| 日期字面量 | #yyyy-mm-dd# | 'yyyy-mm-dd' | 參數化查詢自動處理 |
| TOP n | TOP n | TOP (n) / OFFSET FETCH | 改用標準語法 |
| 大小寫敏感 | 不敏感 | 取決於 Collation | 指定 CI_AI 排序規則 |
推薦工具
- SSMA for Access:微軟官方免費遷移工具,自動轉換架構、數據、查詢
- SQL Server Profiler:追蹤執行的 SQL,對比 Access 行為
總結
VC++ MFC + ADO 遷移 Access → SQL Server,**90% 工作量在連接字符串與 SQL 方言差異**。建議:先用 SSMA 遷移架構數據,再逐模塊修改 ADO 代碼,重點測試參數化查詢、事務、日期處理。
- 上一篇文章: Java Scanner 讀取字符串數組跳過首行問題解析
- 下一篇文章: Grails 3.0.9 Service 中多數據源保存數據配置詳解
Copyright ©
程式碼之家 All Rights Reserved