我试图在便携式应用程序中使用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驱动程序管理器?
答案 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
文件(在其他操作系统上)。