2016-08-14 3 views
0

. Я пытаюсь найти строку, содержащуюся в любом столбце таблицы sql, добавив все имена полей в предложение WHERE, используя цикл for. Также я использую параметры для защиты от SQL-инъекций. Но когда я бегу я получаю сообщение об ошибке, как это:Unspecified Ошибка при поиске таблицы для строки в sql delphi с использованием параметров - Delphi SQL

Unspecified error

Как это можно исправить, и что это проблема (не обязательно в таком порядке). Вот мой код. Я пользуюсь Delphi 7

procedure TfrmView.edtSearchChange(Sender: TObject); 
var 
    i, i2: integer; 
    obj: TEdit; 
    QueryText: string; 
begin 
    obj:= Sender as TEdit; 

    with dmInfo do 
    begin 
     qryInfo.SQL.Clear; 
     qryInfo.SQL.Add('SELECT * FROM ' + tableName); 
     qryInfo.Open; 

     tblInfo.SQL.Clear; 
     tblInfo.SQL.Add('SELECT * FROM ' + tableName); 
     tblInfo.SQL.Add('WHERE (' + qryInfo.Fields[0].FieldName + ' LIKE :SQuery0)'); 
     QueryText:= '%' + obj.Text + '%'; 
     tblInfo.Parameters.ParamByName('SQuery0').Value:= QueryText; 
     ShowMessage(QueryText); 
     ShowMessage(tblInfo.Parameters.ParamByName('SQuery0').Value); 
     for i:= 1 to qryInfo.FieldCount - 1 do 
     begin 
      tblInfo.SQL.Add(' OR (' + qryInfo.Fields[i].FieldName + ' LIKE :SQuery' + IntToStr(i) + ')'); 
      tblInfo.Parameters.ParamByName('SQuery' + IntToStr(i)).Value:= '%' + obj.Text + '%'; 
     end; 
    tblInfo.Open; 
end; 
+0

Вы перепутать '' Field.FieldName' и Field.Value' снова. При настройке значений параметров вы хотите использовать ** содержимое ** поля **, а не ** имя ** поля **. Вам действительно нужно научиться действительно читать код, который вы пишете. –

+0

Извините, что наклеил неправильный код. Собирался написать вопрос вчера, но только написал его сегодня. Я редактировал код вопроса. Такая же ошибка, как раньше @KenWhite –

+0

Поместите TMemo в свою форму и, прежде чем вызывать tblInfo.Open, скопируйте в него tblInfo.Sql.Text. Я подозреваю, что вы увидите свою ошибку. – MartynA

ответ

-1

Весь код не имеет смысла.

  • Вы позволяете коду запускать каждый раз, когда вы меняете письмо. запуска по событию OnChange
  • пять ввода/букв в поле ввода edtSearch означает, что код выполняется пять раз без перерыва сразу
  • Если удалить все содержимое в поле ввода edtSearch сразу, , который также является изменение мероприятие. На этот раз он работает с пустого edtSearch.text
  • Как вы можете ожидать, что это работает без исключений
  • Открывает каждый раз, когда две таблицы, не закрывать их раньше.
  • Вы используете переменную, которая предполагает, что это событие также является , подключенным к другим TEdits.

    obj: TEdit;
    obj: = Отправитель как TEdit;

  • Вы очищаете SQL на открытой таблице.

  • у вас есть две таблицы, первый ничего не делает больше, чем SQL.clear и открытый
  • Вы используете поля из первой таблицы и создать SQL для второй таблицы
  • Даже если обе таблицы одинаковы, нет смысла использовать поля из первой таблицы.
    Это путаница, вводящая в заблуждение и ненужная.

Прежде всего удалить код из события OnChange

Что вы хотите сделать с этим кодом
для поиска значений всех полей из tblInfo может быть сделано без первого tabel qryInfo

Вам не нужно увеличивать параметры.

Не создавайте Params все время от SQuery1 к возможно SQuery100

, если вы используете только один из параметров (значение поиска всегда одинакова)
Вы можете установить все Params с одним использованием tblInfo.Parameters.ParamByName() перед tblInfo.Open
, но НЕ в петле.

Это заменит все Params :SQuery сразу со значением

SQL.Text:

SELECT * FROM tableName 
WHERE (IDmember LIKE :SQuery) 
OR (memberName LIKE :SQuery) 
OR (petName LIKE :SQuery) 
OR (Address LIKE :SQuery) 

Максимальная длина SQL Заявление

Отличается от базы данных в базу данных

Сколько предложений OR можно использовать в одном условии WHERE в запросе MySql?

Я знаю, что в прошлом был предел. Но теперь знания экспертов отличается

только один из мнений

The truth is that it's limited to the resources available on the database, the size of the data set in question, the indexes being addressed (or lack thereof) and the complexity of each clause.

If your goal is to find a person record that meets multiple criteria, I am willing to bet you won't run in to a limit. You could easy OR condition with 20 to 30 conditions and no user is going to provide more that that/person records won't have more than one that meets that many conditions.

+0

Вы понимаете, как работает объект 'Parameters'? –

+0

Я знаю, что он не работает прямо в ** любой позиции ** в запросе. Также используйте значение, указанное в поле (int). Я также узнал, что вы не можете разместить **: xyzParam ** в любом месте в запросе. Раньше у меня было много проблем, пока я не узнал, что могу использовать параметры, наиболее похожие на 'WHERE member_name =: xyzparam', что является хорошим местом. –

+0

DV удален. Этот ответ теперь полезен и более уместен. Если ОП реализует ваши предложения, это, безусловно, будет улучшением; хотя неясно, устранит ли это его конкретную проблему. –