是否可以直接在ODBC连接字符串中指定驱动程序DLL?

时间:2016-10-26 13:06:54

标签: python windows odbc pyodbc

我试图在便携式应用程序中使用pyodbc连接到SQL Server(通过FreeTDS的MS SQL Server);因为它应该是独立的,所以我想避免在系统上显式安装驱动程序,只需在应用程序中引入ODBC驱动程序。

This page表示可以直接在连接字符串中指定驱动程序dll

  
      
  • DRIVER=函数的szConnStrIn参数中指定SQLDriverConnect参数。例如:

    szConnStrIn = "driver=ospath/dbodbc6.dll;dbf=c:\asademo.db"
    
         

    其中ospath是Adaptive Server Anywhere安装目录的操作系统子目录。

  •   

在Linux上通过pyodbc + libtdsodbc.so试一试,它确实可以正常工作;但是,在Windows上尝试相同(pyodbc + tdsodbc.dll)我总是得到

  

pyodbc.Error:(' IM002',' [IM002] [Microsoft] [ODBC驱动程序管理器]未找到数据源名称且未指定默认驱动程序(0)(SQLDriverConnect)&# 39)

(我的libtdsodbc.so似乎很好,因为,如果我将它安装为"常规"驱动程序并使用其名称引用它可以正常连接

检查the documentation of SQLDriverConnect及相关网页时,没有提及直接使用dll路径的DRIVER=选项。

所以,不是"直接到司机dll" Windows不支持连接?是否有任何替代方法,特别是使用Python,可以直接连接到驱动程序dll,绕过ODBC驱动程序管理器?

2 个答案:

答案 0 :(得分:1)

就像the answer by TallTed所提到的那样,您链接的文档包含了大量信息(但可能当时不存在),并且在driver参数的含义上也很明确:

由SQLDrivers函数返回的驱动程序说明。对于 例如Rdb或SQL Server。

因此,在Windows中指示那里的路径(至少具有默认的ODBC实现)无效无效。

在没有注册的情况下,通常似乎也无法使用ODBC驱动程序,这需要管理员权限。 This answer列出了一些选项。

答案 1 :(得分:0)

现在(2.5年后)可能无法解决此问题,但我最好的猜测是未注册的libtdsodbc.so上有错字或权限错误,或者您的SQLDriverConnect()通话中有其他错误(您没有提供,因此无法进行分析。)

我认为您不应该像the documentation of SQLDriverConnect()那样仔细或完整地阅读explicitly includes DRIVER in the EBNF of SQLDriverConnect()-

empty-string ::=attribute ::= attribute-keyword=attribute-value | DRIVER=[{]attribute-value[}]

-和discusses it further in the details of the "Comments" section

请注意,尽管它确实建立了无DSN的连接,但它不会“绕过ODBC驱动程序管理器”(因此,它既不引用Windows上的odbc.ini注册表树,也不引用odbc.ini文件(在其他操作系统上)。