Главная страница
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.033 c
1-71594
slva
2003-09-09 18:00
2003.09.22
Русификация


7-71969
RDA
2003-07-09 16:03
2003.09.22
Печать на матричный принтер


1-71645
SH
2003-09-08 14:20
2003.09.22
Подсветка синтаксиса


8-71758
Renul
2003-05-24 11:46
2003.09.22
Удаление рисунка


14-71856
Soft
2003-08-30 14:28
2003.09.22
Кто, что обо мне думает?