項目要求將現金管理系統從原資料庫遷移至 IBM DB2。團隊此前無 DB2 經驗,從環境搭建、語法差異、驅動對接到數據遷移,歷經半個多月摸索,最終順利上線。本文將踩過的坑、核心差異點、關鍵代碼與工具鏈完整分享,助同行少走彎路。
DB2 版本繁多(32/64 位、Windows/Linux/AIX 等)。開發階段用 Windows 版,生產部署於非 Windows 系統。關鍵:找對安裝包。首個包反覆失敗,換同事提供的版本即順利安裝(僅需設定用戶/密碼,安裝包僅幾百 MB)。安裝後若報錯,通常是 Windows 權限問題,調整即可。
無現成教材、無人指導,靠摸索 2 天搞懂 DB2 執行 SQL 方式(命令行處理器、Control Center、Data Studio 等),後續開發才順暢。
工具功能完善,但易用性不如 SQL Server Management Studio(SSMS 的複製貼上、批量操作極友好)。DB2/Oracle 工具偏向專家型用戶,菜鳥上手有門檻。
| 項目 | DB2 | Oracle | SQL Server |
|---|---|---|---|
| 字符串拼接 | || | || | + |
| 參數化佔位符 | @ | : 或 ? | @ |
| 虛擬表 | SYSIBM.SYSDUMMY1 (類 Dual) | DUAL | 無 |
| 自增列 | 支援 (GENERATED ALWAYS/BY DEFAULT AS IDENTITY) | 12c+ 支援 (GENERATED AS IDENTITY) | 支援 (IDENTITY) |
| 序列 | 支援 (CREATE SEQUENCE) | 支援 | 2012+ 支援 |
| 分頁查詢 | OFFSET ... ROWS FETCH NEXT ... ROWS ONLY / ROW_NUMBER() OVER() | ROWNUM / OFFSET/FETCH (12c+) | OFFSET/FETCH (2012+) |
| 分區表 | 支援 (Range/Hash/List) | 支援 | 支援 |
亮點: DB2 同時擁有自增列與序列,主鍵策略靈活,並發性能優於僅有序列的 Oracle。
去 IBM 官網註冊下載 IBM.Data.DB2.dll(VS2005 版亦可用於新版 VS),引用入項目。
<add key="UserCenterDbConnection" value="Database=JIRI_UC;UserID=administrator;PassWord=pAssw0rd;Server=WIN-3T3M2TTDAFK;" />
<add key="BusinessDbConnection" value="Database=JIRI_DB;UserID=administrator;PassWord=pAssw0rd;Server=WIN-3T3M2TTDAFK;" />
將原 Oracle 導數工具改造為支援任意 ADO.NET 提供者的通用版,半小時搞定。核心邏輯:
IDbHelper 抽象來源/目標資料庫(SQL Server/Oracle/DB2 等)SQLBuilder 動態構建 INSERT 語句,自動匹配列名// 關鍵片段:目標端切換為 DB2Helper
IDbHelper targetDB = new DB2Helper("Database=JMCB_UC;UserID=administrator;PassWord=p@ssw0rd2077;Server=WIN-3T3M2TTDAFK;");
targetDB.Open();
SQLBuilder sqlBuilder = new SQLBuilder(targetDB);
// 清空目標表
targetDB.ExecuteNonQuery("DELETE FROM " + tableName);
// 逐行構建 INSERT
for (int r = 0; r < dataTable.Rows.Count; r++) {
sqlBuilder.BeginInsert(tableName);
for (int i = 0; i < dataTable.Columns.Count; i++) {
sqlBuilder.SetValue(dataTable.Columns[i].ColumnName, dataTable.Rows[r][dataTable.Columns[i].ColumnName]);
}
sqlBuilder.EndInsert();
}
targetDB.CommitTransaction();
需 IBM.Data.DB2.dll 者可加 QQ:252056973 索取。歡迎交流指正。