31.03.2009, 16:03 | #1 |
Участник
|
Экспорт полей из Аксапта в таблицу SQL
Здравствуйте уважаемые!
Подскажите пожалуйста как правильно написать процедуру экспорта двух полей из таблицы аксапта в таблицу SQL на другом сервере? Буду признателен за пример рабочего кода для доработки под свои требования. Заранее благодарен.
__________________
Александр |
|
31.03.2009, 16:26 | #2 |
Участник
|
Настройте репликацию между SQL-серверами и ничего программировать не нужно.
|
|
31.03.2009, 16:45 | #3 |
Участник
|
Цитата:
В SQL существет таблица отличная от аксаптовской ( по структуре и т.д.). В нее надо дополнительно экспортировать значения в два поля, изначально данных в этих полях в таблице нет.
__________________
Александр Последний раз редактировалось tolstjak; 31.03.2009 в 16:54. |
|
31.03.2009, 16:57 | #4 |
Участник
|
Если операция разовая, то возможно проще будет использовать MS DTS
|
|
31.03.2009, 17:00 | #5 |
MCTS
|
Я думаю, надо рыть в сторону классов odbcConnection или ociConnection (в случае Oracle) и LoginProperty.
Последний раз редактировалось Eldar9x; 31.03.2009 в 17:21. |
|
31.03.2009, 17:02 | #6 |
Участник
|
Операция будет периодической. Не хочется заморачиваться с SQL.
Из этой таблицы мы сначала получаем данные средствами аксапта, а потом хотим записать в нее контрольные данные, также средствами Аксапрта. Типа - интеграция.
__________________
Александр |
|
31.03.2009, 17:05 | #7 |
Участник
|
подобную задачу я решал с помощью семейства классов CCADO*, очень удобно.
|
|
31.03.2009, 17:07 | #8 |
Участник
|
Примерчик выложить не можете?
__________________
Александр |
|
31.03.2009, 17:35 | #9 |
Участник
|
живой пример не помню, так как где писал, уже давно не работаю, но вот простой примерчик накатал, как работать с адо:
X++: CCADOConnection c = new CCADOConnection(); CCADOCommand cmd; CCADORecordset rs; CCADOFields flds; ; //--------------------------------------------------------------------------------------- c.open('Data Source=SQLServerName;Initial Catalog=DBName;User ID=UserName;Password=password;'); cmd = new CCADOCommand(); cmd.activeConnection(c); //чтение cmd.commandText('select * from someTable'); rs = cmd.execute(); while(!rs.EOF()) { flds = rs.fields(); info(flds.itemName('someField').value()); rs.moveNext(); } c.close(); //--------------------------------------------------------------------------------------- //обновление c.open('Data Source=SQLServerName;Initial Catalog=DBName;User ID=UserName;Password=password;'); cmd = new CCADOCommand(); cmd.activeConnection(c); cmd.commandText("UPDATE someTable SET someTable.someField = '321' WHERE someField2 = '123'"); cmd.execute(); c.close(); |
|
|
За это сообщение автора поблагодарили: tolstjak (1), S.Kuskov (1). |
01.04.2009, 08:17 | #10 |
Участник
|
Цитата:
P.S. Попоробовали. Выдает следующую ошибку: Ошибка: Метод 'execute' в COM-объекте класса 'ADODB.Command' возвратил код ошибки 0x800A0E7D (<неизвестно>), который означает: Невозможно использование подключения для выполнения операции. Оно закрыто или не допускается в данном контексте. Не подскажите как ее победить?
__________________
Александр Последний раз редактировалось tolstjak; 01.04.2009 в 09:17. |
|
01.04.2009, 09:57 | #11 |
Участник
|
хотелось бы на Ваш код взглянуть
|
|
01.04.2009, 10:08 | #12 |
Участник
|
Поправили пару строчек. Все заработало.
jony - Большое респект.
__________________
Александр |
|
01.04.2009, 11:26 | #13 |
Участник
|
Насчет удобства работы через ADO - вопрос спорный. Лично мне кажется, что простые команды вроде Select, Update, Insert, Delete проще передавать все-таки через ODBC.
Вариантов подключения через ODBC несколько: 1. Если внешний сервер подключен как Linked-сервер (в случае MS SQL), то просто создаешь объект Connection и немного меняешь адресацию к серверу. SELECT .. FROM LinkedServer.BaseName.owner.Table Т.е. вместо имени таблицы имя из 4 "колен". Причем, как правило, владельца вообще опускают и пишут 2 точки подряд. 2. Если внешний сервер это совершенно не зависимый сервер, то вместо объекта Connection используют ODBCConnection. А в остальном все то же самое. Это выглядит примерно так: X++: OdbcConnection connectBase; Statement statment; ResultSet resultSet; LoginProperty lp = new LoginProperty(); str strConnectionString; Name _server = "MyServer"; Name _dataBase = "MyBase"; ; /* // Можно и в одну строку задать все параметры strConnectionString = strFmt("DRIVER=SQL Server;SERVER=%1;DataBase=%2;Trusted_Connection=Yes",_server,_dataBase); lp.setOther(strConnectionString); */ // Но для определенности задаю те параметры, которые возможно, явным образом lp.setDatabase(_dataBase); lp.setServer(_server); // Фигурные скобки не обязательны lp.setOther("DRIVER={SQL Server};Trusted_Connection=Yes"); connectBase = new OdbcConnection(LP); /* Для объекта Connection формировать LoginProperty нет необходимости. В этом случае все ограничивается строкой Connection connectBase; connectBase = new Connection(); но это подключение именно к текущему серверу */ // Далее работа с настроенным ODBC-соединением statment = connectBase.createStatement(); // Обновление statment.executeUpdate("UPDATE someTable SET someTable.someField = '321' WHERE someField2 = '123'") // Чтение resultSet = statment.executeQuery("select * from someTable") while (resultSet.next()) { info(resultSet.getString(1)); } |
|
|
За это сообщение автора поблагодарили: tolstjak (1). |
01.04.2009, 11:30 | #14 |
Участник
|
ODBC ещё и быстрее, чем ADO.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|