【问题标题】:'ExecuteReader: Connection property has not been initialized.' [duplicate]“ExecuteReader:连接属性尚未初始化。” [复制]
【发布时间】:2021-04-02 07:42:14
【问题描述】:

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

System.InvalidOperationException: 'ExecuteReader: 连接属性尚未初始化。'

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

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");
    }
}

【问题讨论】:

  • 不,我已经读过了
  • 请注意,当您应该使用MySqlConnectionMySqlCommand 时,您使用的是SqlConnectionSqlCommand。那或者您将您的问题误认为[mysql] 而不是[sql-server]。另请注意,您的第二个参数称为" @Pass",带有前导空格,而不是"@Pass"。这可能会给您带来问题。
  • 您也应该使用using 处理您的连接对象

标签: c# c#-4.0 ado.net


【解决方案1】:

您的SqlCommand 没有与queryconn 一起传递

你应该这样做:

SqlCommand cmd = new SqlCommand(query, con);

对于Parameters 部分,您使用相应的数据类型包括长度/大小(与您的数据库列匹配)设置参数,然后为每个参数分配值:

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. Reason not to apply AddWithValue()

【讨论】:

  • 我将 con 和查询传递给 SqlCommand,它可以连接到数据库,但是我使用 HASHBYTES('SHA2_512', 在数据库端加密密码,现在它一直说用户名或密码无效.请问我现在能做什么,我猜我必须解密密码。
  • 嗨@Yaw,我相信您正在从AdminLogin 表中检索记录,对吧?如果是,您需要对用户输入的密码进行哈希处理,并与数据库中的密码进行比较。请确保两个密码(用户输入和数据库记录)具有相同的哈希格式。谢谢。
  • 感谢@Yong 抽出宝贵时间帮助我。我今天早上才学会如何使用 HASHBYTES('SHA2_512 加密我的数据库中的密码字段,我如何在表单应用程序中对密码字段进行哈希处理。
  • 嗨@Yaw,不客气,您可以在here 上查看C# 中的散列,或者您可以在SQL 查询中对您的密码进行散列。如果您仍然遇到任何困难,您可以为其创建另一个问题,因为散列部分与该问题的主题不同。谢谢你,祝你有美好的一天。
  • 各自的数据类型和长度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
相关资源
最近更新 更多