Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Вниз

BLOB в UDF   Найти похожие ветки 

 
GanibalLector ©   (2004-10-07 20:01) [0]

Цель: создать в ХП BLOB!!!
Соответственно,зашел на Ibase.ru и скачал бесплатные UDF.
Нашел там подходящие

declare external function f_StrBlob
 cstring(254),
 blob
 returns parameter 2
 entry_point "StrBlob" module_name "FreeUDFLib";

declare external function f_BlobAsPChar
 blob
 returns cstring(1024) /* free_it */ /* or 32000 or whatever... */
 entry_point "BlobAsPChar" module_name "FreeUDFLib";

В ХП пишу так : BL=f_StrBlob(f_BlobAsPchar(Bl)||некоторое поле)
все чудесно работает,до тех пор пока BL не переваливается за 255!!!
т.е. я не могу присвоить ф-цией f_StrBlob строку более 255 символов,а также преобразовать ф-цией f_BlobAsPchar строку более 255 символов.
Ну это понятно,т.к. там Pchar,а он не может быть более 255

Посмотрел исходник UDF и понял,что так дело не пойдет.
Т.е. нужна ИНАЯ функция,которая будет передавать Pchar и текущее содержимое PBlob,а на выходе должно быть PBlob=PBlob+Pchar.
(тем самым отпадет необходимость вызывать f_BlobAsPchar и ошибка исчезнет)

Вот,код  ф-ции.ПОМОГИТЕ переделать ее
function StrBlob(sz: PChar; Blob: PBlob): PBlob;cdecl;
begin
 {$ifdef FULDebug}
 WriteDebug("StrBlob() - Enter");
 {$endif}
 result := Blob;
 if (not Assigned(Blob)) or
    (not Assigned(Blob^.BlobHandle)) then exit;
 Blob^.PutSegment(Blob^.BlobHandle, sz, StrLen(sz));
 {$ifdef FULDebug}
 WriteDebug("StrBlob() - Exit");
 {$endif}
end;

З.Ы.Скажу честно,пытался(без никаких DLL...)но все время получаю access violation .


 
Johnmen ©   (2004-10-07 20:54) [1]

А что, большую строку надо вернуть ?


 
GanibalLector ©   (2004-10-07 21:00) [2]

А что, большую строку надо вернуть ?
По разному.Иногда очень большая,иногда маленькая


 
GanibalLector ©   (2004-10-07 22:12) [3]

Вот,нашел UDF обьединения двух BLOB-ов

unction BlobCat(Blob1, Blob2, CatBlob: PBlob): PBlob; cdecl;
var
 length, bytesRead: Integer;
 buffer: PChar;
begin
 // will read blobs 1 at a time so allocate enough
 // memory to hold the larger of the 2 blobs
 length := Max(Blob1^.TotalSize, Blob2^.TotalSize);

 // change length to adjust for string terminator
 inc(length);

 // allocate memory for buffer
 // make sure isMultiThread is true for DLL
 buffer := StrAlloc(length);

 // get data for blob1
 Blob1^.GetSegment(Blob1^.BlobHandle, buffer, length, bytesRead);

 // store into CatBlob
 CatBlob^.PutSegment(CatBlob^.BlobHandle, buffer, bytesRead);

 // concat data for blob2
 Blob2^.GetSegment(Blob2^.BlobHandle, buffer, length, bytesRead);

 // store into CatBlob
 CatBlob^.PutSegment(CatBlob^.BlobHandle, buffer, bytesRead);

 // free memory for buffer
 StrDispose(buffer);

 Result := CatBlob;
end;


сделал по образцу так :


function BlobCat( sz: PChar; Blob1,CatBlob: PBlob): PBlob; cdecl;
var
 length: Integer;
 bytesRead:ushort;
 buffer: PChar;
begin
{$ifdef FULDebug}
 WriteDebug("StrBlob() - Enter");
{$endif}

 length := Max(Blob1^.TotalSize, StrLen(sz));
 inc(length);
 buffer := StrAlloc(length);
 Blob1^.GetSegment(Blob1^.BlobHandle, buffer, length, bytesRead);
 CatBlob^.PutSegment(CatBlob^.BlobHandle, buffer, bytesRead);
 CatBlob^.PutSegment(CatBlob^.BlobHandle, sz, StrLen(sz));
 StrDispose(buffer);
 Result := CatBlob;

{$ifdef FULDebug}
WriteDebug("StrBlob() - Exit");
{$endif}

end;

Не работает...где-то видать ошибся.Вернее работает,но выдает неверный BLOB


 
GanibalLector ©   (2004-10-08 01:57) [4]

Рабочая :

function BlobCat( sz: PChar; Blob1,CatBlob: PBlob): PBlob; cdecl;
var
length: Integer;
bytesRead:ushort;
buffer: PChar;
begin
{$ifdef FULDebug}
WriteDebug("BlobCat() - Enter");
{$endif}

length := Max(Blob1^.TotalSize, StrLen(sz));
inc(length);
buffer := StrAlloc(length);
Blob1^.GetSegment(Blob1^.BlobHandle, buffer, length, bytesRead);
CatBlob^.PutSegment(CatBlob^.BlobHandle, buffer, bytesRead);
CatBlob^.PutSegment(CatBlob^.BlobHandle, sz, StrLen(sz));
StrDispose(buffer);
Result := CatBlob;

{$ifdef FULDebug}
WriteDebug("BlobCat() - Exit");
{$endif}

end;


Но вся соль в том,что если использовать так :
BL= BlobCat(некоторое поле,BL); то нифига не выйдет.А жаль...


 
GanibalLector ©   (2004-10-08 02:13) [5]

В конце-концов забил на UDF и сделал выходным параметром varchar(15000) и наступило СЧАСТЬЕ.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.032 c
1-1098686822
Last
2004-10-25 10:47
2004.11.07
Как задавить нажатие клавиши Enter?


14-1098131129
VID
2004-10-19 00:25
2004.11.07
Ну что, прошли вакцинацию от гриппа ?


1-1098766873
samumka
2004-10-26 09:01
2004.11.07
И снова MDI (передача переменных)?


8-1091926499
Andry
2004-08-08 04:54
2004.11.07
Свет в GLScene


1-1098269315
dreamse
2004-10-20 14:48
2004.11.07
Проблемы с выделением колонок listview разным цветом





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