DB2 是企業級主機資料庫主力。.NET 透過 **OLE DB Provider for DB2** (隨 Microsoft Host Integration Server 提供) 存取 DB2。本文涵蓋驅動安裝、連線字串建立、Visual Studio 設計工具整合、基本 CRUD 與參數化查詢。
DB2OLEDB Provider。
Provider=DB2OLEDB;
Data Source=QCDB; // DB2 資料庫別名 (Database Alias)
Initial Catalog=QCDB; // 資料庫名稱
User ID=db2user; // 使用者
Password=secret; // 密碼
Network Transport Library=TCPIP; // 通訊協定
Network Address=10.0.0.50; // DB2 伺服器 IP
Network Port=50000; // DB2 通訊埠 (預設 50000)
Package Collection=MYCOLL; // 套件集合 (Package Collection)
Default Schema=DB2USER; // 預設 Schema
Host CCSID=37; // 主機編碼 (EBCDIC 37 = 美式英文)
PC Code Page=1252; // 用戶端編碼 (ANSI 1252)
Process Binary as Character=False; // 二進位欄位處理
Units of Work=RUW; // 工作單位類型
中文環境關鍵: 正確設定 Host CCSID (如 835 繁中/5035 簡中) 與 PC Code Page (950/936),否則中文會亂碼。
OleDbConnection、OleDbDataAdapter、連線字串等元件。
using System.Data.OleDb;
string connStr = "Provider=DB2OLEDB;Data Source=QCDB;User ID=u;Password=p;Network Address=10.0.0.50;Network Port=50000;Package Collection=MYCOLL;Default Schema=DB2USER;Host CCSID=37;PC Code Page=950;";
using (var conn = new OleDbConnection(connStr))
{
conn.Open();
// 查詢
using (var cmd = new OleDbCommand("SELECT NAME, EMAIL, AGE FROM ADDRESS WHERE AGE > ?", conn))
{
cmd.Parameters.AddWithValue("@age", 30);
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
Console.WriteLine($"{reader["NAME"]} | {reader["EMAIL"]} | {reader["AGE"]}");
}
}
// 新增 (參數化防止 SQL Injection)
using (var cmd = new OleDbCommand("INSERT INTO ADDRESS (NAME, EMAIL, AGE, ADDRESS) VALUES (?, ?, ?, ?)", conn))
{
cmd.Parameters.AddWithValue("@name", "王小明");
cmd.Parameters.AddWithValue("@email", "wang@example.com");
cmd.Parameters.AddWithValue("@age", 28);
cmd.Parameters.AddWithValue("@addr", "台北市信義區");
cmd.ExecuteNonQuery();
}
// 刪除
using (var cmd = new OleDbCommand("DELETE FROM ADDRESS WHERE NAME = ?", conn))
{
cmd.Parameters.AddWithValue("@name", "王小明");
cmd.ExecuteNonQuery();
}
}
? 位置參數,**不支援命名參數** (如 @name),順序必須與 SQL 吻合。DECIMAL → .NET decimal,DATE/TIME/TIMESTAMP → DateTime,CHAR/VARCHAR → string (注意 CCSID 轉碼)。"TableName"。Max Pool Size 設定。OleDbException,檢查 Errors 集合取得 DB2 原生錯誤碼 (SQLCODE/SQLSTATE)。IBM 提供原生 .NET Provider (IBM.Data.DB2 / IBM.Data.DB2.Core),**不需 HIS、效能更好、支援 .NET Core / .NET 5+ / Linux / 容器部署**。
// NuGet: IBM.Data.DB2.Core
using IBM.Data.DB2.Core;
string connStr = "Server=10.0.0.50:50000;Database=QCDB;UID=db2user;PWD=secret;";
using (var conn = new DB2Connection(connStr))
{
conn.Open();
// 後續 ADO.NET API 相同 (DB2Command, DB2Parameter, DB2DataReader...)
}
新專案**強烈建議**改用 IBM 原生 Provider,避免 HIS 安裝複雜、32/64 位元相容、伺服器部署困擾。