2015-10-23 3 views
0

мне нужно искать таблицы в combobox1 с текстом пользователь будет входить в autoCompleteTextbox1, и это может быть itemcode или itemnameC# текстового поля автозаполнения из таблицы SQL

, но я получаю ошибку говорит:

Дополнительная информация: Имя переменной «@name» уже объявлено . Имена переменных должны быть уникальными в рамках пакета запросов или хранимой процедуры.

if (cn.State == ConnectionState.Closed) 
     { 
      cn.Open(); 
     } 
     cm.Connection = cn; 
     if (autoCompleteTextbox1.Text == "") 
     { 
     } 
     else 
     { 
      AutoCompleteStringCollection namecollection = new AutoCompleteStringCollection(); 
      string searchFor = "%" + autoCompleteTextbox1.Text + "%"; //the string the user entered. 
      string tableName = comboBox1.Text; 
      cm.CommandText = @"SELECT distinct(itmcode+''+itmname) AS name FROM " + tableName + " WHERE itmcode Like @name OR itmname LIKE @name"; 

      cm.Parameters.AddWithValue("@name", searchFor); 
      SqlDataReader rea = cm.ExecuteReader(); 
      if (rea.HasRows == true) 
      { 
       while (rea.Read()) 
        namecollection.Add(rea["name"].ToString()); 
      } 
      rea.Close(); 

      autoCompleteTextbox1.AutoCompleteMode = AutoCompleteMode.Suggest; 
      autoCompleteTextbox1.AutoCompleteSource = AutoCompleteSource.CustomSource; 
      autoCompleteTextbox1.AutoCompleteCustomSource = namecollection; 

что ошибка в моем коде, и как это исправить плз

ответ

1

Переменная cm представляет собой команду.

Поскольку ошибка cm.Parameters.AddWithValue("@name", searchFor); с ошибкой The variable name '@name' has already been declared., вы можете заключить, что переменная cm проживает дольше этого блока кода.

Вы можете

1) Инициализировать команды каждый раз (это то, что большинство людей). , например.

 cm = new SqlCommand(); //Assumes sql server 
    cm.Connection = cn; 

или

2) Проверьте cmd.Parameters для параметра @name, а затем добавить, если он не существует, а затем установить его.

if (!(cmd.Parameters.Contains("@name") 
{ 
    cmd.Paramters.Add("@name",SqlDbType.Varchar) 
} 

cmd.Paramters["@name"].Value = serachFor; 

Замечания по SQL Injection с FROM " + tableName + " WHERE.

comboBox1.Text является то, что заполнит TABLENAME. Это только опасная строка, если это строка, которую пользователи могут изменить (например, веб-страницу). Если это приложение WPF или Window Forms, то это не опасно. *

Если comboBox1.Text с веб-страницы, то лучше всего использовать белый список, чтобы проверить, что строка не была изменена и если он не должен возвращать какие-либо результаты. Например

if (!ValidTableNames.Contains(tableName)) 
    return; 

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

* Технически они могут изменять значения с помощью инструментов отладчика, но в этот момент они могут просто изменить текст команды в любом случае.

+0

спасибо за ответ, и мне нужно спросить у как переинициализировать команды каждый раз? – user5456980

+0

моя проблема в том, что я хочу использовать параметры из-за sql-инъекции. – user5456980

+0

теперь работает, но одна проблема осталась :) ..данные появляются в автозаполнении, это данные в 2 столбцах, объединенные рядом друг с другом, но я хотел показать совпадения того, что я ввел. В текстовом поле означает, что если я ввел значение, которое было найдено в столбце itmcode, отображаются только результаты в столбце itmcode и если я ввожу значение, найденное в столбце itmname, оно отображает только имена – user5456980

0

Заменить

string searchFor = "%" + autoCompleteTextbox1.Text + "%"; //the string the user entered. 
      string tableName = comboBox1.Text; 
      cm.CommandText = @"SELECT distinct(itmcode+''+itmname) AS name FROM " + tableName + " WHERE itmcode Like @name OR itmname LIKE @name"; 

      cm.Parameters.AddWithValue("@name", searchFor); 

ти

string searchFor = "%" + autoCompleteTextbox1.Text + "%"; 
string tableName = comboBox1.Text; 
cm.CommandText = @"SELECT distinct(itmcode+''+itmname) AS name FROM " + tableName + " WHERE itmcode Like '" + searchFor + "' OR itmname LIKE '" + searchFor + "'"; 
+0

Это просто просит SQL-инъекции. – LarryBud

+0

как насчет замены кавычек внутри строки с помощью функции Replace –

Смежные вопросы