2017-11-14 12 views
1

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スクリプトを実行できます。ここで私は

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() 

でエラーが発生し、SQL取得され、念のためにここに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

こんにちは、[Bobby Tables](https://xkcd.com/327/)に会ったことがありますか? – alfasin

+0

@alfasinこれは入力がない自動化されたプロセスです。 – Pintang

+0

ああ、その場合は、コードが駄目です... – alfasin

答えて

1

PythonのDB API 2.0は、デフォルトで接続が自動コミット「オフ」で開くように指定しています。これにより、すべてのデータベース操作が、Pythonコードで明示的にコミット(またはロールバック)されなければならないトランザクションで実行されます。

autocommit = False(デフォルト)とのpyodbc接続で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文を送信すること暗黙的なトランザクションで実行されます。

+0

詳細な説明ありがとうございます。 +1 – Pintang

関連する問題