Primo Chalice Ответов: 2

Как импортировать данные из определенного столбца в SQL для метки в C#?


Привет,

Я пытаюсь извлечь данные из таблицы в SQL Server для маркировки в моей форме Windows. Он показывает мне нулевую ошибку исключения, и я не могу понять, почему.

Я получаю эту ошибку:
Система.IndexOutOfRangeException: '@Name' на следующей строке:
Табличка с именем.Text = reader["@Name"].Метод toString();

Я сохраняю его в строке, потому что вызываю значение в другой форме.

Пожалуйста помочь.

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

string queryText = @"SELECT Count(*) FROM NewsClip_Login 
                             WHERE Username = @Username AND Password = @Password";

                using (SqlConnection cn = new SqlConnection("Data Source=PRIMO-CHALICE;Initial Catalog=NewsClip;Integrated Security=True"))
                using (SqlCommand cmd = new SqlCommand(queryText, cn))
                {
                    cn.Open();
                    cmd.Parameters.AddWithValue("@Username", UsernameTextBox.Text);
                    cmd.Parameters.AddWithValue("@Password", PasswordTextBox.Text);
                    cmd.Parameters.AddWithValue("@Name", NameLabel.Text);
                    SqlDataReader reader = cmd.ExecuteReader();

                    reader.Read();
                    NameLabel.Text = reader["@Name"].ToString();
                    NameLabelText = NameLabel.Text;
                    reader.Close();

                    int result = (int)cmd.ExecuteScalar();
                    if (result > 0)
                    {
                        this.Hide();
                        NewsClip_Main nc_main = new NewsClip_Main();
                        nc_main.Enabled = true;
                        nc_main.ShowDialog();

                        this.Close();
                    }
                    else
                        MessageBox.Show("User Not Found!");
                    cn.Close();

2 Ответов

Рейтинг:
2

Rajat-Indiandotnet

Извините, я не понял, что ваш SQL-оператор не имеет столбца Name

SELECT Count(*) FROM NewsClip_Login

У вас должно быть columnname, если вы используете reader, например, если вы извлекаете значение name, то у вас должен быть столбец name в вашем операторе select.

Удалите @ из читателя, это должно быть reader ["Name"]


Primo Chalice

Ошибка все еще существует.
Система.IndexOutOfRangeException: 'Name'

Рейтинг:
0

Wendelius

У вас нет параметра под названием @name в вашем SQL-операторе. Возможно, вы хотели выбрать его как

SELECT Name FROM NewsClip_Login WHERE Username = @Username AND Password = @Password";

Если это то, что вы пытаетесь сделать, то вы ссылаетесь на столбцы результатов wiuthout@, так как они используются для параметров.

Еще одна вещь, касающаяся пароля. Никогда не храните пароли в виде обычного текста. Они всегда должны быть хешированы в одну сторону. Взгляните на это Хранение паролей: как это сделать.[^]

ДОПОЛНЕНИЕ
-----------
string queryText = @"SELECT Name FROM NewsClip_Login WHERE Username = @Username AND Password = @Password";

using (SqlConnection cn = new SqlConnection("Data Source=PRIMO-CHALICE;Initial Catalog=NewsClip;Integrated Security=True")) {
   using (SqlCommand cmd = new SqlCommand(queryText, cn))
   {
      cn.Open();
      cmd.Parameters.AddWithValue("@Username", UsernameTextBox.Text);
      cmd.Parameters.AddWithValue("@Password", PasswordTextBox.Text);
      SqlDataReader reader = cmd.ExecuteReader();

      reader.Read();
      NameLabel.Text = reader["Name"].ToString();
      NameLabelText = NameLabel.Text;
      reader.Close();
      ...


Primo Chalice

Ошибка все еще существует.

Wendelius

Вы также удалили код, чтобы добавить параметр в свою команду. Взгляните на измененный ответ.

Primo Chalice

Я попробовал модифицированный код, и я думаю, что он работал, но пришел с новой ошибкой.
"Система.InvalidCastException: 'указанное приведение недопустимо.'" on "int result = (int)cmd.Executescalar так();"

Wendelius

ExecuteScalar возвращает данные из первого столбца первой строки результирующего набора. Теперь, когда мы изменили COUNT(*) к Name он больше не возвращает int.

Если вам все еще нужен счетчик, вам нужно сделать отдельный запрос для этого. Однако, если подсчет действительно необходим, может ли быть несколько пользователей с одинаковым именем и паролем? В конце концов, когда вы получаете с помощью считывателя, вы уже знаете, существует ли пользователь или нет.

Primo Chalice

Итак, теперь в состоянии (если), что я должен написать, чтобы проверить, существует ли пользователь или нет?

Primo Chalice

Я только что попробовал использовать данные, присутствующие в SQL, и это работает. Ошибка отображается, когда данные отсутствуют.
Система.InvalidOperationException: "недопустимая попытка чтения при отсутствии данных".