15.05.2012, 19:37 | #1 |
Участник
|
Ошибка с подключением через ODBC + глюк с работой через connection
Ситуация такая: на работающем приложении в 3.0 для одной обработки используется подключение через ODBC к своей же базе. По словам разработчика, заставить эту обработку работать через new connection() не вышло, а через ODBC всё ок.
Сейчас переношу это на DAX 2009, ни так ни так не выходит. MS SQL 2008 R2 Подключение ODBC создаётся так: X++: static void testODBCConnection(Args _args) { ODBCConnection con; LoginProperty LP = new LoginProperty(); ; LP.setServer("Server"); LP.setDatabase("DB"); LP.setOther(strfmt("Username=%1;Password=%2", "user", "pwd")); con = new ODBCConnection(LP); } Пароль и пользователь проверены. Вопрос с открытым паролем в коде пока что на втором месте после "заставить это работать". На клиентских машинах DSN создавать не хочется. На сервере DSN имеется, тестовое соединение проходит на ура, но LP.setDSN("DSN") даёт ту же картину. Если я правильно понимаю, DSN можно вообще не иметь, он создаётся на время подключения. Но вообще, конечно, через ODBC к своей базе коннектиться не комильфо, поэтому пытаюсь подключиться через new connection(), но тут своя засада. X++: stm = con.createStatement(); cmd = "begin tran"; new SqlStatementExecutePermission(cmd).assert(); stm.executeUpdate(cmd); CodeAccessPermission::revertAssert(); cmd = strfmt("insert LocksTable (purchid, transdate, blocked, dataareaid, recid) " + "values ('%1',getdate(),1,'%2', convert(int,@@dbts))", purchid, curext()); new SqlStatementExecutePermission(cmd).assert(); stm.executeUpdate(cmd); CodeAccessPermission::revertAssert(); /* обработка */ cmd = "rollback tran"; new SqlStatementExecutePermission(cmd).assert(); stm.executeUpdate(cmd); // <-- здесь вываливается ошибка SQL CodeAccessPermission::revertAssert(); Есть идеи, что это может быть? Последний раз редактировалось Corel; 15.05.2012 в 19:40. |
|
|
За это сообщение автора поблагодарили: NataLee (1). |
15.05.2012, 21:22 | #2 |
Участник
|
Это все где выполняется? На стороне клиента или на стороне сервера? Там где это выполняется соответствующий драйвер ODBC установлен?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
16.05.2012, 07:38 | #3 |
Участник
|
Для ODBC попробуйте так:
X++: otherStr += "DRIVER={SQL Server}"; otherStr += ";Trusted_Connection=No"; otherStr += strfmt(";SERVER=%1", ...); otherStr += strfmt(";DataBase=%1", ...); otherStr += strfmt(";UID=%1", ...); otherStr += strfmt(";PWD=%1", ...); loginProp.setOther(otherStr); По поводу Connection: 1) почему не использовать стандартные методы con.ttsbegin() и con.ttsabort()? 2) запрос на удаление к БД идет по уникальному ключу. Если ключ содержит текстовое поле, то проблема может быть в Adjustment'е. Пример: поле Field имеет длину 10 символов. В Аксапте значение в этом поле равно "Код1". В БД оно может быть записано или как "Код1______", или как "______Код1" ("_" - это пробел). Это нужно учитывать при вставке через запрос. Создайте 2 записи: одну из Аксапты, вторую - через запрос. И посмотрите, есть ли разница в текстовых полях. Последний раз редактировалось Dark Light; 16.05.2012 в 08:00. |
|
|
За это сообщение автора поблагодарили: NataLee (1), Corel (1). |
16.05.2012, 15:40 | #4 |
Участник
|
Цитата:
Цитата:
Сообщение от Dark Light
Для ODBC попробуйте так:
X++: otherStr += "DRIVER={SQL Server}"; otherStr += ";Trusted_Connection=No"; otherStr += strfmt(";SERVER=%1", ...); otherStr += strfmt(";DataBase=%1", ...); otherStr += strfmt(";UID=%1", ...); otherStr += strfmt(";PWD=%1", ...); loginProp.setOther(otherStr); Цитата:
Насчёт Adjustment - проверю. |
|
16.05.2012, 15:56 | #5 |
Участник
|
мы используем системный dsn из настроек :
X++: LP.setDSN(_odbcDSN); |
|
16.05.2012, 19:03 | #6 |
Участник
|
Цитата:
Driver = {SQL Server} В Вашем варианте это будет примерно так X++: static void testODBCConnection(Args _args) { ODBCConnection con; LoginProperty LP = new LoginProperty(); ; LP.setServer("Server"); LP.setDatabase("DB"); LP.setUserName("user"); LP.setPassword("pwd"); // Фигураные скобки не обязательны LP.setOther("DRIVER={SQL Server}"); // Или если с Windows аутентификацией без указания логина/пароля // LP.setOther("DRIVER={SQL Server};Trusted_Connection=Yes"); con = new ODBCConnection(LP); }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: NataLee (1), driller (2), Player1 (1). |
17.05.2012, 08:45 | #7 |
Участник
|
Цитата:
X++: Connection con = new UserConnection(); ttsbegin; con.ttsbegin(); //SQL запрос ... //SQL запрос //Обработка в Аксапте ... //Обработка в Аксапте con.ttsabort(); ttscommit; А из Аксапты доступа к данной таблице нет? Ведь гораздо будет проще в конце операции просто удалять нужную запись из LocksTable. Последний раз редактировалось Dark Light; 17.05.2012 в 08:53. |
|
17.05.2012, 11:01 | #8 |
Участник
|
Нет, это обработка критична к быстродействию (там далеко не одна запись ставится каждый раз), а на запоминании, какие записи были созданы и на удалении их теряется довольно много.
|
|
17.05.2012, 11:58 | #9 |
Участник
|
Цитата:
X++: delete_from LocksTable where LocksTable.createdTransactionId == appl.lastTransactionIdCreated(); Последний раз редактировалось Dark Light; 17.05.2012 в 13:01. |
|
Теги |
odbc, ax2009 |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|