Ситуация такая: на работающем приложении в 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);
}
Выдаётся ошибка: "[Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию".
Пароль и пользователь проверены. Вопрос с открытым паролем в коде пока что на втором месте после "заставить это работать". На клиентских машинах 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();
После этого вылета наблюдается следующий глюк: запись в таблице LocksTable остаётся, но удалить её из обозревателя таблиц кнопочкой "удалить запись" не получается - после F5 она остаётся на месте. Запись удаляется только запросом Delete_from.
Есть идеи, что это может быть?