当我尝试检查数据库中的密码和用户名是否为真时,我收到以下错误。
以下是以下错误:
发生了'System.Data.SqlClient.SqlException'类型的异常 System.Data.dll但未在用户代码中处理
附加信息:必须声明标量变量“@username”。
错误指向string password = cmd2.ExecuteScalar().ToString();
我试图简单地检查密码是否正确并分配给用户名输入。
以下是目前的代码:
protected void SubmitBtn_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\v11.0; AttachDbFilename=C:\Users\Donald\Documents\Visual Studio 2013\Projects\DesktopApplication\DesktopApplication\Student_CB.mdf ;Integrated Security=True");
conn.Open();
string sql = "Select count(*) from Student Where Student_Username=@username";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@username", usernameTxt.Text);
int temp = Convert.ToInt32(cmd.ExecuteScalar().ToString());
conn.Close();
if (temp == 1)
{
conn.Open();
string checkPassword = "Select Student_Password from Student Where Student_Username=@username";
SqlCommand cmd2 = new SqlCommand(checkPassword, conn);
string password = cmd2.ExecuteScalar().ToString();
if (password == passwordTxt.Text)
{
Session["New"] = usernameTxt.Text;
Response.Write("corret");
}
else
{
Response.Write("incorrect");
}
}
else
{
Response.Write("username is incorret");
}
}
答案 0 :(得分:2)
输入-o,您忘记了@
cmd.Parameters.AddWithValue("@username", usernameTxt.Text);
另一个无关紧要的问题是你最终没有关闭你的连接。如果您有一个SQL异常,您的连接将保持打开状态,这不是很好。解决此问题的最简单方法是将连接创建包装在使用块中。
我在这里看到了一些改进的空间。一切都可以真正放入一个db调用。要读回数据,您应该使用DataReader而不是ExecuteScalar。
protected void SubmitBtn_Click(object sender, EventArgs e)
{
var conStr = @"Data Source=(LocalDB)\v11.0; AttachDbFilename=C:\Users\Donald\Documents\Visual Studio 2013\Projects\DesktopApplication\DesktopApplication\Student_CB.mdf ;Integrated Security=True";
bool userExists = false;
string password = null;
using(SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();
string sql = "Select Student_Password from Student Where Student_Username=@username";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@username", usernameTxt.Text);
using(var reader = cmd.ExecuteReader())
{
if(reader.Read()) // if there is a record there is a user so get the password
{
userExists = true;
password = reader.GetString(0); // get string in position 0
}
}
}
if (userExists)
{
if (password == passwordTxt.Text)
{
Session["New"] = usernameTxt.Text;
Response.Write("corret");
}
else
{
Response.Write("incorrect");
}
}
else
{
Response.Write("username is incorret");
}
}
答案 1 :(得分:1)
您忘记了命令中的@
。样本:
cmd.Parameters.AddWithValue("@username", usernameTxt.Text);
在cmd2
定义的第二个命令中,您没有为样本定义username
参数:
SqlCommand cmd2 = new SqlCommand(checkPassword, conn);
cmd2.Parameters.AddWithValue("@username", usernameTxt.Text);
string password = cmd2.ExecuteScalar().ToString();
ExecuteScalar
将执行查询并返回第一行第一列中的值。就是这样,但它并不意味着你不能采用空值。如果在读取值之前检查值是否为null,那应该很好。