2012-01-17 3 views
1

私はpyodbcを使用してデータベース接続を管理しています。 I OSI PIのデータベースに接続し、このエラーを受信しようとしています:どのようにしてOSI PIにPython 2.6を接続できますか?

pyodbc.Error: ('IM002', "[IM002] [OSI][PI ODBC][PI]PI-API Error <pilg_getdefserverinfo> 0 (0) (SQLDriverConnectW); [01000] [Microsoft][ODBC Driver Manager] The driver doesn't support the version of ODBC behavior that the application requested (see SQLSetEnvAttr). (0)")

ベンダーと話した後、私はこの応答を得た: Looks like pyodbc is written against ODBC 3.x. The OSI PI ODBC driver is using ODBC 2.0. The python ODBC driver manager will convert most ODBC 3 calls on the fly to ODBC 2 ones. Anything added to 3, however, will obviously fail. You would need to find some way to make sure that your only using 2.0 compliant ODBC calls. Currently their is not a PI ODBC driver that is compliant with ODBC 3.0.

私はと私のコードはかなり単純ですこの時点で接続しようとしています:

import pyodbc 
constr = 'DRIVER={PI-ODBC};SERVER=myserver;UID=MY_UID' 
pyodbc.pooling=False 
conn = pyodbc.connect(constr)   # Error at this line 
conn.close() 

誰かがOSI PIにpythonを接続しましたか?もしそうなら、どうしたのですか?そうではなく、まだOSIデータベースのデータを使用していた場合、どのようにしてそのデータにアクセスしましたか?

+0

PIODBCに接続する際に 'R'' RODBC'パッケージを使用する際に問題がありました。症状は、すべてのクエリがゼロ行を返していたことです。解決策は、PI ODBCドライバが行数を混乱させていたため、一度に1行( 'rows_at_time = 1')と(' believeNRows = FALSE')をフェッチするように 'RODBC'を設定することでした。 http://stackoverflow.com/q/7425100/176995 –

答えて

2

を使用してみてください、私はこれを行う方法を考え出しました。私はpyodbcを使ってから変更しなければならなかった。代わりに、私はwin32comでこれをやっています。

from win32com.client import Dispatch 

oConn = Dispatch('ADODB.Connection') 
oRS = Dispatch('ADODB.RecordSet') 

oConn.ConnectionString = "Provider=PIOLEDB;Data Source=<server>;User ID=<username>;database=<database>;Password=<password>" 
oConn.Open() 

if oConn.State == 0: 
    print "We've connected to the database." 
    db_cmd = """SELECT tag FROM pipoint WHERE tag LIKE 'TAG0001%'""" 
    oRS.ActiveConnection = oConn 
    oRS.Open(db_cmd) 
    while not oRS.EOF: 
     #print oRS.Fields.Item("tag").Value # Ability to print by a field name 
     print oRS.Fields.Item(0).Value  # Ability to print by a field location 
     oRS.MoveNext() 
    oRS.Close() 
    oRS = None 
else: 
    print "Not connected" 

if oConn.State == 0: 
    oConn.Close() 
oConn = None 

  • これはOSIソフトによって提供PIOLEDBドライバを必要とするが、このコードを実行するマシンにインストールされています。
  • パフォーマンスはこの方法では恐ろしくないようです。私は他のいくつかのクエリで数十万レコードを取り戻すことができ、許容時間内に戻った。
+0

これを数ヶ月使用した後、ただちにフォローアップしてください。これは私がpythonでこれを行うために見つけた唯一の方法ですが、多数のクエリを実行する必要があるときは非常に遅いようです。私はそれぞれのクエリのデータベース接続を開く/閉じる必要があるためだと思うが、OSI PI/ADODBはそうしないと文句を言う。パフォーマンスはまだ私がこれを書き直すことを余儀なくされているところに達していません。もしそうなったら、私は再びフォローアップします。その間、このソリューションを使用している他の人は、多くのクエリを実行すると速度が遅いことに注意する必要があります。 – Andy

+0

どのバージョンのOSI PIを使用していますか? – bud

+0

@bud - PIサーバー:3.4.390.18; PIOLEDB:3.3.1.2 – Andy

関連する問題