AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.04.2011, 15:24   #1  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
BusinessConnector .Net - исключение при вызове AxaptaRecord.Write
Доброго времени суток.
При создании объекта AxaptaRecord и вызове метода AxaptaRecord.Write после нескольких десятков удачных повторов в конце концов получаю одно из исключений:
а) AccessViolationException
б) SEHException (внешний компонент создал исключение)



Подскажите, может известна какая-то причина, или с чего, хотя бы, начать с этим разбираться?
Спасибо.

Последний раз редактировалось Evgenius; 22.04.2011 в 15:27.
Старый 22.04.2011, 16:41   #2  
dmitro is offline
dmitro
Участник
 
48 / 19 (1) ++
Регистрация: 18.07.2008
Адрес: Москва, РФ
а как получаете курсор AxaptaRecord? Ну, например, IAxaptaRecordAdapter currentRecord = AxBaseWebPart.GetWebpart(this).ExternalRecord.
Старый 22.04.2011, 17:10   #3  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
А с правами все ок?

С Уважением,
Георгий
Старый 22.04.2011, 17:56   #4  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Регистрация: 24.12.2001
Адрес: Тверь.
Проверь наличие уникальных индексов на таблице.
Возможно, ты пытаешься создать дублирущие записи.
__________________
Ален ноби, ностра алис.
Что означает - если один человек построил, другой завсегда разобрать может.
Старый 03.05.2011, 07:40   #5  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
Я прошу прощения, что исчез из собственной темы - пытался переделать приложение.
Ошибки возникают все равно, гадать больше не хочется.
Уточнения:


Цитата:
Сообщение от AlGol Посмотреть сообщение
Проверь наличие уникальных индексов на таблице.
Возможно, ты пытаешься создать дублирущие записи.
уникальных индексов нет.


Цитата:
Сообщение от George Nordic
А с правами все ок?
Если бы дело было в правах - тогда часть попыток записи не завершалась бы успешно


Цитата:
Сообщение от dmitro
а как получаете курсор AxaptaRecord? Ну, например, IAxaptaRecordAdapter currentRecord = AxBaseWebPart.GetWebpart(this).ExternalRecord.
это обычное Net-приложение, так что используется BusinessConnectorNet:
X++:
axRecord = Axapta.CreateAxaptaRecord(< >);
axRecord.ExecuteStmt("select * forupdate from %1");
if (axRecord.Found)
...
Старый 03.05.2011, 09:45   #6  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от Evgenius Посмотреть сообщение
X++:
axRecord.ExecuteStmt("select * forupdate from %1");
if (axRecord.Found)
...
В аксе при использовании конструкции forupdate требуется еще ttsbegin делать, возможно это оттуда.
__________________
Axapta book for developer
Старый 03.05.2011, 11:42   #7  
dmitro is offline
dmitro
Участник
 
48 / 19 (1) ++
Регистрация: 18.07.2008
Адрес: Москва, РФ
Цитата:
это обычное Net-приложение, так что используется BusinessConnectorNet:
X++:
axRecord = Axapta.CreateAxaptaRecord(< >);
axRecord.ExecuteStmt("select * forupdate from %1");
if (axRecord.Found)
...
Axapta.Logon("", "", "", "") перед этим всем присутствует?
Старый 03.05.2011, 12:02   #8  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
2Evgenius
действительно опубликуйте, весь код, что бы не гадать.
__________________
Axapta book for developer
Старый 03.05.2011, 14:57   #9  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
1. ttsbegin присутствует
2. 2dmitro. Вы как думаете, смог бы я часть записей создавать успешно (см. первый пост), если бы не залогинился?
3. 2Miker. Опубликовать целое .Net-приложение? Если у вас есть список возможных причин - поделитесь, пожалуйста, если нет - значит, вы именно гадать и собирались, разве нет?:-)

В сухом остатке: отсутствие TTSBegin - не причина, разве что я его неправильно использую. Сейчас на всякий случай делаю так: вызываю в начале процедуры, где изменяю запись таблицы, а в конце этой процедуры всегдда вызываю TTSCommit, даже если не изменилось ничего.

Что еще может быть?
Старый 03.05.2011, 15:39   #10  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от Evgenius Посмотреть сообщение
....
3. 2Miker. Опубликовать целое .Net-приложение? Если у вас есть список возможных причин - поделитесь, пожалуйста, если нет - значит, вы именно гадать и собирались, разве нет?:-)
....
Что еще может быть?
Евгений, вы надеюсь понимаете, что форум не служба тех поддержки..
А по коду можно многое сказать, выложите именно те вещи которые совершают вызовы методов нет коннектора от начала до конца. Остальное можете убрать и поставить звездочки.
X++:
*****
Рассчитываю, что вас этим не обидел....
__________________
Axapta book for developer
Старый 03.05.2011, 15:57   #11  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
Давно известно, что когда код вынужденно разбит на кучу процедур и потому состоит из одних вызов, он вызывает только вопросы.
Ну, попробуем:


X++:
             AxaptaRecord axRecord = AX.CreateAxaptaRecord("PST_Inventory_ItemProperties");
            Int64 RecId = 0;
            // определить тип данных
            InventoryDataTypes DataType = GetInventoryDataType(PropertyType);
            // конвертировать значение из строки (если нужно) и установить в нужное поле
            string FieldName;
            object DBPropertyValue = ConvertToInventoryDataType(PropertyType, PropertyValue, AssociatedLink, out FieldName); 
            if (DBPropertyValue == null)
                return 0;
            axRecord.set_Field(FieldName, DBPropertyValue);
            if (FieldName != "Link" && AssociatedLink != null)
                axRecord.set_Field("Link", AssociatedLink);
            else if (FieldName != "StringValue" && Convert.ToString(DBPropertyValue) != PropertyValue)
                axRecord.set_Field("StringValue", PropertyValue);

            // заполнить прочие нужные поля записи
            axRecord.set_Field("ItemType", (int)ItemType);
            axRecord.set_Field("ItemRecId", ItemRecId);
            axRecord.set_Field("DataSourceId", DataSourceId);
            axRecord.set_Field("PropertyType", PropertyType.ID);
            // поскольку мы не получаем группы отдельно (только вместе с элементами),
            // то указываем группу, только если она только что загружена
            PropertyTypeGroup PropertyGroup = (PropertyTypeGroup)PropertyGroups[Convert.ToInt64(PropertyGroupId)];
            if (PropertyGroup != null)
            {
                axRecord.set_Field("PropertyGroupId", PropertyGroup.RecordID);
            }
            axRecord.set_Field("LanguageId", LanguageId);

            try
            {
                if (axRecord.ValidateWrite())
                { 
                    axRecord.Write();
                    RecId = (Int64)axRecord.get_Field("RecId");
                }

            }
            catch (Exception ExceptionData)
            {

                throw ExceptionData;
            }
Сорри, я заменил первый пример, поскольку в этом месте чаще выпадает.
Комментарии это код из отдельной процедуры, метод TTSBegin вызывается До нее, а TTSCommit -после.
При ошибке сообщается, что она произошла в ValidateWrite(), но на таблице нет ни отношений, ни уникальных индексов, ни перекрытого метода ValidateWrite(). Обязательные поля заполнены все.

Последний раз редактировалось Evgenius; 03.05.2011 в 16:08.
Старый 03.05.2011, 17:18   #12  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
ну начинать надо по порядку :
1 axRecord то вообще создает запись, без последующего обновления?
то есть закоментить write() и вызвать insert().
__________________
Axapta book for developer
Старый 03.05.2011, 18:11   #13  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
Цитата:
Сообщение от MikeR Посмотреть сообщение
ну начинать надо по порядку :
1 axRecord то вообще создает запись, без последующего обновления?
то есть закоментить write() и вызвать insert().
Это работает в нескольких приложениях, разработанных для обмена данными со сторонними системами. В чем тут проблема? Я понимаю, что метод insert может содержать что-то дополнительное, но здесь НЕ содержит. Точно. Вообще, у всех тутошних таблиц пока что НЕ ПЕРЕКРЫТ ни один метод.

Последний раз редактировалось Evgenius; 03.05.2011 в 18:14.
Старый 03.05.2011, 18:28   #14  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
Ситуация изменилась после того, как я "наудачу" выделил приведенный код в отдельную транзакцию (потому что он использует некоторые им же добавленные данные):

Теперь приложение вылетает на ошибку:
Цитата:
Имя сбойного приложения: *******.vshost.exe, версия: 9.0.30729.4462, отметка времени: 0x4b2c8d75
Имя сбойного модуля: ntdll.dll, версия: 6.1.7600.16695, отметка времени 0x4cc7b325
Код исключения: 0xc0000374
Смещение ошибки: 0x00000000000c6ab2
Идентификатор сбойного процесса: 0x6664
А на сервере есть следующий комментарий:
Цитата:
Object Server 01: Attempt to clear pointerMap when it still contains objects
Так что теперь еще и с этим пытаюсь разобраться (нормальная работа теперь продолжается дольше, так что, м.б. изменения к лучшему:-)).
Старый 03.05.2011, 21:10   #15  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Evgenius Посмотреть сообщение
При ошибке сообщается, что она произошла в ValidateWrite(), но на таблице нет ни отношений, ни уникальных индексов, ни перекрытого метода ValidateWrite(). Обязательные поля заполнены все.
Надо еще проверить, что поля заполнены допустимыми значениями. Не только обязательные для заполнения, а вообще все. Ну, например, нет ли где попытки записать значение NULL?

В идеале, перехватить ошибку и сбросить в лог значения всех полей той записи, которая создается/модифицируется. Или просто на этапе отладки перед выполнением проблемного метода сбрасывать значения всех полей в лог.
За это сообщение автора поблагодарили: Evgenius (1).
Старый 03.05.2011, 22:41   #16  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Надо еще проверить, что поля заполнены допустимыми значениями. Не только обязательные для заполнения, а вообще все. Ну, например, нет ли где попытки записать значение NULL?

