Спасибо за подробное объяснение. +1

учаю эту ошибку при попытке обновить базу данных db2, которая является связанным сервером на нашей базе данных SQL Server.

ОШИБКА: root :( '42000', '[42000] [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Запрошенная операция не может быть выполнена, поскольку поставщик OLE DB "IBMDA400" для связанного сервера "iSeries" не поддерживает требуемый интерфейс транзакции. (7390) (SQLExecDirectW) ')

Я подключаюсь к серверу sql через pyodbc и могу запускать сценарии sql без проблем. Вот sql я получаю ошибку с

sql3 = " exec ('UPDATE SVCEN2DEV.SRVMAST SET SVRMVD = ? WHERE svtype != ''*DCS-'' AND svcid = ? and svacct = ? ') AT [iSeries]"
db.execute(sql3, (row[2],srvid,row[0]))
db.commit()

И на всякий случай вот моя строка подключения с использованием pyodbc:

conn = pyodbc.connect("DRIVER={SQL Server};SERVER="+ Config_Main.dbServer +";DATABASE="+ Config_Main.encludeName +";UID="+ Config_Main.encludeUser +";PWD=" + Config_Main.encludePass)
db = conn.cursor()

Также обратите внимание, что этот запрос прекрасно работает в SSMS. Я также попробовал метод openquery, но мне не повезло. Есть идеи?

 alfasin14 нояб. 2017 г., 15:49
О, в этом случае нормально писать неаккуратный код ...
 Pintang14 нояб. 2017 г., 15:58
@GordThompson Это сработало! Таким образом, оператор commit после .execute не работает, потому что связанный сервер хочет зафиксировать изменения перед возвратом в python? Это звучит как точное утверждение?
 Gord Thompson14 нояб. 2017 г., 15:52
Попробуйте добавитьconn.autocommit = True заявление сразу после звонкаpyodbc.connect.
 alfasin14 нояб. 2017 г., 15:39
Привет ты встречалБобби Столы ?
 Pintang14 нояб. 2017 г., 15:43
@alfasin Это автоматизированный процесс без ввода.

Ответы на вопрос(1)

Решение Вопроса

БД API 2.0 указывает, что по умолчанию соединения должны открываться с автокоммитом "off". Это приводит к тому, что все операции с базой данных выполняются в транзакции, которая должна быть явно зафиксирована (или откатана) в коде Python.

Когда pyodbc соединение сautocommit = False (по умолчанию) отправляет UPDATE на SQL Server, который UPDATE заключает в локальную транзакцию, управляемую SQL Server. Когда SQL Server определяет, что целевая таблица находится на связанном сервере, он пытается преобразовать транзакцию в распределенную транзакцию, управляемуюMSDTC, Если технология соединения, используемая для управления связанным сервером, не поддерживает распределенные транзакции, операция завершится неудачно.

Эту проблему часто можно избежать, если для подключения pyodbc включена функция автоматической фиксации, либо

cnxn = pyodbc.connect(conn_str, autocommit=True)

или же

cnxn = pyodbc.connect(conn_str)
cnxn.autocommit = True

Это будет отправлять каждый оператор SQL индивидуально, без включения в неявную транзакцию.

 Pintang14 нояб. 2017 г., 21:14
Спасибо за подробное объяснение. +1

Ваш ответ на вопрос