c#中的标量变量声明

时间:2016-04-20 19:33:40

标签: c# sql-server ado.net

当我尝试检查数据库中的密码和用户名是否为真时,我收到以下错误。

以下是以下错误:

  

发生了'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");
    }
}

2 个答案:

答案 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,那应该很好。