使用adodbapi连接SQLServer 2005
我刚开始学习Python,现在在一台装有Windows 7 32位系统的电脑上安装了Python 3.2。我想用adodbapi-2.4.2.2这个最新版本来连接MSSQLServer 2005。
我的代码和连接字符串是这样的:
conn = adodbapi.connect('Provider=SQLNCLI.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=XXX;Data Source=123.456.789');
但是,我在使用adodbapi时总是遇到错误(这是我在Wing IDE的控制台看到的完整错误信息):
追踪信息(最近的调用在最前面): 文件 "D:\Program Files\Wing IDE 4.0\src\debug\tserver_sandbox.py",第2行,在 如果 name == 'main': 文件 "D:\Python32\Lib\site-packages\adodbapi\adodbapi.py",第298行,在 connect 引发 InterfaceError #可能是COM错误 adodbapi.adodbapi.InterfaceError:
我可以跟踪代码,看到异常发生的地方。
我还尝试过用OLEDB提供程序和集成Windows安全的连接字符串,结果也是一样。
这些连接字符串在我的工作站上的UDL文件和SSMS中都能正常工作,但在adodbapi中却出现同样的错误。
我该怎么解决这个问题呢?
3 个回答
我也遇到过同样的问题,后来发现是因为没有加载win32com.pyd文件,原因是一些系统的DLL文件没有在“dll加载路径”中,比如msvcp100.dll。
我解决这个问题的方法是把很多这些DLL文件(可能有点多)复制到了C:\WinPython-64bit-3.3.3.2\python-3.3.3.amd64\Lib\site-packages\win32这个文件夹里。
如果还有其他人看到这个帖子,想要解决类似我在使用Python 2.7时遇到的错误:
Traceback (most recent call last):
File "get_data.py", line 10, in <module>
connection = get_connection(r"XXX\YYY", "DB")
File "get_data.py", line 7, in get_connection
conn = adodbapi.connect(connstring)
File "C:\Python27\lib\site-packages\adodbapi\adodbapi.py", line 116, in connect
raise api.OperationalError(e, message)
adodbapi.apibase.OperationalError: (InterfaceError("Windows COM Error: Dispatch('ADODB.Connection') failed.",), 'Error opening connection to "Data Source=XXX\\YYY; Initial Catalog=DB; Provider=SQLOLEDB.1; Integrated Security=SSPI"')
在我的情况下,简单的解决办法是从这里安装Windows的Python扩展(pywin32):
http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/
试试这个连接字符串:
Initial Catalog=XXX; Data Source=<servername>\\<SQL Instance name>; Provider=SQLOLEDB.1; Integrated Security=SSPI
更新
嗯,好吧。看了adodbapi的源代码,我觉得你遇到了一个COM错误。(是的,我知道错误追踪信息里提到了这一点)。具体来说,是在初始化相关的COM对象时出的问题。
这意味着你的连接字符串和错误追踪信息没有关系。我觉得一个好的起点是确保你的pythoncom是最新的。
可能win32com/pythoncom还不支持Python 3K(3.0及以上版本),不过我在网上搜索了一分钟也没找到有用的信息,这个就留给你自己去查吧。
当你解决了问题后,这段代码应该能成功运行(而现在应该是会失败的)。
import win32com.client
import pythoncom
pythoncom.CoInitialize()
win32com.client.Dispatch('ADODB.Connection')
此外,任何这段代码抛出的异常信息都对调试你的问题很有帮助。