Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中的标量变量声明#_C#_Sql Server_Ado.net - Fatal编程技术网

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
。完全正确。我检查了一遍又检查了一遍