01.02.2006, 11:47 | #1 |
Участник
|
Возникла необходимость синхронизировать некоторые таблицы в двух разных SQL базах, находящихся на разных компах. Т.е. имеется две базы, каждая сама по себе, но при этом многие справочники должны быть одинаковые (контрагенты, банки, договора и т.п.). Необходимо чтобы данные заводились только в одной базе и после этого они появлялись в другой. В идеале процесс синхронизации должен инициализироваться со стороны базы где заводятся данные, например, завели контрагента, и в методе insert таблицы прописать добавление такого же контрагента в другой базе, update, delete аналогично. Но при этом возникают проблемы с генерацией RecID во второй базе. Пока я остановился на другом варианте, по которому процесс синхронизации будет инициализирован, например, по нажатию кнопки в базе, куда новые или измененные данный должны попадать. Тогда надо просто обратится к базе где заводятся данные, считать новые или измененные данные и профиксить все изменения в текущей базе. В таком варианте столкнулся с проблемой, как обратиться из аксапты к SQL базе, находящейся на другом компе.
Я делаю так: Код: Connection con = new Connection(); Statement stmt = con.createStatement(); ResultSet resultSet; resultSet = stmt.executeQuery("Select * from [TMKGSU1].[Ax_test1].[dbo].[VendGroup]"); Выскакивает такая ошибка: Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver][SQL Server]Could not find server 'TMKGSU1' in sysservers. Execute sp_addlinkedserver to add the server to sysservers. Посоветуйте как лучше поступить. |
|
01.02.2006, 13:25 | #2 |
Участник
|
Чисто технически, используемый синтаксис, с точки зрения MS SQL предполагает, что [TMKGSU1] - это Linked - сервер. Т.е. это сервер, особым образом "прилинкованный" к данному. О чем и идет дальнейшее сообщение с предложением использовать процедуру sp_addlinkedserver для "линкования" этого сервера.
Можно прилинковать сервер через Enetrprise Manager \ Security \ Linked Server Используемое в запросе имя [TMKGSU1] - это не имя самого сервера, а имя, под которым нужный сервер (нужная база данных) "прилинкована" к данному серверу. Однако можно использовать и другой способ доступа к серверу. Объект Connection предполагает установку прямого соединения с "родным" сервером. Но кроме этого, есть еще объект OdbcConnection, который устанавливает соединение с любым сервером. Код: // Метод класса Global /* Коннект надо настраивать ОБЯЗАТЕЛЬНО на стороне сервера Дело в том, что подключение со стороны сервера установлено с админ-правами, а со строны клиента - с пользовательскими правами Т.е. попытка установить подобное соединение со стороны клиента окончится неудачей */ static server OdbcConnection createOdbcConnection() { OdbcConnection connectStat; LoginProperty lp = new LoginProperty(); ; // Устанавливаю реквизиты доверительного соединения lp.setOther("DRIVER=SQL Server;SERVER=TMKGSU1;DataBase=Ax_test1;Trusted_Connection=Yes"); connectStat = new OdbcConnection(LP); return connectStat; } // Собственно обращение к серверу OdbcConnection odbcConnection = createOdbcConnection(); Statement odbcStmt = odbcConnection.createStatement(); ResultSet R; R = odbcStmt.executeQuery("Select * from [VendGroup]"); Возможно, есть другие способы прямого общения серверов AXAPTA. Я просто не в курсе. |
|
02.02.2006, 07:51 | #3 |
Участник
|
Спасибо
|
|