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

Вниз

Проблема с передачей бинарных данных в DLL   Найти похожие ветки 

 
voronkov   (2003-09-09 12:22) [0]

В поле BLOB Oracle 9.2. я храню файл в формате Excel 2000, это шаблон. На данный момент эта СУБД не имеет встроенных стредств для корректной записи BLOB на диск. Пакет utl_file с его функциями put и put_raw корежит исходные данные, выкидывая оттуда символы перевода каретки. Пришлось написать свою функцию, которой скармливаются куски шаблона, а она их пишет на диск. В dll я могу передать информацию только в формате PChar, это корректно работает, если в передаваемых кусках нет #0, т.е символа завершения строки. Но к сожалению для файлов Excel файлов это не работает. Я просмотрел архивы данного портала и королевства и ответов не нашел. Посоветуйте как правильно принимать строки подобные строки в DLL, чтобы не происходило их обрезки.

Спасибо заранее.


 
mishgan   (2003-09-09 13:15) [1]

>>На данный момент эта СУБД не имеет встроенных стредств для
>>корректной записи BLOB на диск
OCI например
>>Посоветуйте как правильно принимать строки подобные строки в DLL
Зачем вообще в строки? Для этих целей лучше TMemoryStream


 
voronkov   (2003-09-09 13:31) [2]

Для mishgan.

Я не умею работать с OCI, к сожалению. Если есть работающий код на Дельфи с вызовами OCI и без создания соединений с Oracle, то можно посмотреть.

Как я в Oracle на PL/SQL создам MemoryStream и передам в DLL? В Oracle я только могу откусывать по куску от BLOB переменной и ложить эти куски в переменную VARCHAR2, и потом передавать на вход DLL.

Мне надо что-то делать в DLL с параметром PChar, чтобы Дельфи его не обрезало на первом же символе #0.


 
DmS   (2003-09-09 13:37) [3]

а ты пробовал дальше лезть, за #0 символ ?


 
voronkov   (2003-09-09 13:47) [4]

Для Dms.

Вот что я делаю, подскажите как лезть за #0, я потому и спрашиваю, буду очень благодарен.

function fsave (
fl : Double;
data : PChar
) : Double;
begin
FileSeek(Trunc(fl),0,2);
Result := FileWrite(Trunc(fl),data^,Length(data));
end;

Предполагается, что файл уже открыт и надо просто туда записать.


 
DmS   (2003-09-09 13:49) [5]

попробуй сохранять посимвольно ... для этого передавай еще и размер файла, чтобы за границу не вылезть

for i:=0 to fSize-1 do WriteFile(data[i]);


 
DmS   (2003-09-09 13:52) [6]

даже можно проще ...

вместо Length(data) поставь fSize ;)
эта функция выдает длину строки до первого символа #0 - не используй ее. размер данных надо передавать в виде параметра.


 
voronkov   (2003-09-09 14:03) [7]

Для DmS, огромное спасибо, замечание о Length попало в самую точку, строка цела, надо просто правильно определить ее длину, все работает.

Огромное спасибо еще раз.


 
mishgan   (2003-09-09 20:34) [8]

>>..работающий код на Дельфи с вызовами OCI и без создания
>>соединений с Oracle
А что OCI как-то может работать без соединения с Oracle?
Чем плохо соединение с БД?
Я бы сообще для таких целей не стал бы писать extended DLL-ку для сервера, а выгружал все бы через клиентский софт. В нем через TMemoryStream очень удобно все таскается. Чистый OCI не обязательно использовать, есть компоненты DOA, ODAC и т.п. (в т.ч. и бесплатные).
Все же с сервера не очень удобно работать с LOB-данными. Средства PL/SQL и SQL дают здесь не так много возможностей? как OCI



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

Текущий архив: 2003.09.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
3-71564
Relaxxx
2003-08-27 16:52
2003.09.22
Как мне округлить значение до сотых???


1-71662
Vladislav
2003-09-08 16:44
2003.09.22
PDF viewer


1-71735
WeCom.WS
2003-09-09 19:40
2003.09.22
проблема с Тулбарами MS Word а в OleContainer е


1-71578
Pavel Oliynik
2003-09-10 10:06
2003.09.22
что за бага ? enable:=false модального окна


14-71858
jack128
2003-09-01 00:17
2003.09.22
Именинники 1 сентября