我正在尝试使用 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连接。我很好奇是否有人知道其他原因。