首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

VC++ 程式碼建立 SQL Server ODBC 系統資料來源名稱 (DSN)

     編輯:關於SqlServer

應用場景

資料庫應用程式部署時,需自動在目標機器建立 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; // 成功
}

關鍵注意事項

  1. 權限需求: 寫入 HKLM 需系統管理員權限,安裝程式需提升(UAC Manifest `requireAdministrator`)。
  2. 位元數相容: 32 位元應用程式在 64 位元 OS 上寫入 HKLM\SOFTWARE\ODBC 會被重導向至 HKLM\SOFTWARE\WOW6432Node\ODBC,影響 64 位元進程可見性。建議:
    — 64 位元安裝程式直接寫 HKLM。
    — 或使用 SQLConfigDataSource (ODBC 安裝 DLL API) 自動處理位元數與驗證。
  3. 驅動程式版本: SQL Server Native Client (SNCLI) / Microsoft ODBC Driver 17/18 登錄鍵值名稱不同(如 ODBC Driver 17 for SQL Server),需動態偵測而非寫死「SQL Server」。
  4. 替代方案: 使用 SQLConfigDataSource(ODBC_ADD_SYS_DSN, ...) 官方 API,程式碼更簡潔且自動處理驅動程式驗證、位元數重導向。

SQLConfigDataSource 範例

#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 結束
);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved