尝试更新作为 SQL Server 数据库上链接服务器的 db2 数据库时收到此错误。
错误:根:('42000', '[42000] [Microsoft][ODBC SQL Server 驱动程序][SQL Server]无法执行请求的操作,因为链接服务器"iSeries"的 OLE DB 提供程序"IBMDA400"不支持所需的事务接口。(7390( (SQLExecDirectW('(
我正在通过pyodbc连接到sql服务器,并且可以毫无问题地运行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 指定,默认情况下,连接应以自动提交"off"打开。这会导致在必须在 Python 代码中显式提交(或回滚(的事务中执行所有数据库操作。
当与 autocommit = False
(默认值(的 pyodbc 连接向 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 语句,而不会包装在隐式事务中。