"交易界面"更新链接服务器上的表时出错

时间:2017-11-14 14:37:00

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

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

  

错误:root:(' 42000',' [42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无法执行请求的操作,因为OLE DB提供程序&# 34; IBMDA400"用于链接服务器" iSeries"不支持所需的事务接口。(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方法,但没有运气。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

Python的DB API 2.0指定默认情况下,连接应该以autocommit“off”打开。这导致所有数据库操作都在必须在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语句,而不包含在隐式事务中。