"执行读取器:连接属性尚未初始化。"



我是C#的新手,我一直试图使用ADO.NET和WinForm创建登录名,但当我尝试登录时,我收到了这个错误;

System.InvalidOperationException:"ExecuteReader:Connection属性尚未初始化。">

我似乎不知道出了什么问题。

private void bteAdminLog_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = "Data Source=DESKTOP-RCPAL7F;Initial Catalog=iCubeDB;Integrated Security=True";
con.Open();
String txtUser = txtUsername.Text;
String txtPass = txtPassword.Text;
string query = "SELECT * FROM AdminLogin WHERE Username =@user AND Password = @Pass";
SqlCommand cmd = new SqlCommand();
cmd.Parameters.Add(new SqlParameter("@user", txtUser));
cmd.Parameters.Add(new SqlParameter(" @Pass", txtPass));
SqlDataReader dr = cmd.ExecuteReader();
if(dr.HasRows == true)
{
MessageBox.Show("Done");
}
else
{
MessageBox.Show("not done");
}
}

您的SqlCommand没有通过queryconn

你应该这样做:

SqlCommand cmd = new SqlCommand(query, con);

对于Parameters部分,您将参数设置为相应的数据类型include length/size(与数据库列匹配(,然后为每个参数分配值:

cmd.Parameters.Add("@user", SqlDbType.Varchar, 10).Value = txtUser;
cmd.Parameters.Add("@Pass", SqlDbType.NVarchar, 50).Value = /* hashed txtPass */;

cmd.Parameters.Add()中的第三个参数用于表示数据类型的大小/长度。

更新

[第一个编辑版本]

与Post Owner确认,存储的密码在数据库中进行了哈希处理。因此,我删除前一句话。

【第二次编辑版本】

感谢@Charlie的关注,所以我编辑了答案,以包括数据类型的长度/大小。

参考文献:

  1. SqlCommand

  2. 不应用AddWithValue()的原因

最新更新