尝试更新作为SQL Server数据库上的链接服务器的db2数据库时,我收到此错误。
错误:root:(' 42000',' [42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无法执行请求的操作,因为OLE DB提供程序&# 34; IBMDA400"用于链接服务器" iSeries"不支持所需的事务接口。(7390)(SQLExecDirectW)')
我通过pyodbc连接到sql server并且可以运行sql脚本而没有任何问题。这是我用
得到错误的sqlsql3 = " 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方法,但没有运气。有什么想法吗?
答案 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语句,而不包含在隐式事务中。