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

C#实现带连接/断开按钮的数据库连接功能技术问询

实现带连接/断开按钮的SQL Server数据库连接工具

原代码存在的核心问题

你的这段button1_Click代码有几个致命问题:

  1. SQL语句逻辑完全错误,错误地把连接字符串参数放到了Login表的WHERE条件里,完全不符合数据库连接的逻辑
  2. 直接拼接用户输入到SQL语句,存在严重的SQL注入风险
  3. 硬编码了连接字符串,没有使用文本框中的用户输入值
  4. 未正确处理数据库连接的生命周期,容易导致连接泄漏
  5. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:43:17