VC++ 使用 ADO (OraOLEDB.Oracle) 連接 Oracle 時,連線字串關鍵字拼寫極其敏感。本文記錄一個經典案例:**`DataSource` (無空格) vs `Data Source` (有空格)** 導致本地連線正常、遠端連線失敗的詭異現象。
| 場景 | 連線字串 | 結果 |
|---|---|---|
| 本地連線 | Provider=OraOLEDB.Oracle.1;DataSource=orabase;User ID=its;PassWord=its | ✅ 成功 |
| 遠端連線 | Provider=OraOLEDB.Oracle.1;DataSource=orabase;User ID=its;PassWord=its | ❌ 失敗 |
| 遠端連線 (修正) | Provider=OraOLEDB.Oracle.1;Data Source=orabase;User ID=its;PassWord=its | ✅ 成功 |
根據 Oracle 官方文檔,OraOLEDB.Oracle 標準關鍵字為 **`Data Source`** (含空格),對應 OLE DB 標準 `DBPROP_INIT_DATASOURCE`。
Provider=OraOLEDB.Oracle.1;Data Source=tns_alias;User ID=username;Password=password;
Provider=OraOLEDB.Oracle.1;
Data Source=ORCL;
User ID=scott;
Password=tiger;
Persist Security Info=False;
Pooling=True;
Min Pool Size=0;
Max Pool Size=100;
Connection Lifetime=0;
Connection Timeout=15;
| 關鍵字 (標準) | 別名/錯誤寫法 | 說明 |
|---|---|---|
| Data Source | DataSource, Server, Address | TNS 服務名或 Easy Connect 字串 |
| User ID | UID, Username | 資料庫用戶名 |
| Password | PWD, PassWord | 密碼 (區分大小寫) |
| Persist Security Info | True/False,是否在屬性中保留密碼 | |
| Pooling | True/False,連線池啟用 | |
| FetchSize | 陣列提取大小 (預設 100) | |
| ChunkSize | LOB 讀寫塊大小 | |
| OSAuthent | True/False,作業系統驗證 | |
| PLSQLRSet | True/False,支援 PL/SQL 回傳結果集 |
| Oracle Client 版本 | 提供者名稱 | 關鍵字敏感度 |
|---|---|---|
| 9i/10g | OraOLEDB.Oracle.1 | 高 (嚴格要求 Data Source) |
| 11g/12c/19c | OraOLEDB.Oracle.1 / OraOLEDB.Oracle | 中 (部分別名兼容) |
| 21c+ | OraOLEDB.Oracle | 建議嚴格遵循標準 |
一個空格,決定連線成敗。ADO/OLEDB 連線字串看似簡單,實則暗藏提供者特定規範。**永遠以官方文檔標準關鍵字為準,嚴格對待空格、大小寫、分號**。將連線字串外部化、工具化、測試化,才能避免「本地正常、遠端失敗」這類環境相依的詭異 Bug。