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

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вспомогательный класс для импорта из 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:00.