|
19.11.2007, 15:02 | #1 |
Участник
|
Как управлять транзакциями через ADO?
День добрый, подскажите как осуществить сабж?
В ODBCConnection есть методы .tts*. А вот в ADO ничего похожего не нашел. И заодно, как через тот же адо обновить запись на сервере?
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу) |
|
19.11.2007, 15:53 | #2 |
Moderator
|
Если абстрагироваться от того, как реализованы классы CCADO*, то у объекта Connection в "настоящем" ADO есть методы BeginTrans, CommitTrans, RollbackTrans. Записи обновляются через объект Recordset путем задания значения его полей. Обновление происходит автоматически при переходе к другой записи (в ADO нужно предпринять специальные шаги, чтобы ОТМЕНИТЬ изменения, а просто изменения сохраняются автоматически). Если курсор все еще остается в текущей записи, а ее уже надо сохранить, то применятся метод Update (для большей уверенности и читабельности кода его можно применять всегда). Вам нужно посмотреть классы CCADO* и при необходимости добавить нужные методы, обратясь к справке по ADO за подробностями (например, к файлу ADO210.CHM). Или сделать всё самому через COM, не используя классы CCADO* (мне показалось, что эти классы больше ориентированы на чтение данных, нежели на изменение, хотя я могу и ошибаться - внимательно не изучал их).
|
|
19.11.2007, 16:25 | #3 |
Участник
|
Цитата:
Сообщение от Gustav
Если абстрагироваться от того, как реализованы классы CCADO*, то у объекта Connection в "настоящем" ADO есть методы BeginTrans, CommitTrans, RollbackTrans. Записи обновляются через объект Recordset путем задания значения его полей. Обновление происходит автоматически при переходе к другой записи (в ADO нужно предпринять специальные шаги, чтобы ОТМЕНИТЬ изменения, а просто изменения сохраняются автоматически). Если курсор все еще остается в текущей записи, а ее уже надо сохранить, то применятся метод Update (для большей уверенности и читабельности кода его можно применять всегда). Вам нужно посмотреть классы CCADO* и при необходимости добавить нужные методы, обратясь к справке по ADO за подробностями (например, к файлу ADO210.CHM). Или сделать всё самому через COM, не используя классы CCADO* (мне показалось, что эти классы больше ориентированы на чтение данных, нежели на изменение, хотя я могу и ошибаться - внимательно не изучал их).
И 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 |
Moderator
|
Ругаться на обновление может по следующей причине. Метод \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); } P.S. Ну, славно |
|
19.11.2007, 16:57 | #5 |
Участник
|
Все, разобрался. Нужно не в конекшене, а в рекордсете указывать:
X++: recordSet.open(#AFS_CRM_Query, connection, 1, 2);
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу) |
|