Регистрация

Как выполнять действия в транзакции через ODBC

Обсуждение вопросов по разработке программ в среде продуктов копорации "Progress Software"
Новичок
Сообщения: 4
Зарегистрирован: Пн июл 18, 2016 9:03 am

Как выполнять действия в транзакции через ODBC

Сообщение shatalxe » Пн июл 18, 2016 3:48 pm

Добрый день! Если вопрос задан не туда, то пожалуйста направьте меня куда надо

Создаю соединение из 1с:

Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionTimeOut = 20;
Connection.Provider = "MSDASQL.1";
Connection.Open(СтрокаПодключения);

Выполняю некоторые запросы:

Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandText = ТекстЗапроса;
Command.CommandType = 1;

Вопрос: как мне несколько запросов выполнить в одной транзакции

Администратор
Аватара пользователя
Сообщения: 1880
Зарегистрирован: Пт мар 25, 2005 6:05 pm
Откуда: Progress Technologies

Re: Как выполнять действия в транзакции через ODBC

Сообщение Arelav » Пн июл 18, 2016 7:22 pm

shatalxe писал(а):Создаю соединение из 1с

Для уточнения, из 1С в OpenEdge?

shatalxe писал(а):как мне несколько запросов выполнить в одной транзакции

Мне не знаком синтаксис 1С, но полагаю, что ответ будет - также как вы это делаете обычно в SQL.

Новичок
Сообщения: 4
Зарегистрирован: Пн июл 18, 2016 9:03 am

Re: Как выполнять действия в транзакции через ODBC

Сообщение shatalxe » Вт июл 19, 2016 9:06 am

Да, OpenEdge.

В данной SQL я ни разу не работал, нет доступа. Данные получаю/изменяю/удаляю конструкцией

Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandText = ТекстЗапроса;
Command.CommandType = 1;

Где ТекстЗапроса, например:
SELECT
*
FROM pub.Table

Дк вот мне нужно выполнить несколько таких команд в одной транзакции

Администратор
Аватара пользователя
Сообщения: 1880
Зарегистрирован: Пт мар 25, 2005 6:05 pm
Откуда: Progress Technologies

Re: Как выполнять действия в транзакции через ODBC

Сообщение Arelav » Вт июл 19, 2016 1:13 pm

Что-то вроде этого?

SELECT Name, Address, State, PostalCode
FROM Customer
UNION
SELECT Name, Address, State, PostalCode
FROM Supplier
ORDER BY 1;

Администратор
Аватара пользователя
Сообщения: 1880
Зарегистрирован: Пт мар 25, 2005 6:05 pm
Откуда: Progress Technologies

Re: Как выполнять действия в транзакции через ODBC

Сообщение Arelav » Вт июл 19, 2016 1:15 pm

Посмотрите по документации:
OpenEdge Data Management: SQL Reference
http://documentation.progress.com/outpu ... eface.html

Новичок
Сообщения: 4
Зарегистрирован: Пн июл 18, 2016 9:03 am

Re: Как выполнять действия в транзакции через ODBC

Сообщение shatalxe » Ср июл 20, 2016 1:20 pm

Arelav писал(а):Что-то вроде этого?

SELECT Name, Address, State, PostalCode
FROM Customer
UNION
SELECT Name, Address, State, PostalCode
FROM Supplier
ORDER BY 1;


Нет, мне нужно выполнить несколько запросов INSERT INTO в одной транзакции

Администратор
Аватара пользователя
Сообщения: 1880
Зарегистрирован: Пт мар 25, 2005 6:05 pm
Откуда: Progress Technologies

Re: Как выполнять действия в транзакции через ODBC

Сообщение Arelav » Ср июл 20, 2016 2:24 pm

INSERT INTO pub.customer ("Cust-Num", Name, Country) VALUES (1001, 'New Customer Name', 'USA');
INSERT INTO pub.customer ("Cust-Num", Name, Country) VALUES (1002, 'New Customer Name', 'USA');
INSERT INTO pub.customer ("Cust-Num", Name, Country) VALUES (1003, 'New Customer Name', 'USA');
COMMIT;
SELECT "Cust-Num", Name, Country FROM pub.customer WHERE "Cust-Num" >= 1001;

Транзакция откроется автоматически с первым оператором INSERT и будет действовать до выполнения оператора COMMIT.

Если что-то пойдёт не так на первых трёх INSERT или COMMIT не будет выполнен, а сессия завершится, то изменения откатятся.

Администратор
Аватара пользователя
Сообщения: 1880
Зарегистрирован: Пт мар 25, 2005 6:05 pm
Откуда: Progress Technologies

Re: Как выполнять действия в транзакции через ODBC

Сообщение Arelav » Ср июл 20, 2016 2:28 pm


Новичок
Сообщения: 4
Зарегистрирован: Пн июл 18, 2016 9:03 am

Re: Как выполнять действия в транзакции через ODBC

Сообщение shatalxe » Ср июл 20, 2016 4:47 pm

Arelav писал(а):INSERT INTO pub.customer ("Cust-Num", Name, Country) VALUES (1001, 'New Customer Name', 'USA');
INSERT INTO pub.customer ("Cust-Num", Name, Country) VALUES (1002, 'New Customer Name', 'USA');
INSERT INTO pub.customer ("Cust-Num", Name, Country) VALUES (1003, 'New Customer Name', 'USA');
COMMIT;
SELECT "Cust-Num", Name, Country FROM pub.customer WHERE "Cust-Num" >= 1001;

Транзакция откроется автоматически с первым оператором INSERT и будет действовать до выполнения оператора COMMIT.

Если что-то пойдёт не так на первых трёх INSERT или COMMIT не будет выполнен, а сессия завершится, то изменения откатятся.


После первого INSERT INTO любая строка вызывает исключение, синтаксическую ошибку.

нашел ответ на msdn ("https://msdn.microsoft.com/ru-ru/library/ms680895(v=vs.85).aspx")

т.е. в моем случае

Connection.BeginTrans();
...
цикл вызовов Command.Execute
...
Connection.CommitTrans();

Вернуться в PROGRESS - 4GL - ПРОГРАММИРОВАНИЕ

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3