2015-03-30 4 views
1

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

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

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

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

+0

. Что означает 'form1.filterType(). Trim()' точно возвращается? –

ответ

0

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

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

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

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

Вот пример;

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 в этом примере, но этот способ might be dangerous in some cases. Использование .Add() перегрузок для указания его типа db и размера параметра неявно было бы лучше.

+0

О, хорошо, я этого не знал, и он принял это. Я все еще не знаю, что случилось с последним значением ... Могу ли я использовать ExecuteNonQuery для заполнения таблицы данных? –

+0

Первый параметр в методе AddWithValue также должен иметь значение так, чтобы оно было похоже на «@filter», и вы не можете использовать ExecuteNonQuery для заполнения DataTable, SqlDataAdapter - это правильный способ достичь этого. – MajkeloDev

+0

Даже когда я использую @filter, я получаю ту же ошибку, и когда я пытаюсь просто использовать «= @cusId», я получаю то же самое, поэтому он вообще не работает. Что не так с данным datatable? –

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; 
       } 

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