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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
14-1098017646
Comp
2004-10-17 16:54
2004.11.07
Оцените труд


6-1093597649
Pe6yc
2004-08-27 13:07
2004.11.07
Помогіте!!!!!!!!!!!!!!


4-1096437698
Gosha
2004-09-29 10:01
2004.11.07
Счетчик файлов


14-1098108491
top100
2004-10-18 18:08
2004.11.07
Организация работы с БД


3-1097127825
ligor
2004-10-07 09:43
2004.11.07
XML->БД