首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> C# 入門

C# 直接呼叫 Visual Studio 內建資料庫連線對話框:DataConnectionDialog 完整指南

     編輯:C# 入門

為什麼要用 VS 內建連線對話框?

開發 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);
}

資料提供者對照表

DataSourceDataProvider說明
DataSource.SqlDataSourceDataProvider.SqlDataProviderMicrosoft SQL Server (System.Data.SqlClient)
DataSource.OracleDataSourceDataProvider.OracleDataProviderOracle Database (System.Data.OracleClient - 已淘汰) 或 ODP.NET
DataSource.OdbcDataSourceDataProvider.OdbcDataProviderODBC 通用 (System.Data.Odbc)
DataSource.OleDbDataSourceDataProvider.OleDbDataProviderOLEDB 通用 (System.Data.OleDb) - Access、Excel、MySQL 等
DataSource.SqlFileDataSourceDataProvider.SqlDataProviderSQL Server LocalDB / Compact (.mdf/.sdf)

完整 WinForms 整合範例

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.dllVS 安裝路徑變更、未安裝 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 組件,可考慮:

  • SqlConnectionStringBuilder / OleDbConnectionStringBuilder:.NET 內建強型別建構器,配合 PropertyGrid 動態產生 UI
  • ConnectionStringBuilder (NuGet) : 通用連線字串建構庫
  • 自建簡易表單:針對固定資料庫類型 (如僅支援 SQL Server) 自行設計 Server/Database/Auth 模式下拉選單,最輕量可控

總結

DataConnectionDialog 是快速整合專業資料庫連線設定 UI 的最佳捷徑,特別適合需支援多種資料庫的企業級應用程式。透過 NuGet 套件管理相依性、正確處理語系資源、搭配連線測試與設定持久化,即可為使用者提供媲美 Visual Studio 的連線設定體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved