python - "transaction interface"更新链接服务器上的表时出错

标签 python sql-server python-3.x pyodbc

当我尝试更新作为 SQL Server 数据库上的链接服务器的 db2 数据库时,出现此错误。

ERROR:root:('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]The requested operation could not be performed because OLE DB provider "IBMDA400" for linked server "iSeries" does not support the required transaction interface. (7390) (SQLExecDirectW)')

我通过 pyodbc 连接到 sql server,并且可以毫无问题地运行 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 方法,但没有成功。有什么想法吗?

最佳答案

Python 的 DB API 2.0指定默认情况下,连接应在自动提交“关闭”的情况下打开。这会导致所有数据库操作都在必须在 Python 代码中显式提交(或回滚)的事务中执行。

当使用 autocommit = False(默认)的 pyodbc 连接向 SQL Server 发送 UPDATE 时,该 UPDATE 会包含在由 SQL Server 管理的本地事务中。当 SQL Server 确定目标表位于链接服务器上时,它会尝试将事务提升为由 MSDTC 管理的分布式事务。 。如果用于管理链接服务器的连接技术不支持分布式事务,则操作将失败。

通常可以通过确保 pyodbc 连接启用自动提交来避免此问题,方法是:

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

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

这将单独发送每个 SQL 语句,而不包含在隐式事务中。

关于python - "transaction interface"更新链接服务器上的表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47288391/

相关文章:

python - Django Rest Framework - AssertionError 修复您的 URL conf,或在 View 上正确设置 `.lookup_field` 属性

python - 如何获得自定义错误消息?

python 枕头 : Add transparent gradient to an image

sql-server - 使用Redis实现的Sql Server内存表

python-3.x - redis-py 和 hgetall 行为

python-3.x - Python Moviepy 安装问题(windows 7x64)

Python 适合给定输入的数据类型

c# - 覆盖然后设置为空

sql-server - 选择运行总计,直到达到特定的 SUM

Python:字符串到函数名,它是如何工作的?