Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Поиск по базе


Автор: NieL 5.9.2008, 17:41
Нужно сделать поиск в базе по имени поля (FieldName) и его значению (FieldValue - может быть как числовое так и строковое). Не знаю как сделать разделение если поле числовое искать как AsInteger если текстовое искать как AsString

Код

function Tdatamodule_Connection.FindByField(const FieldName,  
  FieldValue: string): Integer;  
begin  
  Result := -1;  
  if ConnectionStatus = csConnected then  
  begin  
    // cmp_Query_.SQL.Text := Format('SELECT * FROM ITEM WHERE %s = %s', [FieldName, FieldValue]);  
   cmp_Query_.Close;   
   cmp_Query_.SQL.Text := 'SELECT * FROM ITEM WHERE ' + FieldName + ' = :FieldValue';  
    if not cmp_Query_.Prepared then  
      cmp_Query_.Prepare;  
   if что-то then // может быть проверять тип поля (числовой или текстовый, и как нибудь по другому) 
     cmp_Query_.ParamByName('FieldValue').AsInteger := StrToInt(FieldValue) 
   else   
     cmp_Query_.ParamByName('FieldValue').AsString := FieldValue;  
    cmp_Query_.ExecSQL;  
    Result := cmp_Query_.RowsAffected;  
  end;  
  FSelectedByKey := False;  
end; 

Автор: Akella 5.9.2008, 18:03
Цитата(NieL @  5.9.2008,  17:41 Найти цитируемый пост)
if что-то then //

узнавай тип поля, есть FieldType для этого, помоему

Автор: Frees 8.9.2008, 09:23
function Tdatamodule_Connection.FindByField(const FieldName,  
  FieldValue: Variant): Integer;  
.......
cmp_Query_.ParamByName('FieldValue').Value := FieldValue
.......... 

Автор: pseud 8.9.2008, 10:07
видимо тебе потребуется следующий код:

Код

var
  i: Integer;
  ft: TFieldType;

  with TQuery.Create(Self) do
  try
    SQL.Add('SELECT * FROM ITEM WHERE id = -1'); 
      // id = -1 - это условно. вообще, надо чтоб в запрос ничего не попало, 
      // может у тебя пройдет select first 1 или что-то типа того
    Active := True;
    ft := FieldByName(FieldName).DataType;
  finally
    Free;
  end;


  sSQL := 'SELECT * FROM ITEM WHERE ' + FieldName + ' = ';  

  case ft of:
    ftString: s := QuotedStr(FieldValue);
    ftInteger, ftSmallint: s := FieldValue;
    else
      ...
  end;

  sSQL := sSQL + s;

Автор: Frees 8.9.2008, 10:26
Цитата(pseud @  8.9.2008,  10:07 Найти цитируемый пост)
видимо тебе потребуется следующий код:

а зачем так сложно? разве Variant не пройдет?

Автор: pseud 8.9.2008, 11:04
Цитата(Frees @  8.9.2008,  10:26 Найти цитируемый пост)
а зачем так сложно? разве Variant не пройдет?


не уверен, что вриант нам поможет получить 2 таких чуть разных скюля: 
field1 - number
Код

SELECT * FROM table WHERE field1 = 123

field2 - varchar
Код

SELECT * FROM table WHERE field2 = '123'


опровергни меня, если я не прав

Автор: Frees 8.9.2008, 11:29
Код

SELECT * FROM table WHERE field1 = :param


Код

cmp_Query_.ParamByName('param').Value := FieldValue


в таком случае совершенно не важно что мы в вариант ложили

Добавлено через 3 минуты и 9 секунд
Код

procedure TForm2.Button1Click(Sender: TObject);
begin
  FindByField(ComboBox1.Text, Edit1.Text);//ComboBox1.Text тут список полей разных типов

end;

function TForm2.FindByField(const FieldName: String;
  FieldValue: Variant): Integer;
begin
  Result := -1;
  if true then
  begin

   pFIBDataSet1.Close;
   pFIBDataSet1.SelectSQL.Text := 'SELECT * FROM METATABLE  WHERE ' + FieldName + ' = :FieldValue';
    if not pFIBDataSet1.Prepared then
        pFIBDataSet1.Prepare;
    pFIBDataSet1.ParamByName('FieldValue').Value := FieldValue;//тип не важен все работает
    pFIBDataSet1.Open;
    Result := pFIBDataSet1.recordCount;
  end;
end;

Автор: pseud 8.9.2008, 11:56
Цитата(Frees @  8.9.2008,  11:29 Найти цитируемый пост)
в таком случае совершенно не важно что мы в вариант ложили


а теперь 
- выбери в комбобоксе цифровое поле
- в едит напиши 123
и запусти поиск

у меня вылетает
Код

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EDBEngineError with message 'Type mismatch in expression.'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------


Автор: Frees 8.9.2008, 12:02
Цитата(pseud @  8.9.2008,  11:56 Найти цитируемый пост)
у меня вылетает

у меня работает, дело наверно в компанентах у меня как заметил (FIB), а ты на чем проверял?

Автор: pseud 8.9.2008, 13:13
Цитата(Frees @  8.9.2008,  12:02 Найти цитируемый пост)
у меня работает, дело наверно в компанентах у меня как заметил (FIB), а ты на чем проверял?

Paradox - BDE

Автор: Poseidon 8.9.2008, 16:27
NieL, делай AsString всегда. Числовые данные прекрасно конвертируются в строковые.

Автор: pseud 8.9.2008, 16:34
офф
блииин ну как обычно написана куча советов
а хде же результат
хде овнер сей проблемы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)