Должен объявить скалярную переменную "@UserName" - PullRequest
4 голосов
/ 20 января 2012

Я получаю ошибку, которую не понимаю.Нужно объявить скалярную переменную "@varname"

Десятки часов исследований, пробовать несколько решений без успеха.

Моя цель - создать страницу входа, которая использует 2 текстовых поля и кнопку,где он проверяет, выходит ли пользователь, основываясь на информации, хранящейся в базе данных Sql.

Здесь я думаю, что проблема исходит от:

private bool DBConnection(string userName, string password)
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

    //string cmdString = ("SELECT UserName, Password FROM Users WHERE UserName ='" + userName +
    //                    "'AND Password ='" + password + "'");         //REMOVED AS THIS IS PRONE TO SQL INJECTIONS

    string cmdString = ("SELECT * FROM Users WHERE UserName = @uname AND Password = @pw");

    SqlCommand cmd = new SqlCommand(cmdString, conn);

    cmd.Parameters.Add("uname", SqlDbType.VarChar).Value = userName;
    cmd.Parameters.Add("pw", SqlDbType.VarChar).Value = password;

    DataSet loginCredentials = new DataSet();
    SqlDataAdapter dataAdapter;

    try
    {
        if (conn.State.Equals(ConnectionState.Closed))
        {
            conn.Open();

            dataAdapter = new SqlDataAdapter(cmdString, conn);
            dataAdapter.Fill(loginCredentials);

            conn.Close();

            if (loginCredentials != null)
            {
                if (loginCredentials.Tables[0].Rows.Count > 0)
                {
                    return true;
                }
                else
                {
                    lblMessage.Text = "Incorrect Username or Password";
                    lblMessage.Visible = true;
                }
            }   
        }
    }
    catch (Exception err)
    {
        lblMessage.Text = err.Message.ToString() + " Error connecting to the Database // " + cmd.Parameters.Count;
        lblMessage.Visible = true;
        return false;
    }

    return false;
}

, в частности, от куда "dataAdapter.Fill(loginCredentials);»

закомментированный оператор успешно работает при входе в систему пользователя с правильными именем пользователя и паролем, но, насколько я знаю, небезопасен, так как уязвим для инъекций sql, и поэтому япри попытке параметризовать оператор SQL.

снимок экрана ошибки ниже: Error screenshot.

любая помощь будет оценена.

Ответы [ 5 ]

3 голосов
/ 20 января 2012

Редактировать: Вы должны передать команду sql в dataAdapter, потому что в вашем случае команда sqlcom (cmd) имеет больше информации, чем просто командный текст и строка соединения. Ваш код может выглядеть следующим образом:

private bool DBConnection(string userName, string password)
{
 SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

//string cmdString = ("SELECT UserName, Password FROM Users WHERE UserName ='" + userName +
//                    "'AND Password ='" + password + "'");         //REMOVED AS THIS IS PRONE TO SQL INJECTIONS

string cmdString = ("SELECT * FROM Users WHERE UserName = @uname AND Password = @pw");

SqlCommand cmd = new SqlCommand(cmdString, conn);

cmd.Parameters.Add("uname", SqlDbType.VarChar).Value = userName;
cmd.Parameters.Add("pw", SqlDbType.VarChar).Value = password;

DataSet loginCredentials = new DataSet();
SqlDataAdapter dataAdapter;

try
{
    if (conn.State.Equals(ConnectionState.Closed))
    {
        conn.Open();

        dataAdapter = new SqlDataAdapter(cmd);
        dataAdapter.Fill(loginCredentials);

        conn.Close();

        if (loginCredentials != null)
        {
            if (loginCredentials.Tables[0].Rows.Count > 0)
            {
                return true;
            }
            else
            {
                lblMessage.Text = "Incorrect Username or Password";
                lblMessage.Visible = true;
            }
        }   
    }
}
catch (Exception err)
{
    lblMessage.Text = err.Message.ToString() + " Error connecting to the Database // " + cmd.Parameters.Count;
    lblMessage.Visible = true;
    return false;
}

return false;
}
3 голосов
/ 20 января 2012

Вам нужно передать cmd в конструктор SqlDataAdapter вместо объектов cmdString и conn.

2 голосов
/ 20 января 2012

Помимо всей ошибки, описанной ниже (или выше;)) .. вы передаете командную строку и соединение с адаптером данных, но вы заполняете параметры для команды, которую вы не используете ..;) так что у вас есть несколько ошибок ...

2 голосов
/ 20 января 2012
cmd.Parameters.Add("@uname", SqlDbType.VarChar).Value = userName;

Обратите внимание на @ перед uname.

0 голосов
/ 17 февраля 2015

Самое главное, чтобы сначала проверить, присвоено ли определенное значение конкретной переменной, т.е.

cmd.parameter.add(@YOUR_VARIABLE, sqlDbtype.TYPE).value = ValueYouwantToGIveToThatVariable;
...