Главная страница
    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
Время: 1.059 c
2-1132328446
Alex 3000
2005-11-18 18:40
2005.12.04
Как перенесли


5-1114415285
Бывший студент
2005-04-25 11:48
2005.12.04
Default свойства


2-1132210863
diwww
2005-11-17 10:01
2005.12.04
Ошибка при закрытии одной из одинаковых форм


11-1112871733
Fanny
2005-04-07 15:02
2005.12.04
Утечки памяти в проектах KOL/MCK


14-1131995740
Сергей А.
2005-11-14 22:15
2005.12.04
Можно ли с помощью ftp.exe закачать файл на мой сайт?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский