|
28.09.2004, 15:16 | #1 |
Участник
|
Проблема с выгрузкой/загрузкой файлов в базу из 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 минуты и вообще считаю такой способ особо корявым, но по другому не получается . Как можно сделать то что я здесь делаю по другому и чтоб работало быстро Заранее благодарен за любые советы |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Проблема с установкой Axapta 2.5+Oracle 8 | 3 | |||
Проблема с axapta comconnector! | 10 | |||
Проблема с Debugger'ом в Axapta. | 14 | |||
Проблема с основными средствами в Axapta 3 | 21 | |||
Введение в Аксапту | 0 |
|