Pyodbc在较旧版本的sql驱动程序中出现异常,但在最新版本中失败

2024-09-30 08:22:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用pyodbc连接SQL server。在这种情况下,服务器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;'

python脚本甚至在使用基类异常处理try-catch块的情况下也会崩溃

以下是事故详情:

 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


Tags: namesqlinformationserverapplicationversionexeadditional
1条回答
网友
1楼 · 发布于 2024-09-30 08:22:02

尝试将驱动程序参数从“SQL Server”更改为“SQL Server本机客户端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。我很好奇是否有人知道还有什么原因

相关问题 更多 >

    热门问题