2013-04-20 2 views
0

Привет всем, в основном у меня есть приложение C#, которое позволяет пользователю вводить свой запрос об автомобилях на складе (поля являются автопроизводителем, моделью, возрастом, объемом литра).Select Query возвращает пустую запись

Содержимое запроса может отличаться в зависимости от того, в каких полях пользователь ищет (например, человек может искать все автомобили Ford или другой запрос, возможно, все автомобили Ford, которым 6 лет).

После ввода запроса программа ДОЛЖНА вернуть данные, запрошенные в dataGridView в форме. Моя проблема заключается в том, что запрос выполняется, но возвращает только пустую запись, как будто он не может найти подходящую запись (я только ввел запрос, который обязательно вернет запись). Это привело меня к тому, что что-то не так с моим кодированием (особенно с параметрами), но я не могу понять, где я ошибаюсь, может кто-нибудь протянуть руку?

  string ConnStr = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = H:\\School Work\\Computing A Level\\Stock checker\\Program\\Morgan's Motors Database.mdb;"; 

      OleDbConnection conn_database = new OleDbConnection(); 
      conn_database.ConnectionString = ConnStr; 

      OleDbCommand comm_database = new OleDbCommand(); 
      comm_database.CommandText = "SELECT * FROM [Car Info] WHERE ? = ?"; 
      comm_database.Connection = conn_database; 
      conn_database.Open(); 

      OleDbDataAdapter adap_database = new OleDbDataAdapter(comm_database); 

      DataTable data_database = new DataTable(); 

      for (int i = 0; i < ColumnName.Count; i++) 
      { 
       comm_database.Parameters.AddWithValue("?", ColumnName[i].ToString()); 
       comm_database.Parameters.AddWithValue("?", EnteredFields[i].ToString()); 

       adap_database.Fill(data_database); 

      } 

      BindingSource bind_database = new BindingSource(); 
      bind_database.DataSource = data_database; 

      dataGridView1.DataSource = bind_database; 

ответ

0

Я думаю, ваша проблема - ваш выбор. Вы должны явно указать свои параметры в своем командном тексте. Заявление вы используете: поэтому

"SELECT * FROM [Car Info] WHERE ? = ?" 

следует изменить на что-то вроде этого (в зависимости от параметра)

"SELECT * FROM [Car Info] WHERE BRAND = ? AND ..." 

Смотри также: OleDbCommand parameters order and priority

+0

Благодарим за отзыв. Проблема, с которой я сталкиваюсь в использовании AND, заключается в том, что иногда пользователь может запрашивать только один столбец, а также как я могу сообщить код, если не добавить AND? – HuwF

+0

Взгляните на это: http://stackoverflow.com/questions/11099547/how-can-i-set-the-parameters-for-the-sql-query-optional – MUG4N

1

Две вещи мне странно:

comm_database.CommandText = "SELECT * FROM [Car Info] WHERE ? = ?"; 
  1. имя поля должно быть реальным, а не «?» (но значение «?» верно для значения).
  2. в вашем запросе вы указываете только один файл с паролем = значение, но ниже цикла и добавьте параметры в свою команду db. поскольку они не связаны ни с чем в вашем тексте sql, он не будет работать так, как ожидалось.

comm_database.CommandText = "SELECT * FROM [Car Info] WHERE";

for (int i = 0; i < ColumnName.Count; i++) 
{ 

    comm_database.CommandText += (i>0 ? " AND " : "") ColumnName[i].ToString() + " = ?"; 

    comm_database.Parameters.AddWithValue("?", EnteredFields[i].ToString()); 

} 
+0

Хорошо, но измените 'ColumnName.Count> 0' to 'i> 0', а использование StringBuilder лучше, чем конкатенация строк в петле неизвестной длины. – Steve

+0

Первая строка строки comm_database дает мне ошибку после части в скобках, тоже ли она заключена в скобки? – HuwF

+0

Не может это объяснить? Я нахожусь на своем пути с проблемой – HuwF

0

Имена столбцов не могут быть связаны параметрами. ...

comm_database.Parameters.AddWithValue("?", ColumnName[i].ToString()); 

... интерпретируется как значение, а не как имя столбца.

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

Это одна из тех ситуаций, когда динамический SQL является целесообразным: построить текст SQL во время выполнения, когда все критерии поиска, как известно (вы должны по-прежнему использовать параметры для значений поиска), что-то вроде этого:

"SELECT * FROM [Car Info] WHERE COLUMN1 = ? AND COLUMN2 = ?" (etc...) 

Обязательно укажите, что COLUMN1, COLUMN2 и т. Д. Являются белыми или «дезинфицированными» перед вставкой в ​​текст SQL.

Есть способы использовать статический SQL даже перед лицом таких изменяющихся критериев поиска, но это может быть unintended consequences performance-wise.

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