В идеале, перехватить ошибку и сбросить в лог значения всех полей той записи, которая создается/модифицируется. Или просто на этапе отладки перед выполнением проблемного метода сбрасывать значения всех полей в лог.
Можно подробнее? Я некоторые необязательные поля в данном случае вообще не трогал - какие типы данных в X++ в таком случае могут получить значение null?
(насчет явной установки null можно не беспокоиться - метод AxaptaRecord.set_Field не допускает такие значения)
Старый 04.05.2011, 11:34   #17  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ну, как пример.

Предположим, что поле LanguageId создано на основе Extended Data Types с тем же именем LanguageId. Этот Extended Data Types имеет Relations настроенный на таблицу LanguageTable. Следовательно, поле LanguageId может принять только те значения, которые есть в таблице LanguageTable и соответствуют всем дополнительным условиям связи, указанным в Relations.

Это значит, что, например, если в таблице LanguageTable нет языка с кодом "XXX", то при попытке сохранить сделанные изменения Вы получите сообщение об ошибке о том, что такого значения не существует в связанной таблице.

НО! Подобный контроль корректности введенного значения будет выполнен только при интерактивном вводе (через форму ввода). При программном вводе подобная проверка не осуществляется. Однако, это из среды Axapta. Как оно работает через Connector - не проверял. Теоретически - не должно, но проверить не помешает...

PS: Если значение поля явно не указано, то оно принимает пустое значение. Не NULL, а именно пусто. Что именно подразумевается под "пустым" значением зависит от типа данных. Для числовых значений (включая Enum) - это 0, для строковых - пустая строка, для дат - 01.01.1900
Старый 04.05.2011, 11:35   #18  
dmitro is offline
dmitro
Участник
 
48 / 19 (1) ++
Регистрация: 18.07.2008
Адрес: Москва, РФ
Цитата:
Сообщение от Evgenius Посмотреть сообщение
Ситуация изменилась после того, как я "наудачу" выделил приведенный код в отдельную транзакцию (потому что он использует некоторые им же добавленные данные):

Теперь приложение вылетает на ошибку:


А на сервере есть следующий комментарий:


Так что теперь еще и с этим пытаюсь разобраться (нормальная работа теперь продолжается дольше, так что, м.б. изменения к лучшему:-)).
а здесь смотрели http://community.dynamics.com/produc...967/86261.aspx? Последние два сообщения.
Старый 04.05.2011, 13:14   #19  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Ну, как пример.

Предположим, что поле LanguageId создано на основе Extended Data Types с тем же именем LanguageId. Этот Extended Data Types имеет Relations настроенный на таблицу LanguageTable. Следовательно, поле LanguageId может принять только те значения, которые есть в таблице LanguageTable и соответствуют всем дополнительным условиям связи, указанным в Relations.

Это значит, что, например, если в таблице LanguageTable нет языка с кодом "XXX", то при попытке сохранить сделанные изменения Вы получите сообщение об ошибке о том, что такого значения не существует в связанной таблице.

НО! Подобный контроль корректности введенного значения будет выполнен только при интерактивном вводе (через форму ввода). При программном вводе подобная проверка не осуществляется. Однако, это из среды Axapta. Как оно работает через Connector - не проверял. Теоретически - не должно, но проверить не помешает...

PS: Если значение поля явно не указано, то оно принимает пустое значение. Не NULL, а именно пусто. Что именно подразумевается под "пустым" значением зависит от типа данных. Для числовых значений (включая Enum) - это 0, для строковых - пустая строка, для дат - 01.01.1900
Выходит, незаполненных явно полей не нужно опасаться.
А насчет проверки отношений я в курсе.

Последний раз редактировалось Evgenius; 04.05.2011 в 13:19.
Старый 04.05.2011, 13:18   #20  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
Цитата:
Сообщение от dmitro Посмотреть сообщение
а здесь смотрели http://community.dynamics.com/produc...967/86261.aspx? Последние два сообщения.
Да, видел. Версии клиентской и серверной частей совпадают. AOS перезапускался уже раза 4 после изменений
Теги
business connector, com connector

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dax-lessons: Easy way to write queries/select statements – Editor scripts Blog bot DAX Blogs 0 17.12.2010 21:11
dynamicsaxtraining: Write down the record Blog bot DAX Blogs 0 08.12.2010 20:11
Переход на первую строку SalesLine_ds при вызове SalesTable_ds.write() Владимир Максимов DAX: Программирование 4 02.10.2008 18:08
Как понять что вызывает исключение Invalid Method Call Jab Straight DAX: Программирование 0 17.12.2007 23:23
Dynamics AX: .Net BC, C# - Working with AxaptaRecord Object Blog bot DAX Blogs 0 20.06.2007 23:13

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:49.