Я уже опубликовал этот вопрос, потому что у меня были проблемы с оператором "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
Я получаю ту же ошибку
Как уже отмечалось, вы совершенно не работаете с параметрами. Ваш SqlCommand должен быть чем-то вроде этого:
SqlCommand sqlcmd = new SqlCommand(@"SELECT cusId,cusName FROM " + form1.getTable() + " WHERE cusId LIKE @filter", connection);
Обратите внимание, что столбцы, которые вы пытаетесь выбрать, не являются параметрами (поэтому не включайте символ "@").
Когда вы добавляете параметры, вам нужно добавить символ "@". Что-то вроде этого:
sqlCmd.Parameters.AddWithValue("@cusId", form1.cusId.Text);
Наконец решил! Я пытался:
using (sqlDatAdapter = new SqlDataAdapter(sqlCmd.CommandText, connection))
{
sqlDatAdapter.SelectCommand.Parameters.Add("@filter", SqlDbType.Int, 25).Value = CusIdEnter;
sqlDatAdapter.Fill(datTable);
form1.setDataGrid = datTable;
}
и теперь это работает! Нужно было привязать параметры к адаптеру
Вы не можете параметризовать имена таблиц и столбцов. Вы можете параметризовать только ваши значения.
Если вы действительно хотите получить имена таблиц и столбцов динамически, вы можете использовать динамический 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 и размер параметра неявно будут лучше.
cusId
иcusName
или вы пытаетесь их параметризовать?