2015-06-26 6 views
1

В этом вопросе:Как использовать RecordSet.Find с TADOQuery?

Delphi ADO : Locate with dataset filter on bug

антидопинговой ошибка была описана где строка фильтра игнорируется при .Locates.

Это вызывает проблемы для нас, мигрирующих из BDE, потому что у нас есть много кода, который меняет фильтр в соответствии с пользовательским вводом.

Мы ожидали, что TADOQuery обеспечит рабочий путь миграции. Мы были неправы.

Мы можем, конечно, изменить наши текущие фильтры, где заявление, но это много работы, и риск конкатенация строк фильтра для фильтрации менее WHERE заявления и т.д.

Принятого ответ на вопрос, связанный с выше предлагает возможность использования TCustomADODataSet.Recordset.Find

Можем ли мы безопасно использовать RecordSet.Find в TADOQuery только для реализации .Locates? то есть ли RecordSet.Find обновляет любую оболочку TADOQuery, размещенную вокруг TADOQuery?

Если да, может ли кто-нибудь показать пример вызова из Delphi XE5 в FindSet find? У меня возникли проблемы с выяснением аргументов.

+1

Я думаю, что вы опоздали на 5 лет, по крайней мере для такой миграции. Почему ADO? FireDAC, по-видимому, является наиболее поддерживаемой библиотекой DB для Delphi (если можно сказать «поддержка», когда мы говорим об Emb). –

ответ

2

Ваш лучший вариант - посмотреть исходный код ADODB.pas TCustomADODataSet.LocateRecord. Вы увидите, как реализуется Locate.

Для одного условия используется метод RecordSet Find. для нескольких условий он использует свойство Filter.

Использование Find довольно легко:

uses ..., ADODB, ADOInt; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    bm: TBookmarkStr; 
begin 
    bm := ADODataSet1.Bookmark; 
    // for partial condition use e.g. ItemName LIKE 'He*' 
    ADODataSet1.Recordset.Find('ItemName = ''Hello''', 0, adSearchForward, adBookmarkFirst); 
    if ADODataSet1.Recordset.EOF then // not found 
    ADODataSet1.Bookmark := bm // restore bookmark 
    else 
    ADODataSet1.Resync([rmExact, rmCenter]); // set active record and trigger dataset change event 
end; 

Поскольку TADOQuery является TCustomADODataSet потомком нет проблем с использованием RecordSet же, как TADODataSet