0

我正在尝试使用 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 Driver 17 for SQL Server} 时,作为一种解决方法

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

即使使用基类 Exception 处理异常的 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>

通过 cmd 使用 python.exe 运行时。在 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

4

1 回答 1

2

尝试将驱动程序参数从“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 连接。我很好奇是否有人知道还有什么原因。

于 2021-01-27T18:00:28.697 回答