C# c语言中的标量变量声明#
当我试图检查数据库中的密码和用户名是否为真时,出现以下错误 以下是错误:C# c语言中的标量变量声明#,c#,sql-server,ado.net,C#,Sql Server,Ado.net,当我试图检查数据库中的密码和用户名是否为真时,出现以下错误 以下是错误: 中发生类型为“System.Data.SqlClient.SqlException”的异常 System.Data.dll,但未在用户代码中处理 其他信息:必须声明标量变量“@username” 错误指向string password=cmd2.ExecuteScalar().ToString() 我试图简单地检查密码是否正确,是否分配给用户名输入 以下是迄今为止的代码: 键入o,您忘记了@ cmd.Parameters.
中发生类型为“System.Data.SqlClient.SqlException”的异常 System.Data.dll,但未在用户代码中处理 其他信息:必须声明标量变量“@username” 错误指向
string password=cmd2.ExecuteScalar().ToString()代码>
我试图简单地检查密码是否正确,是否分配给用户名输入
以下是迄今为止的代码:
键入o,您忘记了@
cmd.Parameters.AddWithValue("@username", usernameTxt.Text);
另一个不相关的问题是,在最终阻塞时,您没有关闭连接。如果您有sql异常,您的连接将保持打开状态,这是不好的。解决此问题的最简单方法是将您的连接创建包装在using块中
编辑
我认为这方面还有改进的余地。所有东西都可以放在一个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");
}
}
键入o,您忘记了@
cmd.Parameters.AddWithValue("@username", usernameTxt.Text);
另一个不相关的问题是,在最终阻塞时,您没有关闭连接。如果您有sql异常,您的连接将保持打开状态,这是不好的。解决此问题的最简单方法是将您的连接创建包装在using块中
编辑
我认为这方面还有改进的余地。所有东西都可以放在一个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");
}
}
您忘记了命令中的@
。对于示例:
cmd.Parameters.AddWithValue("@username", usernameTxt.Text);
SqlCommand cmd2 = new SqlCommand(checkPassword, conn);
cmd2.Parameters.AddWithValue("@username", usernameTxt.Text);
string password = cmd2.ExecuteScalar().ToString();
在由cmd2
定义的第二个命令中,您没有为示例定义username
参数:
cmd.Parameters.AddWithValue("@username", usernameTxt.Text);
SqlCommand cmd2 = new SqlCommand(checkPassword, conn);
cmd2.Parameters.AddWithValue("@username", usernameTxt.Text);
string password = cmd2.ExecuteScalar().ToString();
ExecuteScalar
将执行查询并返回第一行第一列中的值。只是它,但这并不意味着不能接受空值。如果在读取值之前检查该值是否为空,那就太好了。您忘记了命令中的@
。对于示例:
cmd.Parameters.AddWithValue("@username", usernameTxt.Text);
SqlCommand cmd2 = new SqlCommand(checkPassword, conn);
cmd2.Parameters.AddWithValue("@username", usernameTxt.Text);
string password = cmd2.ExecuteScalar().ToString();
在由cmd2
定义的第二个命令中,您没有为示例定义username
参数:
cmd.Parameters.AddWithValue("@username", usernameTxt.Text);
SqlCommand cmd2 = new SqlCommand(checkPassword, conn);
cmd2.Parameters.AddWithValue("@username", usernameTxt.Text);
string password = cmd2.ExecuteScalar().ToString();
ExecuteScalar
将执行查询并返回第一行第一列中的值。只是它,但这并不意味着不能接受空值。如果您在读取值之前检查值是否为空,那就太好了。啊,我现在看到了,我已经重新运行了代码,但仍然收到相同的错误。@DonaldBury-我将您的代码减少为1个数据库调用。错误信息仍然完全相同吗?非常感谢!这很有魅力。非常感谢你花时间和精力帮助我。@DonaldBury-还有一张便条。如果这是真实的实时数据(即不是学校或其他有趣的/个人的),则不应将密码存储为纯文本。而是存储密码的散列,然后将存储的散列与生成的输入散列进行比较,看看它们是否相同。有很多关于这方面的现有文章,所以我不想为此费心,但是所选择的哈希算法很重要,所以请阅读最近的一篇文章,因为这些算法在受到损害时会定期被替换。啊,我现在明白了,我已经重新运行了代码,但仍然收到相同的错误。@DonaldBury-我将您的代码缩减为1个数据库调用。错误信息仍然完全相同吗?非常感谢!这很有魅力。非常感谢你花时间和精力帮助我。@DonaldBury-还有一张便条。如果这是真实的实时数据(即不是学校或其他有趣的/个人的),则不应将密码存储为纯文本。而是存储密码的散列,然后将存储的散列与生成的输入散列进行比较,看看它们是否相同。关于这一点,已有很多文章,所以我不想为此费心,但选择的散列算法很重要,所以请阅读最近的一篇文章,因为这些算法在受到损害时会定期更换。我已经纠正了这一点,并意识到了这个小错误。这是因为测试出我可以改变什么使它工作。但是错误仍然指向字符串password=cmd2.ExecuteScalar().ToString();并显示标量声明错误System.Data.SqlClient.SqlException类型的异常发生在System.Data.dll中,但未在用户代码中处理其他信息:必须声明标量变量“@username1”。是否确实为参数定义了正确的名称username
不等于username1
。完全正确。我反复检查,然后再次检查,阿加尼已经纠正了这一点,并意识到这个小错误。这是因为测试出我可以改变什么使它工作。但是错误仍然指向字符串password=cmd2.ExecuteScalar().ToString();并显示标量声明错误System.Data.SqlClient.SqlException类型的异常发生在System.Data.dll中,但未在用户代码中处理其他信息:必须声明标量变量“@username1”。是否确实为参数定义了正确的名称username
不等于username1
。完全正确。我检查了一遍又检查了一遍