資料庫應用程式部署時,需自動在目標機器建立 System DSN,避免使用者手動設定。本文提供 MFC/Win32 API 完整實作,透過登錄表操作檢查驅動程式並建立 DSN。
| 路徑 | 用途 |
|---|---|
HKLM\SOFTWARE\ODBC\ODBCINST.INI\SQL Server | 驅動程式安裝資訊(Driver 路徑、版本) |
HKLM\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources | 系統 DSN 清單(名稱 → 驅動程式名稱) |
HKLM\SOFTWARE\ODBC\ODBC.INI\ | 特定 DSN 詳細屬性(Server、Database、Trusted_Connection 等) |
int MakeSQLServerODBCDSN(LPCTSTR strDBServer, LPCTSTR strDBName,
LPCTSTR strDSN, LPCTSTR strUID)
{
// 1. 檢查 SQL Server ODBC 驅動程式是否安裝
CRegKey regDrv;
LONG lRet = regDrv.Open(HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\ODBC\\ODBCINST.INI\\SQL Server"));
if (lRet != ERROR_SUCCESS) return -1; // 驅動程式未安裝
CString strDriverPath;
ULONG nChars = MAX_PATH;
lRet = regDrv.QueryStringValue(_T("Driver"), strDriverPath.GetBuffer(MAX_PATH), &nChars);
strDriverPath.ReleaseBuffer();
regDrv.Close();
if (lRet != ERROR_SUCCESS || strDriverPath.IsEmpty()) return -1;
// 2. 建立/更新 DSN 登錄項目
CRegKey regDSN;
lRet = regDSN.Create(HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\ODBC\\ODBC.INI\\") + CString(strDSN));
if (lRet != ERROR_SUCCESS) return -2;
// 寫入 DSN 核心屬性
regDSN.SetStringValue(_T("Driver"), strDriverPath);
regDSN.SetStringValue(_T("Server"), strDBServer);
regDSN.SetStringValue(_T("Database"), strDBName);
regDSN.SetStringValue(_T("Trusted_Connection"), _T("Yes")); // Windows 驗證
// 若需 SQL 驗證:Trusted_Connection=No,並設定 LastUser=UID
if (strUID && _tcslen(strUID) > 0)
regDSN.SetStringValue(_T("LastUser"), strUID);
regDSN.Close();
// 3. 將 DSN 加入系統 DSN 清單
CRegKey regList;
regList.Open(HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources"), KEY_WRITE);
regList.SetStringValue(strDSN, _T("SQL Server"));
regList.Close();
return 0; // 成功
}
HKLM 需系統管理員權限,安裝程式需提升(UAC Manifest `requireAdministrator`)。HKLM\SOFTWARE\ODBC 會被重導向至 HKLM\SOFTWARE\WOW6432Node\ODBC,影響 64 位元進程可見性。建議:SQLConfigDataSource (ODBC 安裝 DLL API) 自動處理位元數與驗證。ODBC Driver 17 for SQL Server),需動態偵測而非寫死「SQL Server」。SQLConfigDataSource(ODBC_ADD_SYS_DSN, ...) 官方 API,程式碼更簡潔且自動處理驅動程式驗證、位元數重導向。#include
BOOL bRet = SQLConfigDataSource(
NULL, // 父視窗
ODBC_ADD_SYS_DSN, // 操作:新增系統 DSN
_T("ODBC Driver 17 for SQL Server"), // 驅動程式名稱(需完全一致)
_T("DSN=MyDSN\0")
_T("SERVER=192.168.1.100\0")
_T("DATABASE=MyDB\0")
_T("Trusted_Connection=Yes\0")
_T("\0") // 雙 NULL 結束
);