我是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
没有通过query
和conn
你应该这样做:
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的关注,所以我编辑了答案,以包括数据类型的长度/大小。
参考文献:
SqlCommand
不应用
AddWithValue()
的原因