Windows 控制台「ODBC 資料來源管理員」建立的系統 DSN,實際寫入登錄表兩個位置:
HKLM\SOFTWARE\ODBC\ODBC.INI\ — DSN 詳細設定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 | HKLM (LocalMachine) | 管理員權限 | 所有使用者、系統服務 |
| 使用者 DSN | HKCU (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))
{ ... }
Wow6432NodeRegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)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:
// SQL Server 無 DSN 連接字串
string connStr = "Server=myServer;Database=myDB;Integrated Security=SSPI;";
// 或
string connStr = "Driver={SQL Server};Server=myServer;Database=myDB;Trusted_Connection=Yes;";
HKLM\SOFTWARE\ODBC\ODBC.INI 下的登錄表項目ODBC Data Sources 清單兩處Registry.LocalMachine 需提升權限執行RegistryView