開發 WinForms/WPF 應用程式時,使用者常需設定資料庫連線字串。自行開發連線設定介面不僅工程量大,還需處理各種資料庫提供者 (SQL Server、Oracle、MySQL、PostgreSQL、ODBC、OLEDB) 的連線屬性差異。Visual Studio 內建的 DataConnectionDialog 提供專業級、支援多種資料來源的連線設定 UI,直接引用即可使用,大幅降低開發成本。
// Visual Studio 2019/2022 安裝路徑 (依版本調整)
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Microsoft.Data.ConnectionUI.Dialog.dll
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Microsoft.Data.ConnectionUI.dll
// 或 NuGet 套件 (建議,版本管理更容易)
// Install-Package Microsoft.Data.ConnectionUI -Version 10.0.0
// Install-Package Microsoft.Data.ConnectionUI.Dialog -Version 10.0.0
using Microsoft.Data.ConnectionUI;
var dialog = new DataConnectionDialog
{
// 只顯示 SQL Server 資料來源
DataSources = { DataSource.SqlDataSource },
SelectedDataProvider = DataProvider.SqlDataProvider,
// 視窗設定
StartPosition = FormStartPosition.CenterParent,
Title = "選擇 SQL Server 連線",
// 預設連線字串 (選填)
ConnectionString = "Server=localhost;Database=MyDb;Integrated Security=True;"
};
// 顯示對話框 (需傳入 IWin32Window 做為擁有者)
if (DataConnectionDialog.Show(dialog, this) == DialogResult.OK)
{
string connStr = dialog.ConnectionString; // 取得使用者設定的連線字串
// 儲存至設定檔、建立連線、測試連線...
MessageBox.Show($"連線字串:\n{connStr}");
}
var dialog = new DataConnectionDialog
{
Title = "資料庫連線設定",
StartPosition = FormStartPosition.CenterParent
};
// 新增多種資料來源
dialog.DataSources.Add(DataSource.SqlDataSource); // SQL Server
dialog.DataSources.Add(DataSource.OracleDataSource); // Oracle
dialog.DataSources.Add(DataSource.OdbcDataSource); // ODBC
dialog.DataSources.Add(DataSource.OleDbDataSource); // OLEDB
// dialog.DataSources.Add(DataSource.SqlFileDataSource); // SQL Server Compact / LocalDB 檔案
// 設定預設提供者
dialog.SelectedDataProvider = DataProvider.SqlDataProvider;
// 進階:自訂預設連線字串範本 (針對特定提供者)
dialog.ConnectionString = "Server=.;Database=Test;Trusted_Connection=True;";
// 顯示
if (DataConnectionDialog.Show(dialog, this) == DialogResult.OK)
{
// dialog.SelectedDataProvider 可知使用者選了哪種提供者
// dialog.ConnectionString 為完整連線字串
SaveConnectionString(dialog.ConnectionString, dialog.SelectedDataProvider);
}
| DataSource | DataProvider | 說明 |
|---|---|---|
DataSource.SqlDataSource | DataProvider.SqlDataProvider | Microsoft SQL Server (System.Data.SqlClient) |
DataSource.OracleDataSource | DataProvider.OracleDataProvider | Oracle Database (System.Data.OracleClient - 已淘汰) 或 ODP.NET |
DataSource.OdbcDataSource | DataProvider.OdbcDataProvider | ODBC 通用 (System.Data.Odbc) |
DataSource.OleDbDataSource | DataProvider.OleDbDataProvider | OLEDB 通用 (System.Data.OleDb) - Access、Excel、MySQL 等 |
DataSource.SqlFileDataSource | DataProvider.SqlDataProvider | SQL Server LocalDB / Compact (.mdf/.sdf) |
public partial class ConnectionSettingsForm : Form
{
private string _savedConnectionString;
private DataProvider _savedProvider;
public ConnectionSettingsForm()
{
InitializeComponent();
LoadSavedSettings();
}
private void LoadSavedSettings()
{
// 從 app.config / 登錄 / 資料庫 讀取儲存的設定
_savedConnectionString = Properties.Settings.Default.DbConnectionString;
_savedProvider = Enum.TryParse(Properties.Settings.Default.DbProvider, out DataProvider p) ? p : DataProvider.SqlDataProvider;
txtCurrentConnection.Text = _savedConnectionString;
lblCurrentProvider.Text = _savedProvider.ToString();
}
private void btnChangeConnection_Click(object sender, EventArgs e)
{
var dialog = new DataConnectionDialog
{
Title = "變更資料庫連線",
StartPosition = FormStartPosition.CenterParent,
ConnectionString = _savedConnectionString,
SelectedDataProvider = _savedProvider
};
// 依專案需求決定支援哪些資料來源
dialog.DataSources.Add(DataSource.SqlDataSource);
dialog.DataSources.Add(DataSource.OleDbDataSource); // 支援 Access/Excel
dialog.DataSources.Add(DataSource.OdbcDataSource); // 支援 MySQL/PostgreSQL ODBC
if (DataConnectionDialog.Show(dialog, this) == DialogResult.OK)
{
_savedConnectionString = dialog.ConnectionString;
_savedProvider = dialog.SelectedDataProvider;
txtCurrentConnection.Text = _savedConnectionString;
lblCurrentProvider.Text = _savedProvider.ToString();
// 即時測試連線
TestConnection(_savedConnectionString, _savedProvider);
}
}
private void TestConnection(string connStr, DataProvider provider)
{
try
{
using (var conn = CreateConnection(connStr, provider))
{
conn.Open();
MessageBox.Show("連線測試成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show($"連線測試失敗:\n{ex.Message}", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private IDbConnection CreateConnection(string connStr, DataProvider provider)
{
return provider switch
{
DataProvider.SqlDataProvider => new System.Data.SqlClient.SqlConnection(connStr),
DataProvider.OleDbDataProvider => new System.Data.OleDb.OleDbConnection(connStr),
DataProvider.OdbcDataProvider => new System.Data.Odbc.OdbcConnection(connStr),
_ => throw new NotSupportedException($"不支援的提供者: {provider}")
};
}
private void btnSave_Click(object sender, EventArgs e)
{
Properties.Settings.Default.DbConnectionString = _savedConnectionString;
Properties.Settings.Default.DbProvider = _savedProvider.ToString();
Properties.Settings.Default.Save();
this.DialogResult = DialogResult.OK;
this.Close();
}
}
| 問題 | 原因 | 解決 |
|---|---|---|
| 找不到 Microsoft.Data.ConnectionUI.Dialog.dll | VS 安裝路徑變更、未安裝 SSDT/資料工具 | 改用 NuGet 套件 Microsoft.Data.ConnectionUI.Dialog,版本獨立管理 |
| 對話框顯示英文介面 | 缺少語系資源衛星組件 | 確保專案輸出目錄包含 zh-CHS/zh-CHT 資料夾及 *.resources.dll,或設定 Thread.CurrentThread.CurrentUICulture |
| SQL Server 提供者不見/灰色 | 未安裝 SQL Server Data Tools (SSDT) | VS Installer 勾選「資料儲存與處理」工作負載,或安裝獨立 SSDT |
| Oracle 提供者錯誤 | System.Data.OracleClient 已被 Microsoft 淘汰 | 改用 ODP.NET (Oracle.ManagedDataAccess) 自行實作連線設定,或用 ODBC/OLEDB 通用提供者 |
| 部署時缺少組件 | VS 組件非可散發 | NuGet 套件會隨專案複製至輸出目錄,確保 Copy Local = true |
若不想依賴 VS 組件,可考慮:
DataConnectionDialog 是快速整合專業資料庫連線設定 UI 的最佳捷徑,特別適合需支援多種資料庫的企業級應用程式。透過 NuGet 套件管理相依性、正確處理語系資源、搭配連線測試與設定持久化,即可為使用者提供媲美 Visual Studio 的連線設定體驗。