用于32位python(3.6)的32位pyodbc适用于Microsoft的64位odbc驱动程序。为什么?

用于32位python(3.6)的32位pyodbc适用于Microsoft的64位odbc驱动程序。为什么?

问题描述:

我可以观察到:
用于32位python(3.6)的32位pyodbc适用于Microsoft的64位odbc驱动程序。为什么?

  • 我使用Windows 7 64位我的代码(建立与 一个SQL服务器在网络上的ODBC连接,只有简单的读取工作)是用Python编写的3.6 。 2 32bit
  • 我点了安装pyodbc,所以我假设也是32位。
  • 我从Microsoft网站下载并安装了64位“Microsoft®ODBC驱动程序13.1 for SQLServer®”。
  • 我的python代码连接到网络上运行server2003 32位和SQL Server 2005(32位)或sql2008(32位)的其他计算机上的 。

设置工作。

此外:粗略测试表明,上述设置可以成功连接到运行sql2012(64位)的Microsoft server2008(64位)的计算机,并且“SQL Server Network Connection(32位)”下的配置为空(即, 32位DLL丢失),而默认的64位网络连接配置包含通常的配置选项,如IP地址和侦听端口信息。

我自己的解释:
[1]在客户端和服务器的操作系统和ODBC接口可以是任何32/64位的组合,但旅行经过我的计算机和SQL Server的计算机会之间的网络协议相同。
[2] 32位python + pyodbc可以与微软的64位odbc驱动程序交谈,因为... 32位python知道如何使用64位DLL ...?

32位应用程序无法调用64位dll,因此python 32bit无法确定与64位驱动程序通信。

用于SQL Server msodbc司机在本质上是一个DLL文件:msodbcsql13.dll

我只是发现了(它甚至没有通过微软提到的)说:“ODBC SQL Server的13.1 64”将安装64位msodbcsql13在system32中的.dll和SysWOW64中的32位msodbcsql13.dll(64位Windows系统上的“system32”的32位版本)

我不能确定32位客户端与64位sql服务器交谈时的网络协议是与64位客户端与64位SQL服务器对话相同。但是,我认为,一旦客户端向服务器请求网络,32位或64位无关紧要。有人请对此发表评论

+0

*“我认为,一旦客户端向服务器请求网络时,32位或64位无关紧要。”* - 这是正确的。 –

+0

@GordThompson谢谢,是因为ODBC规范锁定了协议以在驱动程序之间交换信息。所以我们没有像32位/ 64位指针混淆的问题,或者像int这样的问题可以是32位或64位。服务器上的64位odbc驱动程序可以理解由32位odbc客户端发出的odbc语言。它几乎就像COM对象,铁包层规格,不管位数。 – eliu