Форум: "Основная";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];
ВнизПроблема с передачей бинарных данных в 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c