Форум: "Базы";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
ВнизПоиск по Blob-полю в Firebird Найти похожие ветки
← →
Андрей__ (2005-10-20 15:34) [0]Мастера, 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: Можно ли произволить поиск по этому полю без учета регистра? Если да, как это сделать?
← →
Андрей__ (2005-10-20 15:34) [1]Заранее благодарен за ответы.
← →
Desdechado © (2005-10-20 15:53) [2]1. обычно такие поиски свидетельствуют о проблемах с проектированием БД
2. без учета регистра - UPPER для поля и параметра
3. весь ли текст ошибки приведен? похоже на ограничения qreport
4. какие компонентыиспользуешь для доступа к БД
← →
Андрей__ (2005-10-20 16:12) [3]1. Почему?
2. Upper - это значение какого свойства параметра?
3. Ошибка выдается классом EIBClientError
4. Использую TIBDatabase, TIBTransaction, запрос пишу в TIBQuery
← →
Desdechado © (2005-10-20 16:17) [4]1. данные, по которым идет поиск, имеет смысл формализовать, а не валить в мемо
2. это функция IB
3. попробуй переназвать параметр
← →
Андрей__ (2005-10-20 16:25) [5]1. Вообще-то данные этого поля - дублированные ворд-документы, из которых переносится текст. Поле вводил специально для ускорения поиска, чтоб не искать в ворд-документах. Как можна формализовать даже не знаю. Там документы могут быть и по несколько сотен страниц.
← →
Андрей__ (2005-10-20 16:28) [6]3. переименовать попробовал. А смысл? Это может быть каким-то зарезервированным словом?
← →
Андрей Жук © (2005-10-21 10:59) [7]
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;
← →
Desdechado © (2005-10-21 12:57) [8][7]
Сурово. Это намек на UDF?
← →
Johnmen © (2005-10-21 14:11) [9]Дело в том, что значение поля BLOB это всего лишь указатель на массив данных. И поэтому в шибке говорится про число 30. Видимо это и есть "размер" указателя.
А чтобы искать в BLOB, надо сначала получить содержимое по указателю. (Обычно говорят, что содержимое BLOB).
Следовательно, либо писать (использовать сущ-ую) УДФ, либо искать на клиенте...
← →
Desdechado © (2005-10-21 15:53) [10]TEXT - зарезервированное слово, а у тебя так поле называется
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.031 c