![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск по Blob-полю в Firebird [D7, FireBird]
Андрей__ © (2005-10-20 15:34:00)Мастера, 2 вопроса по работе с Blob-полем в FireBird.
У меня есть текстовое Blob-поле (наз. Text). Мне нужно производить поиск в таблице по фрагменту текста в этом поле. На Delphi реализовываю это так:
FData.QRequest.SQL.Add('Select * from TDocuments Where (Text like :Text)');
FData.QRequest.ParamByName('Text').Value:='%'+Edit1.Text+'%';
FData.QRequest.Open;
Запрос успешно выполняется при длине строки параметра до 30 символов. Если больше - выдается ошибка: "Trying to store a string of length 56 into a field that can only contain 30".
Если явно задаю тип и размер параметра, не помогает:
FData.QRequest.ParamByName('Text').DataType:=ftString;
FData.QRequest.ParamByName('Text').Size:=255;
Пробовал писать запрос в IBExpert. Там работает. Значит, такого ограничения в СУБД нет и у меня что-то в клиенте.
Вопрос 1: Как разрешить проблему?
Вопрос 2: Можно ли произволить поиск по этому полю без учета регистра? Если да, как это сделать?
Desdechado (2005-10-21 15:53:00) [1]TEXT - зарезервированное слово, а у тебя так поле называется
Johnmen (2005-10-21 14:11:00) [2]Дело в том, что значение поля BLOB это всего лишь указатель на массив данных. И поэтому в шибке говорится про число 30. Видимо это и есть "размер" указателя.
А чтобы искать в BLOB, надо сначала получить содержимое по указателю. (Обычно говорят, что содержимое BLOB).
Следовательно, либо писать (использовать сущ-ую) УДФ, либо искать на клиенте...
Desdechado (2005-10-21 12:57:00) [3][7]
Сурово. Это намек на UDF?
Андрей Жук (2005-10-21 10:59:00) [4]
type
THandle = Cardinal;
Tblob_get_segment = function(Blob_handle : THandle;
Buffer : Pointer;
Buffer_size : Longint;
var ActualBytes : Longint) : Longint;cdecl;
Tblob_put_segment = function(Blob_handle : THandle;
Buffer : Pointer;
Buffer_size : Longint) : Longint;cdecl;
PBlob = ^TBlob;
TBlob = record
blob_get_segment : Tblob_get_segment;
blob_handle : THandle;
number_segments : longint ;
max_seglen : longint ;
total_size : longint ;
blob_put_segment : Tblob_put_segment ;
end;
function PosStrInBlob(blob : PBlob; s: PChar;
CaseInsensitive: PInteger) : integer; cdecl;export;
var
ActualBytes : integer;
Buffer : string;
begin
SetLength(Buffer, blob^.max_seglen);
blob.blob_get_segment(blob^.blob_handle,PChar(Buffer),
blob^.max_seglen,ActualBytes);
if ActualBytes <> blob^.max_seglen then
Result := -1
else
if CaseInsensitive^ = 0 then
Result := Pos(s, Buffer)
else
Result := Pos(UpperCase(s), UpperCase(Buffer));
end;
Андрей__ (2005-10-20 16:28:00) [5]3. переименовать попробовал. А смысл? Это может быть каким-то зарезервированным словом?
Андрей__ (2005-10-20 16:25:00) [6]1. Вообще-то данные этого поля - дублированные ворд-документы, из которых переносится текст. Поле вводил специально для ускорения поиска, чтоб не искать в ворд-документах. Как можна формализовать даже не знаю. Там документы могут быть и по несколько сотен страниц.
Desdechado (2005-10-20 16:17:00) [7]1. данные, по которым идет поиск, имеет смысл формализовать, а не валить в мемо
2. это функция IB
3. попробуй переназвать параметр
Андрей__ (2005-10-20 16:12:00) [8]1. Почему?
2. Upper - это значение какого свойства параметра?
3. Ошибка выдается классом EIBClientError
4. Использую TIBDatabase, TIBTransaction, запрос пишу в TIBQuery
Desdechado (2005-10-20 15:53:00) [9]1. обычно такие поиски свидетельствуют о проблемах с проектированием БД
2. без учета регистра - UPPER для поля и параметра
3. весь ли текст ошибки приведен? похоже на ограничения qreport
4. какие компонентыиспользуешь для доступа к БД
Андрей__ (2005-10-20 15:34:00) [10]Заранее благодарен за ответы.