2012-01-17 4 views
1

pyodbc을 사용하여 데이터베이스 연결을 관리합니다. 내가 OSI PI 데이터베이스에 연결이 오류 수신을 시도하고있다 : 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.어떻게 OSI PI에 파이썬 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)")

을,이 반응을 얻었다 그냥이 시점에서 연결을 시도 :

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에 연결 했습니까? 그렇다면 어떻게 그랬습니까? 그렇지 않고 OSI 데이터베이스에서 여전히 데이터를 사용했다면 어떻게 그 데이터에 액세스 했습니까?

+0

'R'' RODBC' 패키지를 사용하여 PIODBC에 연결하는 데 문제가있었습니다. 증상은 모든 쿼리가 0 행을 반환한다는 것이 었습니다. 해결책은'RODBC'가 한 번에 하나의 행 ('rows_at_time = 1')을 가져오고 ('believeNRows = FALSE') PI ODBC 드라이버가 행 수를 엉망으로 만들었 기 때문입니다. 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 

주 :

  • 이 OSIsoft의에 의해 제공되는 PIOLEDB 드라이버를 필요로이 코드를 실행하는 컴퓨터에 설치됩니다.
  • 성능은이 방법으로는 끔찍하지 않은 것처럼 보입니다. 다른 쿼리를 사용하여 수십만 개의 레코드를 되 찾을 수 있었고 허용되는 시간 내에 반환되었습니다.
+0

몇 달 동안 사용해 본 후이 작업을 수행하십시오. 이것은 여전히 ​​파이썬으로 이것을 수행하는 유일한 방법이지만 많은 수의 쿼리를 실행해야 할 때 매우 느린 것으로 보입니다. 각 쿼리에 대해 데이터베이스 연결을 열거 나 닫아야하기 때문에 OSI PI/ADODB가 불만을 제기하기 때문에 의심 스럽습니다. 성능이 내가 아직 재 작성해야하는 시점에 도달하지 못했습니다./할 경우 다시 후속 조치를 취할 것입니다. 그 동안이 솔루션을 사용하는 다른 사람들은 많은 쿼리를 실행할 때 속도가 느리다는 것을 알아야합니다. – Andy

+0

어떤 버전의 OSI PI를 사용하고 있습니까? – bud

+0

@bud - PI 서버 : 3.4.390.18; PIOLEDB : 3.3.1.2 – Andy