AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.09.2004, 15:16   #1  
Jony is offline
Jony
Участник
 
99 / 22 (1) +++
Регистрация: 25.06.2003
Адрес: г. Барнаул
Проблема с выгрузкой/загрузкой файлов в базу из Axapta в др базу
Доброго всем утра (дня, вечера, ночи). Подскажите кто что может:
выгружаю в word данные, сохраняю в файл, через binData плучаю контейнер и сохраняю в таблице в аксапте.
Так вот встала задача этот файл сохранять в таблице, но не в аксаптовской, а в левой ( тоже sql server).
Для реализации этого я поступил след. образом:
так я сохраняю файл в другой базе:
X++:
{
CCADOConnection con;
CCADORecordSet rs;
str s;
CCADOFields fields;
CCADOField field;
binData data = new BinData();
com com;
;
#CCADO
con = new CCADOConnection();
constr = strFmt("Provider= SQLOLEDB.1;UID=%1;PWD=%2;SERVER=%3;DATABASE=%4;",
'userid',
'pwd',
'server',
'db');
con.connectionString(constr);
con.open();

rs = new CCADORecordSet();
rs.open('select * from Table3 where (RECID = 1)', con, #adOpenDynamic, #adLockOptimistic);

fields = rs.fields();
field = fields.itemName('con');
data.loadFile('some_File_Name.doc');

s = binData::dataToString(data.getData());
com = field.Field();// метод field() дописан мной - возвращает COM поля

com.appendChunk(s); // все пробовал - понимает только str
rs.recordSet().Update();
rs.close();

con.close();
}
- работает быстро но есть такие проблемы:
1. s получается в 2 раза больше чем размер файла - я так понял что метод
binData::dataToString - каждый байт записывает в виде двух шеснадцатиричных цифр в строку т.е. (int)255 = (hex)FF = (str)"FF"
2. размер записаных данных в поле ещё в 2 раза больше, т.е. если я сохраняю файл размером 500kb то в поле запишется 2MB - и это как бы плохо. (а если файл будет 2МБ и больше )
Как сохранить таким способом или каким-нибудь таким способом файл чтоб размер остался таким же???
но это ещё пол-беды
читаю файл из базы следующим способом (незнаю как по другому)

Х++
{
................
int i,k,t;
COMVariant v = new COMVariant();
binData data = new BinData();
com com;
Array arr;
......................
// цепляюсь к базе, читаю запись
......................
field = fields.itemName('con');
com = field.Field();
total = com.ActualSize(); // в 4 раза больше чем размер исходного файла!
i = 0;
while (i<total)
{

v = com.getChunk(4096);
arr = v.safeArray(); // <--- ВОТ ЗДЕСЯ ОЧЕНЬ ТОРМОЗИТ
t= arr.lastIndex();
for(k = 1;k<= t;k++)
{
j = Arr.value(k);
s = num2char(j);
st+=s;
}
}
}
c = binData::stringToData(st);

data.setData(c);
data.saveFile('somefile.doc');

rs.close();
con.close();
}
так вот читается ОЧЕНЬ долго, т.е. файл размером ~ 900Kb читается примерно 1-3 минуты и вообще считаю такой способ особо корявым, но по другому не получается .

Как можно сделать то что я здесь делаю по другому и чтоб работало быстро

Заранее благодарен за любые советы
Старый 29.09.2004, 15:20   #2  
demID is offline
demID
Участник
 
61 / 12 (1) ++
Регистрация: 16.08.2004
Адрес: Москва
Вот работающий код - он считывает вордовский файл и загружает его в ADO-поле.
Условия работы: СУБД SQL Server, тип поля, в который загружаем файл = TEXT

PHP код:
//Copyright Dmitry Demidov
static void DD_BinaryFile(Args _args)
{
    
CCADOConnection cn;
    
CCADORecordset  rs = new CCADORecordset();
    
COM             comRScomFieldcomFields;
    
BinData binData = new BinData();
    ;
    
#CCADO

    
cn = new CCADOConnection();

    
cn.open(
        
"Provider=SQLOLEDB;"+
        
"Data Source="      "DDemidov"    +   ";" +
        
"Initial Catalog="  "dima"        +   ";" +
        
"uid="              "sa"          +   ";" +
        
"pwd="              "userPassword");



    
rs.open("SELECT * FROM Table1"cn#adOpenDynamic, #adLockOptimistic);

    
binData.loadFile("C:\\2.doc");

    while (!
rs.EOF())
    {
        
comRS rs.recordSet();
        
comFields comRS.Fields();
        
comField comFields.Item("Content");

        
comField.Value(binData.getVariant());
        
comRS.update();

        
rs.moveNext();
    }

__________________
Когда гестапо перекрыло все выходы, Штирлиц вышел через вход!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблема с установкой Axapta 2.5+Oracle 8 Pawlik DAX: Администрирование 3 18.11.2005 10:52
Проблема с axapta comconnector! egoist DAX: Программирование 10 22.09.2005 17:59
Проблема с Debugger'ом в Axapta. Anais DAX: Программирование 14 25.01.2005 11:20
Проблема с основными средствами в Axapta 3 soin DAX: Функционал 21 11.03.2004 14:43
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:18.