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

C# 程式動態建立 ODBC 資料來源:登錄表操作實戰

     編輯:關於C語言

原理:ODBC DSN 本質是登錄表鍵值

Windows 控制台「ODBC 資料來源管理員」建立的系統 DSN,實際寫入登錄表兩個位置:

  1. HKLM\SOFTWARE\ODBC\ODBC.INI\ — DSN 詳細設定
  2. HKLM\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources — DSN 名稱對應驅動程式

完整實作程式碼


using Microsoft.Win32;
using System;
using System.Windows.Forms;

public class OdbcManager
{
    /// 
    /// 建立 SQL Server 系統 DSN
    /// 
    /// DSN 名稱 (建議與資料庫名稱一致)
    /// SQL Server 伺服器名稱/IP
    /// 是否成功
    public bool CreateSystemDsn(string dsnName, string serverName)
    {
        try
        {
            // 1. 建立/開啟 DSN 專屬金鑰
            // HKLM\SOFTWARE\ODBC\ODBC.INI\
            using (RegistryKey dsnKey = Registry.LocalMachine
                .OpenSubKey(@"SOFTWARE\ODBC\ODBC.INI", true)
                .CreateSubKey(dsnName.Trim()))
            {
                dsnKey.SetValue("Database", dsnName.Trim());           // 預設資料庫
                dsnKey.SetValue("Driver", GetSqlDriverPath());         // 驅動程式路徑
                dsnKey.SetValue("Server", serverName.Trim());          // 伺服器
                dsnKey.SetValue("Trusted_Connection", "Yes");          // 整合驗證
                // 可選:dsnKey.SetValue("Description", "應用程式自動建立");
            }
            
            // 2. 註冊至 ODBC Data Sources 清單
            // HKLM\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources
            using (RegistryKey listKey = Registry.LocalMachine
                .OpenSubKey(@"SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources", true))
            {
                listKey.SetValue(dsnName.Trim(), "SQL Server");
            }
            
            return true;
        }
        catch (Exception ex)
        {
            MessageBox.Show($"建立 DSN 失敗:{ex.Message}");
            return false;
        }
    }
    
    private string GetSqlDriverPath()
    {
        // 系統目錄通常為 C:\Windows\System32
        string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
        return System.IO.Path.Combine(systemPath, "SQLSRV32.dll");
    }
}

使用範例


var manager = new OdbcManager();
bool success = manager.CreateSystemDsn("MyAppDB", "(local)");
if (success)
    Console.WriteLine("系統 DSN 建立成功,可於 ODBC 管理員中查看");

進階:使用者 DSN vs 系統 DSN

類型登錄表根鍵權限需求可見範圍
系統 DSNHKLM (LocalMachine)管理員權限所有使用者、系統服務
使用者 DSNHKCU (CurrentUser)一般使用者僅目前使用者

// 使用者 DSN 版本
using (RegistryKey dsnKey = Registry.CurrentUser
    .OpenSubKey(@"SOFTWARE\ODBC\ODBC.INI", true)
    .CreateSubKey(dsnName.Trim()))
{ ... }

using (RegistryKey listKey = Registry.CurrentUser
    .OpenSubKey(@"SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources", true))
{ ... }

64 位元系統特別注意

  • 32 位元應用程式在 64 位元 Windows 執行時,登錄表會被重導向至 Wow6432Node
  • 建議明確指定視圖:RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
  • 或編譯為 64 位元專案 (Prefer 32-bit 取消勾選)

// 明確操作 64 位元登錄表
using (RegistryKey baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
using (RegistryKey odbcKey = baseKey.OpenSubKey(@"SOFTWARE\ODBC\ODBC.INI", true))
{ ... }

替代方案:連接字串無 DSN 連線

現代應用程式建議直接使用無 DSN 連接字串,避免部署時需預先建立 DSN:


// SQL Server 無 DSN 連接字串
string connStr = "Server=myServer;Database=myDB;Integrated Security=SSPI;";
// 或
string connStr = "Driver={SQL Server};Server=myServer;Database=myDB;Trusted_Connection=Yes;";

本章小結

  • ODBC 系統 DSN 實為 HKLM\SOFTWARE\ODBC\ODBC.INI 下的登錄表項目
  • 需寫入 DSN 設定金鑰與 ODBC Data Sources 清單兩處
  • 操作登錄表需管理員權限,Registry.LocalMachine 需提升權限執行
  • 64 位元系統注意登錄表重導向,建議明確指定 RegistryView
  • 現代開發優先使用無 DSN 連接字串,簡化部署與環境相依
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved