Python всегда падает, используя соединение pydobc
Мне тяжело с pyodbc
модуль (python3
). Следующий код всегда дает сбой Python (я запускаю его из терминала DOS). Авария происходит, когда main()
функция возвращает. Мой источник данных - удаленный сервер базы данных 4D v13. Я использую драйвер 4D-ODBC, который, кажется, правильно установлен, но на самом деле не эффективный драйвер. Я отключил соединение SSL и мой брандмауэр.
class ODBCSource:
def __init__(self, dsn):
self.dsn = str(dsn)
try:
self.con = pyodbc.connect("dsn={}".format(self.dsn))
self.cur = self.con.cursor()
logger.info("ODBC Source DSN='{}' connected.".format(self.dsn))
except Exception as err:
self.con = None
self.cur = None
logger.error("Cannot connect ODBC Source DSN='{}': {}.".format(self.dsn, err))
def __bool__(self):
return not(self.con is None) or not(self.cur is None)
def __str__(self):
return "<cripython.dal.ODBCSource id={:#x} dsn='{}'>".format(id(self), self.dsn)
__repr__ = __str__
# Main Function:
def main():
db = ODBCSource('CRIPI-4D')
# Program Entry Point:
if(__name__ == "__main__"):
main()
Трассировка окна сбоя Windows дает мне следующую информацию:
Problem signature:
Problem Event Name: APPCRASH
Application Name: python.exe
Application Version: 0.0.0.0
Application Timestamp: 5066b7a2
Fault Module Name: 4DODBC.dll
Fault Module Version: 14.0.1.0
Fault Module Timestamp: 53b4d1d6
Exception Code: c0000005
Exception Offset: 00031798
OS Version: 6.1.7601.2.1.0.256.48
Locale ID: 2060
Additional Information 1: 0a9e
Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
Additional Information 3: 0a9e
Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
Я включил трассировку ODBC, чтобы проверить, что может быть не так с кодом. Я нашел 3 ошибки в журнале.
[...]
odbcsource 1724-2a8 ENTER SQLGetTypeInfo
HSTMT 0x0059B1F0
SWORD 12 <SQL_VARCHAR>
odbcsource 1724-2a8 EXIT SQLGetTypeInfo with return code -1 (SQL_ERROR)
HSTMT 0x0059B1F0
SWORD 12 <SQL_VARCHAR>
DIAG [24000] [Microsoft][ODBC Driver Manager] Invalid cursor state (0)
odbcsource 1724-2a8 ENTER SQLGetTypeInfo
HSTMT 0x0059B1F0
SWORD -9 <SQL_WVARCHAR>
odbcsource 1724-2a8 EXIT SQLGetTypeInfo with return code -1 (SQL_ERROR)
HSTMT 0x0059B1F0
SWORD -9 <SQL_WVARCHAR>
DIAG [24000] [Microsoft][ODBC Driver Manager] Invalid cursor state (0)
odbcsource 1724-2a8 ENTER SQLGetTypeInfo
HSTMT 0x0059B1F0
SWORD -2 <SQL_BINARY>
odbcsource 1724-2a8 EXIT SQLGetTypeInfo with return code -1 (SQL_ERROR)
HSTMT 0x0059B1F0
SWORD -2 <SQL_BINARY>
DIAG [24000] [Microsoft][ODBC Driver Manager] Invalid cursor state (0)
odbcsource 1724-2a8 ENTER SQLFreeStmt
HSTMT 0x0059B1F0
UWORD 0 <SQL_CLOSE>
[...]
Кстати, когда я запускаю этот скрипт из Python IDLE, я не получаю никакой ошибки вообще. Кто-нибудь знает, что не так с этим кодом и как мне его решить?
1 ответ
Альтернативой pyodbc, которая может решить проблему сбоев, может быть использование этого родного драйвера Python для 4D ( p4d), созданного Israel Brewster на Github.
p4d - это драйвер, совместимый с Python Database API 2.0, для сервера баз данных 4D (4-го измерения). Таким образом, использование должно быть знакомо любому, кто использовал какие-либо модули базы данных Python ранее. Этот модуль основан на библиотеке C, предоставленной 4D, и интегрирован с Python с использованием CFFI. Таким образом, для установки этого модуля требуется CFFI.
Драйвер p4d построен из 4D/SQLlib_4D