You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WPF项目中如何在多个窗口复用MySQL数据库连接?

复用MySQL连接并在WPF子窗口填充DataGrid的解决方案

嘿,很高兴看到你已经搞定了主窗口的MySQL连接!关于在其他窗口复用连接、避免重复写代码的问题,完全不用重复造轮子——咱们可以用更优雅、易维护的方式来处理,下面给你两个实用的方案:

方案一:创建全局数据库连接管理类(推荐)

把数据库连接的逻辑封装成一个独立的管理类,所有窗口都能调用它来获取连接,还能统一管理连接的状态,这是最规范的做法。

先写一个静态的连接管理类:

using MySql.Data.MySqlClient;
using System.Windows;

public static class DbConnectionManager
{
    private static MySqlConnection _dbConnection;
    // 把连接字符串抽出来统一维护,方便后续修改
    private static readonly string _connectionString = "SERVER=localhost;PORT=3306;DATABASE=test;UID=root;PASSWORD=;SslMode=none;";

    // 获取可用的数据库连接
    public static MySqlConnection GetConnection()
    {
        // 如果连接不存在或者已经关闭,就重新创建并打开
        if (_dbConnection == null || _dbConnection.State != System.Data.ConnectionState.Open)
        {
            _dbConnection = new MySqlConnection(_connectionString);
            try
            {
                _dbConnection.Open();
            }
            catch (MySqlException ex)
            {
                MessageBox.Show($"数据库连接失败:{ex.Message}");
                throw; // 你可以根据需求选择是否抛出异常,让调用方处理
            }
        }
        return _dbConnection;
    }

    // 程序退出时记得关闭连接,释放资源
    public static void CloseConnection()
    {
        if (_dbConnection != null && _dbConnection.State == System.Data.ConnectionState.Open)
        {
            _dbConnection.Close();
            _dbConnection.Dispose();
        }
    }
}

在其他窗口的DataGrid中使用

比如你的子窗口需要加载数据到DataGrid,只需要在窗口的加载事件或者按钮点击事件里调用这个类:

using MySql.Data.MySqlClient;
using System.Data;
using System.Windows;

public partial class DataGridWindow : Window
{
    public DataGridWindow()
    {
        InitializeComponent();
        Loaded += DataGridWindow_Loaded;
    }

    private void DataGridWindow_Loaded(object sender, RoutedEventArgs e)
    {
        LoadDataIntoGrid();
    }

    private void LoadDataIntoGrid()
    {
        try
        {
            // 获取连接,使用using语句确保资源被正确释放
            using (var connection = DbConnectionManager.GetConnection())
            {
                string query = "SELECT * FROM your_table_name"; // 替换成你的表名
                MySqlDataAdapter dataAdapter = new MySqlDataAdapter(query, connection);
                DataTable dataTable = new DataTable();
                dataAdapter.Fill(dataTable);
                
                // 把数据绑定到DataGrid
                yourDataGrid.ItemsSource = dataTable.DefaultView;
            }
        }
        catch (MySqlException ex)
        {
            MessageBox.Show($"加载数据失败:{ex.Message}");
        }
    }
}

方案二:通过构造函数传递连接

如果你不想用全局类,也可以在主窗口打开子窗口时,把已经创建好的连接直接传递过去:

主窗口中打开子窗口的代码

// 主窗口里的按钮点击事件,打开子窗口
private void OpenDataGridWindow_Click(object sender, RoutedEventArgs e)
{
    // 这里的_conn是主窗口已经创建并打开的连接
    DataGridWindow dataGridWindow = new DataGridWindow(_conn);
    dataGridWindow.Show();
}

子窗口接收连接并加载数据

using MySql.Data.MySqlClient;
using System.Data;
using System.Windows;

public partial class DataGridWindow : Window
{
    private MySqlConnection _passedConnection;

    // 通过构造函数接收主窗口传递的连接
    public DataGridWindow(MySqlConnection connection)
    {
        InitializeComponent();
        _passedConnection = connection;
        Loaded += DataGridWindow_Loaded;
    }

    private void DataGridWindow_Loaded(object sender, RoutedEventArgs e)
    {
        LoadDataIntoGrid();
    }

    private void LoadDataIntoGrid()
    {
        // 先检查连接状态,如果关闭了就重新打开
        if (_passedConnection.State != System.Data.ConnectionState.Open)
        {
            try
            {
                _passedConnection.Open();
            }
            catch (MySqlException ex)
            {
                MessageBox.Show($"重新连接数据库失败:{ex.Message}");
                return;
            }
        }

        try
        {
            string query = "SELECT * FROM your_table_name";
            MySqlDataAdapter dataAdapter = new MySqlDataAdapter(query, _passedConnection);
            DataTable dataTable = new DataTable();
            dataAdapter.Fill(dataTable);
            
            yourDataGrid.ItemsSource = dataTable.DefaultView;
        }
        catch (MySqlException ex)
        {
            MessageBox.Show($"加载数据失败:{ex.Message}");
        }
    }
}

一些重要的注意事项

  • 不要长时间保持连接打开:虽然全局类会维护连接,但如果程序长时间空闲,数据库可能会主动断开连接,所以每次使用时最好检查连接状态。
  • 使用using语句:对于数据适配器、命令等对象,用using可以自动释放资源,避免内存泄漏。
  • 异常处理:每个涉及数据库操作的地方都要捕获异常,给用户友好的提示,同时方便调试。

内容的提问来源于stack exchange,提问作者Arsalan Ahmadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 12:22:44