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

