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
相关产品推荐
相关产品推荐

