|
07.09.2011, 09:55 | #1 |
Участник
|
Проблема с Insert'ом в MS SQL 2000. Axapta 3.0 SP3
Здравствуйте. Проблема в следующем. Вставляю из аксаптовского кода строку в таблицу Т базы данных, которая крутится на MS SQL 2000. Соединение работает правильно(выборки из Т и вставка в другие таблицы работает нормально).
Выражение X++: sqlCommand = "Insert into T ... ";
statement.executeUpdate(sqlCommand);
i = statement.getLastError(); И это при том, еще раз подчеркну, что в другие таблицы вставка пашет нормально. Помогите советом или размышлениями. Последний раз редактировалось sobik; 07.09.2011 в 09:58. |
|
07.09.2011, 10:28 | #2 |
Участник
|
Может, вы перед вставкой транзакцию открываете, но не завершаете ее?
__________________
Axapta v.3.0 sp5 kr2 |
|
07.09.2011, 10:29 | #3 |
Участник
|
Похоже у вас транзакция остается незакоммиченная.
При закрытии Аксапты, то есть соединения к базе (двухвенка ? ) транзакция откатывается. |
|
07.09.2011, 10:40 | #4 |
Участник
|
Извиниие, просто писал код в браузере, а не копировал. С транзакциями все ок. код выглядит так:
X++: conn.ttsbegin(); sqlCommand = "Insert into T ... "; statement.executeUpdate(sqlCommand); i = statement.getLastError(); conn.ttscommit(); |
|
07.09.2011, 10:51 | #5 |
Участник
|
|
|
07.09.2011, 11:23 | #6 |
----------------
|
таблица T в БД Axapta или где-то рядом?
а может где-то есть код, который удаляет из таблицы T? включите MS SQL Profiler. Запустите тест, закройте аксу, анализируйте лог. |
|
07.09.2011, 12:01 | #7 |
Участник
|
Таблица Т - в посторонней БД, которая крутится на МС СКЛ 2000.
Насчет кода - я тоже так подозревал, но если этот же запрос выполнить на enterprise manager ms sql 2000, то запись не удалится. |
|
07.09.2011, 12:28 | #8 |
----------------
|
"другие таблицы", в которые "вставка пашет нормально" на каком сервере находятся?
можно весь код с созданием соединения показать? |
|
07.09.2011, 13:16 | #9 |
Участник
|
Вас интерисует работает ли соединение нормально? Да, нормально. Вот код:
X++: #NMF_WinPackDepartamentsUpdate boolean checkODBCConnection() { //данные соединения LoginProperty makeLoginProperty() { LoginProperty loginProperty; ; loginProperty = new LoginProperty(); loginProperty.setDSN(#DSN_TEST_NAME); loginProperty.setUsername(#SQL_USER_NAME); loginProperty.setPassword(#SQL_USER_PASSWORD); return loginProperty; } ; // проверяем ODBC соединение try { conn = new OdbcConnection(makeLoginProperty()); return true; } catch { info(#ODBC_USER_ERROR); return false; } } Вот код, создающий выражение, через которое идут запросы: X++: void prepare() { if(this.checkODBCConnection()) { statement = conn.createStatement(); } else { error(#ODBC_CONNECT_ERROR); } } X++: conn.ttsbegin(); while select organization join structure where (organization.NMF_GSMStructureId == structure.StructureId) && (structure.NMF_WinpakAccess == NoYes::Yes) exists join empltable where (emplTable.RpayHrmOrganistionId == organization.hrmOrganizationId) && (emplTable.PayResignedDate_RU == dateNull() || emplTable.PayResignedDate_RU > mkdate(2,9,2011)) { SqlCommand = strFmt("Insert INTO Account (AccountID,UserId, NodeID, Deleted,UserPriority,AcctName, TimeStamp) VALUES (%1,%2,%3,%4,%5,'%6','%7') ", 0, 1, 0, 0, 0, Global::strReplace(subStr(organization.description,1,30),"'",""), currentTime ); statement.executeUpdate(SqlCommand); } conn.ttscommit(); X++: conn.ttsbegin(); while(it.more()) { sqlCommand = strFmt("Insert INTO NFTabLayout (AccountId, UserID, NodeID, Deleted, UserPriority, TabName1, TabName2, TabName3, TabName4, TabName5,"+ "TabOrder, NF1, NF2, NF3, NF4, NF5, NF6, NF7, NF8, TimeStamp) VALUES (%1,%2,%3,%4,%5,'%6','%7','%8','%9','%10',%11,%12,%13,%14,%15,%16,%17,%18,%19,'%20')", it.value(), 1, 0, 0, 0, "Особисті данні", "Особисті данні", "Особисті данні", "Особисті данні", "Особисті данні", 1, 1, 2, 3, 4, 5, 6, 7, 8, currentTime ); statement.executeUpdate(sqlCommand); i = statement.getLastError(); it.next(); } conn.ttscommit(); it - итератор по сету с целочислеными значениями, которые нужны для вставки. |
|
07.09.2011, 16:05 | #10 |
Участник
|
попробуйте транзакцию внутрь цикла всунуть
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
07.09.2011, 17:55 | #11 |
Участник
|
как видите, в первом случае из без этого сработало, но тем не менее,чем черт не шутит
|
|
08.09.2011, 12:24 | #12 |
Участник
|
в первом случае вставлялся меньший объем данных
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
08.09.2011, 17:11 | #13 |
Участник
|
Вы выдрали куски кода из контекста. А что там было ДО и ПОСЛЕ неизвестно. Вас же просили проверить что возвращает
conn.ttsLevel() по окончании всей процедуры. После команды conn.ttscommit() |
|
13.09.2011, 12:57 | #14 |
Участник
|
conn.ttsLevel() возвратил 0.
|
|
|
|