Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.04;
Скачать: CL | DM;

Вниз

Поиск по 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.062 c
14-1131532307
Zhekson
2005-11-09 13:31
2005.12.04
Литература по связи железа компьютером


2-1131824166
Виталий80
2005-11-12 22:36
2005.12.04
Как сделать ф-цию парсинга


2-1132066253
бедный студент
2005-11-15 17:50
2005.12.04
шаг цикла


2-1132307224
Zulus
2005-11-18 12:47
2005.12.04
Помогите вызвать net send


14-1131565515
бабба
2005-11-09 22:45
2005.12.04
Помогите с архитектурным решением