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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.11.2007, 15:02   #1  
Silence is offline
Silence
Участник
Аватар для Silence
 
287 / 27 (1) +++
Регистрация: 29.09.2004
Адрес: г. Москва, Зеленоград
Как управлять транзакциями через ADO?
День добрый, подскажите как осуществить сабж?

В ODBCConnection есть методы .tts*. А вот в ADO ничего похожего не нашел.

И заодно, как через тот же адо обновить запись на сервере?
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу)
Старый 19.11.2007, 15:53   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Если абстрагироваться от того, как реализованы классы CCADO*, то у объекта Connection в "настоящем" ADO есть методы BeginTrans, CommitTrans, RollbackTrans. Записи обновляются через объект Recordset путем задания значения его полей. Обновление происходит автоматически при переходе к другой записи (в ADO нужно предпринять специальные шаги, чтобы ОТМЕНИТЬ изменения, а просто изменения сохраняются автоматически). Если курсор все еще остается в текущей записи, а ее уже надо сохранить, то применятся метод Update (для большей уверенности и читабельности кода его можно применять всегда). Вам нужно посмотреть классы CCADO* и при необходимости добавить нужные методы, обратясь к справке по ADO за подробностями (например, к файлу ADO210.CHM). Или сделать всё самому через COM, не используя классы CCADO* (мне показалось, что эти классы больше ориентированы на чтение данных, нежели на изменение, хотя я могу и ошибаться - внимательно не изучал их).
Старый 19.11.2007, 16:25   #3  
Silence is offline
Silence
Участник
Аватар для Silence
 
287 / 27 (1) +++
Регистрация: 29.09.2004
Адрес: г. Москва, Зеленоград
Цитата:
Сообщение от Gustav Посмотреть сообщение
Если абстрагироваться от того, как реализованы классы CCADO*, то у объекта Connection в "настоящем" ADO есть методы BeginTrans, CommitTrans, RollbackTrans. Записи обновляются через объект Recordset путем задания значения его полей. Обновление происходит автоматически при переходе к другой записи (в ADO нужно предпринять специальные шаги, чтобы ОТМЕНИТЬ изменения, а просто изменения сохраняются автоматически). Если курсор все еще остается в текущей записи, а ее уже надо сохранить, то применятся метод Update (для большей уверенности и читабельности кода его можно применять всегда). Вам нужно посмотреть классы CCADO* и при необходимости добавить нужные методы, обратясь к справке по ADO за подробностями (например, к файлу ADO210.CHM). Или сделать всё самому через COM, не используя классы CCADO* (мне показалось, что эти классы больше ориентированы на чтение данных, нежели на изменение, хотя я могу и ошибаться - внимательно не изучал их).
Да, уже создал BeginTrans и CommitTrans. Про RollBack не знал, пытался AbortTrans делать
И Update тоже уже создал, только вот ругается:
Цитата:
Метод "value" в COM-объекте класса "Field" возвратил код ошибки 0x800A0CB3 (<неизвестно>), который означает: Current Recordset does not support updating. This may be a limitation of the provider, or of the selected locktype.
Что нужно указать в конешене? Или в конекшнСтринге?

Сейчас так:
X++:
connection.open(
        "Provider=SQLOLEDB;"+
        "Data Source="      + serverName    +   ";" +
        "Initial Catalog="  + baseName      +   ";" +
        "uid="              + userId        +   ";" +
        "pwd="              + userPassword);
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу)
Старый 19.11.2007, 17:00   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Ругаться на обновление может по следующей причине. Метод \Classes\CCADORecordSet\open имеет такой вид:
X++:
void open(str               Source,
          CCADOConnection   cADOConnection,
          int               cursorType = #adOpenStatic,
          int               lockType = #adLockReadOnly,
          int               options = #adCmdText)
{
    recordSet.open(Source,
                   cADOConnection.connection(),
                   cursorType,
                   lockType,
                   options);
}
Обратите внимание на параметры по умолчанию cursorType = #adOpenStatic и lockType = #adLockReadOnly, т.е. "глухое" чтение статического набора. Нужно поменять эти параметры на более "писабельное" их сочетание (см. справку по методу Open).

P.S. Ну, славно
Старый 19.11.2007, 16:57   #5  
Silence is offline
Silence
Участник
Аватар для Silence
 
287 / 27 (1) +++
Регистрация: 29.09.2004
Адрес: г. Москва, Зеленоград
Все, разобрался. Нужно не в конекшене, а в рекордсете указывать:
X++:
recordSet.open(#AFS_CRM_Query, connection, 1, 2);
третий параметр.
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу)
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вспомогательный класс для импорта из Excel через ADO gl00mie DAX: База знаний и проекты 80 10.04.2017 10:55
Поговорим об ADO Gustav DAX: База знаний и проекты 63 11.05.2016 14:25
C# and AX Development: Using ADO for interfacing AX with an external database Blog bot DAX Blogs 0 05.08.2008 05:18
Подключение к базе на Oracle через ADO miklenew DAX: Программирование 6 19.12.2007 15:41
Как вызвать через ADO хранимую процедуру с параметрами ? LSA DAX: Программирование 16 23.12.2004 18:17

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

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

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