C#实现带连接/断开按钮的数据库连接功能技术问询
实现带连接/断开按钮的SQL Server数据库连接工具
原代码存在的核心问题
你的这段button1_Click代码有几个致命问题:
- SQL语句逻辑完全错误,错误地把连接字符串参数放到了
Login表的WHERE条件里,完全不符合数据库连接的逻辑 - 直接拼接用户输入到SQL语句,存在严重的SQL注入风险
- 硬编码了连接字符串,没有使用文本框中的用户输入值
- 未正确处理数据库连接的生命周期,容易导致连接泄漏
- C#大小写敏感,
ss.show()应该改为ss.Show()
完整实现方案
1. UI布局准备
在你的登录窗体上添加以下控件:
- 4个
TextBox:分别命名为txtServer(服务器名称)、txtDatabase(数据库名称)、txtUserId(登录ID)、txtPassword(密码,设置PasswordChar='*'隐藏输入) - 2个
Button:命名为btnConnect(连接数据库)、btnDisconnect(断开数据库),初始将btnDisconnect的Enabled设为false
2. 核心代码实现
在窗体类中定义全局连接对象,维护连接状态:
private SqlConnection _dbConnection;
连接按钮点击事件
private void btnConnect_Click(object sender, EventArgs e) { // 获取并验证用户输入 string server = txtServer.Text.Trim(); string database = txtDatabase.Text.Trim(); string userId = txtUserId.Text.Trim(); string password = txtPassword.Text.Trim(); if (string.IsNullOrEmpty(server) || string.IsNullOrEmpty(database) || string.IsNullOrEmpty(userId)) { MessageBox.Show("服务器名称、数据库名称和用户名不能为空!"); return; } // 构建符合格式的连接字符串 string connectionString = $"Data Source={server};Initial Catalog={database};User Id={userId};Password={password};"; try { // 初始化并打开连接 _dbConnection = new SqlConnection(connectionString); _dbConnection.Open(); // 可选:验证连接有效性(查询数据库版本) using (SqlCommand cmd = new SqlCommand("SELECT @@VERSION", _dbConnection)) { string dbVersion = cmd.ExecuteScalar().ToString(); MessageBox.Show($"连接成功!数据库版本:{dbVersion}"); } // 更新按钮状态 btnConnect.Enabled = false; btnDisconnect.Enabled = true; // 跳转到主窗体 this.Hide(); new Main().Show(); } catch (Exception ex) { MessageBox.Show($"连接失败:{ex.Message}"); // 异常时释放连接资源 _dbConnection?.Dispose(); _dbConnection = null; } }
断开按钮点击事件
private void btnDisconnect_Click(object sender, EventArgs e) { try { if (_dbConnection != null && _dbConnection.State == ConnectionState.Open) { _dbConnection.Close(); _dbConnection.Dispose(); _dbConnection = null; MessageBox.Show("已成功断开数据库连接"); // 恢复按钮状态 btnConnect.Enabled = true; btnDisconnect.Enabled = false; } else { MessageBox.Show("当前无活跃的数据库连接"); } } catch (Exception ex) { MessageBox.Show($"断开连接失败:{ex.Message}"); } }
窗体关闭时的资源清理
private void LoginForm_FormClosing(object sender, FormClosingEventArgs e) { // 窗体关闭时确保释放数据库连接 _dbConnection?.Dispose(); }
关键注意事项
- 避免SQL注入:如果后续需要执行数据查询/修改操作,必须使用参数化查询,绝对不能直接拼接用户输入到SQL语句中
- 连接生命周期管理:数据库连接要遵循“打开-使用-关闭/释放”的原则,使用
using语句可以自动释放SqlCommand、SqlDataAdapter等资源 - 异常处理:可以捕获
SqlException进行更精准的错误提示(比如区分“登录失败”“服务器不可达”等场景) - 安全性:密码输入框一定要设置
PasswordChar隐藏输入,避免密码泄露
内容的提问来源于stack exchange,提问作者Mirko Nastasi
相关产品推荐
相关产品推荐

