Форум: "Базы";
Текущий архив: 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.043 c