Daniel Andrei Popescu Ответов: 1

Ошибка"необходимо объявить скалярную переменную @username"


Привет,

У меня есть проблема с моим кодом,особенно в форме входа в систему.Я хочу войти в свое приложение,но когда я ввожу учетные данные,я получаю ошибку"должен объявить переменную @UserName".Я установил точку останова,чтобы увидеть,является ли значение нулевым, но это не так, все работает, кроме имени пользователя.Я просмотрел переплет и синтакс, и все в порядке.Это виртуальная машина:
public void SubmitButton(object param)
       {

           SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\user0909\Documents\AttendanceListStudents.mdf;Integrated Security=True;Connect Timeout=30");
           try
           {



               if (conn.State == System.Data.ConnectionState.Closed)
                   conn.Open();
               String query = "SELECT COUNT (*) FROM RegisterTeacher WHERE UserName=@UserName,pwd=@pwd and pwd2=@pwd2";
               SqlCommand cmd = new SqlCommand(query, conn);
               cmd.CommandType = CommandType.Text;


               cmd.Parameters.AddWithValue("@UserName", SqlDbType.NVarChar).Value =_UserName;//here I have the error
               SqlParameter Pwd = cmd.Parameters.AddWithValue("@pwd", SqlDbType.Char);

               cmd.Parameters["@pwd"].Value = TestPassword;
               if (Pwd.Value == null)
               {
                   Pwd.Value = DBNull.Value;
               }
               SqlParameter Pwd2 = cmd.Parameters.AddWithValue("@pwd2", SqlDbType.Char);
               //cmd.Parameters["@pwd"].Value = _pwd.pwd;
               cmd.Parameters["@pwd2"].Value = pwd2;
               if (Pwd2.Value == null)
               {
                   Pwd2.Value = DBNull.Value;
               }
               SqlDataAdapter da = new SqlDataAdapter(query, conn);
               DataTable dt = new DataTable();
               da.Fill(dt);
               if(dt.Rows.Count==1)
               {
                   TestPassword = dt.Rows[0][1].ToString();
                   byte[] hashBytes = Convert.FromBase64String(TestPassword);
                   byte[] salt = new byte[16];
                   Array.Copy(hashBytes, 0, salt, 0, 16);
                   var pbkdf2 = new Rfc2898DeriveBytes(TestPassword, salt, 10000);
                   byte[] hash = pbkdf2.GetBytes(20);
                   int count = Convert.ToInt32(cmd.ExecuteScalar());
                   for (int i = 0; i < 20; i++)
                   {
                       if(hashBytes[i+16]!=hash[i])
                           {
                           count = 0;
                       }if(count==1)
                       {
                           var app = new TextBoxFocusView();
                           var context = new TextBoxFocusDb();
                           app.DataContext = context;
                           app.Show();
                       }
                   }
               }

И это datacontext int представление:
<Label Content="Username" Foreground="White"/>
        <TextBox Name="txtusername" Text="{Binding Path=UserName}"   Background="#545d6a" Foreground="White" FontSize="18"/>
        <Label Content="Password"     Foreground="White"/>
        <PasswordBox x:Name="passwordBox"
                     MaxLength="10"
                local:PasswordHelper.BindPassword="true"
                     local:PasswordHelper.BoundPassword="{Binding Path=TestPassword, Mode=TwoWay, ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}"
            PasswordChar="*"
                     Background="#545d6a"
                     Foreground="White"
         FontSize="18"/>

Может ли кто-нибудь помочь мне понять, в чем проблема?Заранее благодарю вас!

Что я уже пробовал:

I have tried multiple things to make it work,I tried creating another variable and assigning the value to it,I tried this:
<a href="https://stackoverflow.com/questions/8933634/must-declare-the-scalar-variable-username">c# - Must declare the scalar variable "@UserName" - Stack Overflow</a>[<a href="https://stackoverflow.com/questions/8933634/must-declare-the-scalar-variable-username" target="_blank" title="New Window">^</a>]

c# - необходимо объявить скалярную переменную "@username". Как это преодолеть - переполнение стека[^]

Herman&lt;T&gt;.Instance

Каково значение в _UserName? Если это значение равно NULL, то параметр не отправляется в базу данных. Чтобы преодолеть эту проблему, установите нулевое значение в DBNull.Ценность. В этом случае параметр отправляется в базу данных.

Daniel Andrei Popescu

Спасибо за ваш ответ.Это не ноль.Он имеет ценность,вот в чем проблема.Когда я устанавливаю точку останова и вставляю значение в текстовое поле,а затем отлаживаю его, я получаю значение без каких-либо проблем.

1 Ответов

Рейтинг:
2

OriginalGriff

AddwithValue так не пишется:

cmd.Parameters.AddWithValue("@UserName", SqlDbType.NVarChar).Value =_UserName;//here I have the error
Так и должно быть:
cmd.Parameters.AddWithValue("@UserName", _UserName);

Исправьте это, это должно сработать.И это тоже исправь:
cmd.ParametersAddWithValue("@pwd", TestPassword);

Но не делайте таких паролей! Никогда не храните пароли в открытом виде - это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^] - это, вероятно, немного продвинуто для вас, но просто используйте код и не беспокойтесь о том, как он работает в данный момент.


Daniel Andrei Popescu

Спасибо за совет.Что касается моего пароля,то да,я попытался зашифровать его и проверить,совпадают ли два хэш-значения, как у меня есть в моей функции.Я не понимаю синтакса"хранить пароль в открытом тексте".У меня есть поле пароля,которое я использую в представлении, у меня есть класс passwordhelper, из которого я связываю поле пароля, а также шифрую его, когда храню значения в БД и выбираю их из базы данных. Что касается параметра UserName,то он по-прежнему не работает.Я тоже пробовал это.Таким образом,в основном он считывает значение, но не принимает учетные данные, потому что я не установил переменную.