27.02.2007, 18:02 | #1 |
Участник
|
SQL мониторинг + прямой запрос к SQL
Выполняю примерно такой код в джобе (AX 3.0 SP5):
X++: queryText = strfmt("SELECT * FROM SCL_ARTC"); odbc.ttsbegin(); res = statement.executeQuery(queryText); while(res.next()) { info(strfmt("%1 %2", res.getString(1), res.getString(2))); } odbc.ttscommit();
Собственно откуда ноги растут понятно. Непонятно как это корректно обработать (снимать галку в настройках перед выполнением запроса? ). |
|
28.02.2007, 09:31 | #2 |
Участник
|
А вы можете привести весь код джоба? а то по приведенному выше ничего нельзя сказать. ну и предположения то свои выскажите- откуда там ноги растут... будет легче рассуждать.
|
|
28.02.2007, 09:44 | #3 |
Участник
|
Да это весь код и есть. Пропущено только соединение с БД и все.
Код работает, но как только включается трассировка SQL - вываливаются ошибки (в лучшем случае) или просто падает Аксапта. Предпологаю, что лог по таблице, к которой идет запрос, Акса не может записать - она ее просто не видит. Пока все что приходит на ум - отключать трассировку перед запросом, потом включать после. |
|
28.02.2007, 10:29 | #4 |
Участник
|
При включенной трассировке sql в infolog прекрасно отрабатывает такое (по идее тожесамое что и у Вас)
X++: static void Job59(Args _args) { ODBCCOnnection odbc; Statement statement; str queryText; ResultSet res; LoginProperty lp = new SqlSystem().createLoginProperty(); inventTable it; ; odbc = new ODBCConnection(lp); statement = odbc.createStatement(); select it; queryText = strfmt("SELECT * FROM sysobjects"); odbc.ttsbegin(); res = statement.executeQuery(queryText); while(res.next()) { info(strfmt("%1 %2", res.getString(1), res.getString(2))); } odbc.ttscommit(); } ПС: т.е. трассировка выдает результат и для select it и для запроса через statement. ничего не упало Последний раз редактировалось Jony; 28.02.2007 в 10:31. |
|
28.02.2007, 11:41 | #5 |
Участник
|
X++: LoginProperty lp = new SqlSystem().createLoginProperty(); База Аксы находится на серваке, а та в которой таблица SCL_ARTC - на локальной базе. |
|
28.02.2007, 11:53 | #6 |
Участник
|
попробовал конектиться к другой базе (pubs), правда на том же серваке, (нет времени возводить локальный), результат такой же как и в пред случае- все норм когда включена трассировка.
Может какие-то особенности с трассировкой таких подключений из-за 2-3х уровней? может изменить место выполнения джоба(клиент или сервер)... пока на ум ничего не пришло |
|
28.02.2007, 12:05 | #7 |
Злыдни
|
Для дополнительных коннектов из рабочей базы одного сервера к базе на другом сервере для SQL необходимо настроить LinkedServer на сервере с рабочей базой. И не забыть дать права пользователю Windows, под которым запущен клиент, на базу дополнительного сервера.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
28.02.2007, 12:13 | #8 |
Участник
|
Для соединения с др базе из аксапты не нужно настраивать linkedServer'a , это обычное одбц соединение к отдельной табличке в отдельной базе, тут что-то другое, возможно с правами...
|
|
28.02.2007, 12:51 | #9 |
Участник
|
А причем тут права?
Она соединяется....запрос проходит...данные нормально считываются. Причем в обоих ситуациях - и при включенной трассировки и при выключенной. |
|
01.03.2007, 12:01 | #10 |
Участник
|
Падает предположительно в этом месте:
класс SysSqlShowPlan метод packMSSqlPlan При этом настройки мониторинга запросов SQL: включен мониторинг множественных запросов план запросов. Инфолог показывает следующее: Цитата:
Error Сообщение (11:51:05) Невозможно выбрать запись в "" ("")
База данных SQL обнаружила ошибку. Info Сообщение (11:51:05) Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'SCL_ARTC'. Info Сообщение (11:51:05) Оператор SQL: /*SP*/ SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM SCL_ARTC Предпологаю, что Акса пытается повторно выполнить запрос, но использует подключение через X++: con = new UserConnection();
stmt = con.createStatement(); Как лечить такое? Отключать лог на время выполнения запроса? ЗЫ Или оставить все как есть |
|
01.03.2007, 12:24 | #11 |
Модератор
|
мм... мощно.. действительно есть такая потребность?
__________________
-ТСЯ или -ТЬСЯ ? |
|
01.03.2007, 12:36 | #12 |
Участник
|
Нет.
Но проблему на програмном уровне это не решает. Ответ вроде "снимите галочку и Аксапта не будет падать..." совсем не то, что нужно. Может есть другие варианты? |
|
01.03.2007, 13:15 | #13 |
Модератор
|
Цитата:
Так что imho все же снимите галочку
__________________
-ТСЯ или -ТЬСЯ ? |
|
07.03.2007, 20:44 | #14 |
Участник
|
|
|
13.03.2007, 10:58 | #15 |
Участник
|
Полный текст ошибки:
Цитата:
Error Сообщение (10:55:45) Невозможно выбрать запись в "" ("")
База данных SQL обнаружила ошибку. Info Сообщение (10:55:45) Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'SCL_ARTC'. Info Сообщение (10:55:45) Оператор SQL: /*SP*/ SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM SCL_ARTC Error Сообщение (10:55:45) Невозможно выбрать запись в "" ("") База данных SQL обнаружила ошибку. Info Сообщение (10:55:45) Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'SCL_ARTC'. Info Сообщение (10:55:45) Оператор SQL: /*SP*/ SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM SCL_ARTC Error Сообщение (10:55:45) Невозможно создать запись в "Журнал трассировки операторов SQL" ("SysTraceTableSQL") Тип трассировки: Error, alexk. База данных SQL обнаружила ошибку. Info Сообщение (10:55:45) Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver]Подключение занято до получения результатов для другого hstmt Info Сообщение (10:55:45) Оператор SQL: INSERT INTO SYSTRACETABLESQL (TRACECONTAINER,STATEMENT,CALLSTACK,TEXT,TEXTDETAILS,TRACETIME,CATEGORY,CODE,CONNECTIONTYPE,CONNECTIONSPID,CONNECTIONID,ISLOBSINCLUDED,ISMOREDATAPENDING,ROWSAFFECTED,ROWSIZE,ROWSPERFETCH,ISSELECTEDFORUPDATE,ISSTARTEDWITHINTRANSACTION,STATEMENTTYPE,STATEMENTID,STATEMENTREUSECOUNT,DETAILTYPE,CREATEDDATE,CREATEDTIME,CREATEDBY,DATAAREAID,RECVERSION,RECID) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) Info Сообщение (10:55:45) 31711 Сантехника X++: static void import_SCL_ARTC(Args _args) { ODBCConnection odbc ; Statement statement; ResultSet res; str queryText; FolioConnectionParameters_NV folioConnectionParameters = FolioConnectionParameters_NV::find(); LoginProperty loginProperty; ; loginProperty = new LoginProperty(); loginProperty.setUsername(folioConnectionParameters.UserName); loginProperty.setPassword(folioConnectionParameters.UserPassword); loginProperty.setServer (folioConnectionParameters.ServerName); loginProperty.setDatabase(folioConnectionParameters.Database); odbc = new ODBCConnection(loginProperty); if(odbc) { statement = odbc.createStatement(); queryText = strfmt("SELECT * FROM SCL_ARTC"); odbc.ttsbegin(); res = statement.executeQuery(queryText); res.next(); info(strfmt("%1 %2", res.getString(1), res.getString(2))); odbc.ttscommit(); } } |
|
24.05.2007, 19:37 | #16 |
Участник
|
Предположительно, при переходе на SP5 вы не обновили syp-слой, а стали использовать от предыдущего сервис пака. Обновили клиента и сервер, а приложение - нет.
Цитата:
Падает предположительно в этом месте:
класс SysSqlShowPlan метод packMSSqlPlan Последний раз редактировалось fomenka; 24.05.2007 в 19:44. |
|
25.05.2007, 17:27 | #17 |
Участник
|
Цитата:
Сообщение от fomenka
Предположительно, при переходе на SP5 вы не обновили syp-слой, а стали использовать от предыдущего сервис пака. Обновили клиента и сервер, а приложение - нет.
Как раз в этом месте добавлена обработка поля RecVersion. Либо переносите код syp из класса sysSqlShowPlan на свой слой(что проще - но лишит всего что исправлено на syp слое), либо обновляйте приложение(что более трудоемко - но получите все новые возможности и исправления ошибок). |
|
29.05.2007, 03:58 | #18 |
Участник
|
Притом, что RecVersion обрабатывается в классе SysSqlShowPlan отдельным кодом при разборе плана запроса. У вас же именно включение трассировки с сохранением плана запроса глючит? На запросах в которых нет поля RecVersion?
Вы смотрели код метода packMSSqlPlan в классе SysSqlShowPlan? Последний раз редактировалось fomenka; 29.05.2007 в 04:01. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Как преобразовать запрос в SQL-инструкцию | 7 | |||
Поймать SQL запрос при формировании отчета | 7 | |||
Мониторинг запросов SQL | 11 | |||
SQL Запрос | 5 | |||
Собственный SQL запрос в FormDataSource | 0 |
|