Главная страница
    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.043 c
4-1096820346
Гость
2004-10-03 20:19
2004.11.07
Drag&Drop. Как из своей формы перетащить файл в проводник


1-1098860642
snake1977
2004-10-27 11:04
2004.11.07
HTML


14-1097891331
Думкин
2004-10-16 05:48
2004.11.07
С днем рождения! 16 октября - точно


4-1096526534
Muhsin
2004-09-30 10:42
2004.11.07
Запуск других приложений


3-1097129513
S@shka
2004-10-07 10:11
2004.11.07
Можно ли в UDF вернуть больше одного параметра???





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