2012-01-17 2 views
1

Я использую pyodbc для управления подключениями к базе данных. Я пытаюсь подключиться к базе данных OSI PI и получать эту ошибку:Как подключить Python 2.6 к 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, как вы в итоге получили доступ к нему?

+0

У меня возникли проблемы с использованием пакета 'R'' RODBC' для подключения к PIODBC. Симптом состоял в том, что все запросы возвращали нулевые строки. Решение заключалось в том, чтобы установить «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 

Примечание:

  • Это требует драйвера PIOLEDB предоставленного OSIsoft установлено на машине, которая запускает этот код.
  • Исполнение не кажется ужасным с помощью этого метода. Мне удалось оттянуть несколько сотен тысяч записей с некоторыми из моих других запросов, и он вернулся в течение приемлемого времени
+0

Просто после этого после использования в течение нескольких месяцев. Это все еще единственный способ, которым я нашел это с помощью python, но он кажется очень медленным, когда мне нужно запустить большое количество запросов. Я подозреваю, что это связано с тем, что я должен открыть/закрыть соединение с базой данных для каждого запроса, но OSI PI/ADODB жалуется, если я этого не делаю. Производительность не дошла до того момента, когда я вынужден переписать это еще. Если/когда я это сделаю, я снова буду следить. Тем временем другие, использующие это решение, должны знать, что при запуске многих запросов он работает медленно. – Andy

+0

Какую версию OSI PI вы используете? – bud

+0

@ bud - сервер PI: 3.4.390.18; PIOLEDB: 3.3.1.2 – Andy

Смежные вопросы