Pyodbc 使用旧版本的 sql 驱动程序给出异常,但在最新版本时失败



我正在尝试使用 pyodbc 连接 SQL 服务器。在该服务器中,SSL3.0 被禁用,TLS 1.1 和 1.2 被启用。

当我使用最旧的驱动程序{SQL Server}时。我正在处理以下异常。

pyodbc.connect('DRIVER={SQL Server};SERVER=XX;DATABASE=XX;UID=XX;PWD=XX;'
('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SSL Security error (18) (SQLDriverConnect); [08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (SECDoClientHandshake()). (772)')

但是,作为解决方法,当我使用最新的 odbc 驱动程序 {ODBC 驱动程序 17 for SQL Server}

pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=XX;DATABASE=XX;UID=XX;PWD=XX;'

即使使用基类异常来处理异常的 try catch 块,python 脚本也会崩溃。

以下是崩溃的详细信息:

Problem Event Name:    APPCRASH
Application Name: pythonw.exe
Application Version:  3.8.150.1013
Application Timestamp:    5da4cb37
Fault Module Name:    msodbcsql17.dll
Fault Module Version: 2017.175.2.1
Fault Module Timestamp:   5e5e976f
Exception Code:   c0000005
Exception Offset: 00024005
OS Version:   6.1.7601.2.1.0.272.7
Locale ID:    2057
Additional Information 1: a7aa
Additional Information 2: a7aa91f17ea749d42a4de3b390fa5b3d
Additional Information 3: a7aa
Additional Information 4: a7aa91f17ea749d42a4de3b390fa5b3d

我还通过 ODBC 数据源管理启用了跟踪,并找到了以下跟踪:


pythonw.exe -c  a40-1154    ENTER SQLSetEnvAttr 
SQLHENV             0x00000000
SQLINTEGER                 201 <SQL_ATTR_CONNECTION_POOLING>
SQLPOINTER                 2 <SQL_CP_ONE_PER_HENV>
SQLINTEGER                   4 
pythonw.exe -c  a40-1154    EXIT  SQLSetEnvAttr  with return code 0 (SQL_SUCCESS)
SQLHENV             0x00000000
SQLINTEGER                 201 <SQL_ATTR_CONNECTION_POOLING>
SQLPOINTER                 2 <SQL_CP_ONE_PER_HENV>
SQLINTEGER                   4 
pythonw.exe -c  a40-1154    ENTER SQLAllocHandle 
SQLSMALLINT                  1 <SQL_HANDLE_ENV>
SQLHANDLE           0x00000000
SQLHANDLE *         0x047FEC6C
pythonw.exe -c  a40-1154    EXIT  SQLAllocHandle  with return code 0 (SQL_SUCCESS)
SQLSMALLINT                  1 <SQL_HANDLE_ENV>
SQLHANDLE           0x00000000
SQLHANDLE *         0x047FEC6C ( 0x029B1BE0)
pythonw.exe -c  a40-1154    ENTER SQLSetEnvAttr 
SQLHENV             0x029B1BE0
SQLINTEGER                 200 <SQL_ATTR_ODBC_VERSION>
SQLPOINTER                 3 <SQL_OV_ODBC3>
SQLINTEGER                   4 
pythonw.exe -c  a40-1154    EXIT  SQLSetEnvAttr  with return code 0 (SQL_SUCCESS)
SQLHENV             0x029B1BE0
SQLINTEGER                 200 <SQL_ATTR_ODBC_VERSION>
SQLPOINTER                 3 <SQL_OV_ODBC3>
SQLINTEGER                   4 
pythonw.exe -c  a40-1154    ENTER SQLAllocHandle 
SQLSMALLINT                  2 <SQL_HANDLE_DBC>
SQLHANDLE           0x029B1BE0
SQLHANDLE *         0x0041F4B0
pythonw.exe -c  a40-1154    EXIT  SQLAllocHandle  with return code 0 (SQL_SUCCESS)
SQLSMALLINT                  2 <SQL_HANDLE_DBC>
SQLHANDLE           0x029B1BE0
SQLHANDLE *         0x0041F4B0 ( 0x029B1C58)
pythonw.exe -c  a40-1154    ENTER SQLDriverConnectW 
HDBC                0x029B1C58
HWND                0x00000000
WCHAR *             0x04848B34 [      -3] "****** 0"
SWORD                       -3 
WCHAR *             0x04848B34 
SWORD                       -3 
SWORD *             0x00000000
UWORD                        0 <SQL_DRIVER_NOPROMPT>

当使用 python 运行时.exe到 cmd. 在cmd中找不到痕迹,但再次崩溃,详细信息如下:

Problem signature:
Problem Event Name:   APPCRASH
Application Name: python.exe
Application Version:  3.8.150.1013
Application Timestamp:    5da4cb35
Fault Module Name:    msodbcsql17.dll
Fault Module Version: 2017.175.2.1
Fault Module Timestamp:   5e5e976f
Exception Code:   c0000005
Exception Offset: 00024005
OS Version:   6.1.7601.2.1.0.272.7
Locale ID:    2057
Additional Information 1: a7aa
Additional Information 2: a7aa91f17ea749d42a4de3b390fa5b3d
Additional Information 3: a7aa
Additional Information 4: a7aa91f17ea749d42a4de3b390fa5b3d

尝试将驱动程序参数从"SQL Server"更改为"SQL Server Native Client 11.0"。这为我带来了成功的连接。

import pyodbc
conn = pyodbc.connect('DRIVER={SQL Server Native Client 11.0};SERVER=<your server name>;Trusted_Connection=yes')

就我而言,"SQL Server"驱动程序参数在某些计算机上有效,但在其他计算机上不起作用。我怀疑这是服务器端的TLS禁用问题,因为其他机器可以与pyodbc连接。我很好奇是否有人知道其他原因。

相关内容

  • 没有找到相关文章

最新更新