Pyodbc giving exception with older version of sql driver but failing with latest version

0

I am trying to connect a SQL server using pyodbc. In that server SSL3.0 is disabled and TLS 1.1 and 1.2 is enabled.

When I am using the oldest driver {SQL Server}. I am getting the below exception handled.

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)')

However, as a workaround when I used the latest odbc driver {ODBC Driver 17 for SQL Server}

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

The python script is crashing even with a try catch block using baseclass Exception to handle the exception.

Below is the details of crash:

 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

I also enabled trace through ODBC Data source Administration and found the below trace:


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>

When run with python.exe through cmd. No traces found in cmd but again that crashed with below details:

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

python
sql-server
pyodbc
tls1.2
asked on Stack Overflow Jun 24, 2020 by EXODIA • edited Jun 24, 2020 by EXODIA

1 Answer

0

Try changing the driver parameter from "SQL Server" to "SQL Server Native Client 11.0". This led to a successful connection for me.

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

In my case, the "SQL Server" driver parameter was working on some machines but not others. I'm doubtful that it was TLS disablement issue on the server side, since the other machines could connect with pyodbc. I am curious if someone knows what else may be the cause.

answered on Stack Overflow Jan 27, 2021 by paulzuradzki

User contributions licensed under CC BY-SA 3.0