'ExecuteReader: Connection property has not been initialized.'

'ExecuteReader: Connection property has not been initialized.'

我是 C# 的新手,我一直在尝试使用 ADO.NET 和 WinForm 创建登录,但是当我尝试登录时出现此错误;

System.InvalidOperationException: 'ExecuteReader: Connection property has not been initialized.'

我好像不知道怎么回事

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 部分,您使用 各自的数据类型设置参数,包括 length/size(与您的数据库列匹配),然后分配每个参数的值:

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

cmd.Parameters.Add()中的第三个参数用于数据类型的size/length。

已更新:

[第一个编辑版本]

已与 Post 所有者确认,存储的密码已在数据库中进行哈希处理。因此我删除了之前的评论。

[第二次编辑版本]

感谢@Charlie 的关心,所以我编辑答案以包含数据类型的 length/size。

参考文献:

  1. SqlCommand

  2. Reason not to apply AddWithValue()