Как я могу подключить Python 2.6 к OSI PI? - PullRequest
1 голос
/ 17 января 2012

Я использую pyodbc для управления соединениями с базой данных. Я пытаюсь подключиться к базе данных OSI PI и получаю эту ошибку:

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

Кто-нибудь подключал python к OSI PI? Если да, то как ты это сделал? Если нет, и вы все еще использовали данные в базе данных OSI, как вы в итоге получили к ним доступ?

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Я понял, как это сделать. Мне пришлось отказаться от использования 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

Примечания:

  • Для этого требуется, чтобы драйвер PIOLEDB, предоставляемый OSISoft, был установлен на машине, на которой выполняется этот код.
  • Производительность не кажется ужасной с этим методом. Я смог отозвать несколько сотен тысяч записей с некоторыми другими моими запросами, и он вернулся за приемлемое количество времени
0 голосов
/ 17 января 2012

Попробуйте использовать это http://pypi.python.org/pypi/ceODBC/2.0.1

...