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

WinForm+ADO.NET登录报错ExecuteReader: Connection未初始化,求解决

解决ADO.NET登录时的ExecuteReader连接未初始化错误

错误原因

你遇到的ExecuteReader: Connection property has not been initialized错误,本质是代码里的cn(SqlConnection对象)没有完成实例化或者未打开连接,导致SqlCommand无法绑定有效的数据库连接执行查询。

另外你的代码存在严重的SQL注入风险,直接拼接用户输入到SQL语句里是非常危险的操作,必须改用参数化查询修复。

修正后的代码示例

// 修正逻辑判断:确保用户名和密码都不为空才执行查询
if (!string.IsNullOrEmpty(txtusername.Text) && !string.IsNullOrEmpty(txtpassword.Text))
{
    // 使用using语句自动释放资源,避免内存泄漏
    using (SqlConnection cn = new SqlConnection("你的数据库连接字符串"))
    {
        cn.Open(); // 打开数据库连接
        // 参数化SQL语句,彻底避免SQL注入
        string sql = "SELECT * FROM LoginTable WHERE username = @Username AND password = @Password";
        using (SqlCommand cmd = new SqlCommand(sql, cn))
        {
            // 为参数赋值
            cmd.Parameters.AddWithValue("@Username", txtusername.Text);
            cmd.Parameters.AddWithValue("@Password", txtpassword.Text);
            
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                if (dr.Read())
                {
                    this.Hide();
                    Home home = new Home();
                    home.ShowDialog();
                }
                else
                {
                    MessageBox.Show("没有匹配的账号或密码", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
    }
}
else
{
    MessageBox.Show("请输入用户名和密码", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}

关键修复点

  • 初始化并打开连接:通过new SqlConnection("连接字符串")创建连接实例,调用cn.Open()打开连接
  • 参数化查询:用@参数名代替直接拼接用户输入,彻底避免SQL注入攻击
  • using语句:自动释放SqlConnection、SqlCommand、SqlDataReader资源,无需手动调用Close(),更安全可靠
  • 修正逻辑判断:原代码用||(或)判断会导致单输入为空也进入查询,改为&&(且)确保两个输入都有效

内容的提问来源于stack exchange,提问作者Zulfan Pratama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:10:28