Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.044 c
2-1131885148
John Doe
2005-11-13 15:32
2005.12.04
Реестр,значение ключа по умолчанию


14-1131914761
Kerk
2005-11-13 23:46
2005.12.04
Вы все еще используете ACDSee? Тогда мы идем к Вам!


1-1131210798
gdaujk
2005-11-05 20:13
2005.12.04
Создание панелей инструментов


6-1124424866
SamAlex
2005-08-19 08:14
2005.12.04
Как проверить открыты ли порты x на своей машине


3-1129801845
Карелин Артем
2005-10-20 13:50
2005.12.04
Как выполнить скрипт в ADO из нескольких команд?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский