Параметризованные SQL-запросы не работают

1

Я уже опубликовал этот вопрос, потому что у меня были проблемы с оператором "LIKE", но теперь я понял, что есть проблемы с параметризованными операторами вообще. Вот мой код:

например, когда я пишу:

 sqlCmd = new SqlCommand(@"SELECT @cusId,@cusName FROM " + form1.getTable() + " WHERE @cusId LIKE @filter", connection);

 sqlCmd.Parameters.AddWithValue("cusId", form1.cusId.Text);
 sqlCmd.Parameters.AddWithValue("cusName", form1.cusName.Text);
 sqlCmd.Parameters.AddWithValue("filter", form1.filterType().Trim() + "%");

 sqlDatAdapter = new SqlDataAdapter(sqlCmd.CommandText, connection);
            sqlDatAdapter.Fill(datTable);
            form1.setDataGrid = datTable;

Как-то я всегда получаю

 "Must declare the scalar variable @..." 

для каждой переменной, когда я заполняю таблицу данных. Я пробовал это уже с

 sqlCmd.ExecuteNonQuery();

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

EDIT: Даже когда я просто пытаюсь написать что-то вроде:

 ... WHERE cusId.Text = @cusId

Я получаю ту же ошибку

  • 0
    Ваши имена столбцов cusId и cusName или вы пытаетесь их параметризовать?
  • 0
    Это имена столбцов, но даже когда я их опускаю и просто использую переменную фильтра по-разному, я получаю ту же ошибку
Показать ещё 2 комментария
Теги:
parameters

3 ответа

1

Как уже отмечалось, вы совершенно не работаете с параметрами. Ваш SqlCommand должен быть чем-то вроде этого:

SqlCommand sqlcmd = new SqlCommand(@"SELECT cusId,cusName FROM " + form1.getTable() + " WHERE cusId LIKE @filter", connection);

Обратите внимание, что столбцы, которые вы пытаетесь выбрать, не являются параметрами (поэтому не включайте символ "@").

Когда вы добавляете параметры, вам нужно добавить символ "@". Что-то вроде этого:

sqlCmd.Parameters.AddWithValue("@cusId", form1.cusId.Text);    
  • 0
    Да, я попробовал это теперь с параметрами, и это показывает мне все ту же ошибку ... даже когда я оставляю имена столбцов, как они (непосредственно взяты из текстовых полей)
0

Наконец решил! Я пытался:

  using (sqlDatAdapter = new SqlDataAdapter(sqlCmd.CommandText, connection))
                {
                    sqlDatAdapter.SelectCommand.Parameters.Add("@filter", SqlDbType.Int, 25).Value = CusIdEnter;
                    sqlDatAdapter.Fill(datTable);
                    form1.setDataGrid = datTable;
                }

и теперь это работает! Нужно было привязать параметры к адаптеру

0

Вы не можете параметризовать имена таблиц и столбцов. Вы можете параметризовать только ваши значения.

Если вы действительно хотите получить имена таблиц и столбцов динамически, вы можете использовать динамический SQL, но это плохая идея.

Лучший способ получить имена столбцов динамически - это создать сильную проверку имен столбцов или создать для них черный список.

Использование ExecuteNonQuery ничего не производит, поскольку просто выполняет ваш запрос, не возвращает никаких данных. Также using инструкцию using для управления вашими соединениями, командами и адаптером.

Вот пример;

string str = string.Format("SELECT {0}, {1} FROM {2} WHERE {0} LIKE @filter",
                           form1.cusId.Text,
                           form1.cusName.Text,
                           form1.getTable());

sqlCmd = new SqlCommand(str, connection);
sqlCmd.Parameters.AddWithValue("@filter", form1.filterType().Trim() + "%");

sqlDatAdapter = new SqlDataAdapter(sqlCmd);
sqlDatAdapter.Fill(datTable);

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

AddWithValue этом примере я использовал AddWithValue но в некоторых случаях этот метод может быть опасным. Использование .Add() перегрузок, чтобы указать, что тип db и размер параметра неявно будут лучше.

  • 0
    О, хорошо, я не знал этого, и он принял это. Я до сих пор не знаю, что не так с последним значением ... Могу ли я использовать ExecuteNonQuery для заполнения таблицы данных?
  • 0
    Первый параметр в методе AddWithValue также должен иметь значение at, поэтому он должен быть похож на "@filter", и вы не можете использовать ExecuteNonQuery для заполнения DataTable, SqlDataAdapter - верный способ добиться этого.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню