【问题标题】:Use SMO DLL in Python using win32com使用 win32com 在 Python 中使用 SMO DLL
【发布时间】:2011-12-08 21:19:18
【问题描述】:

我正在尝试通过 pyWin32 使用 Python 2.7 中的 SQL Server SMO 库。我可以导入win32com,但我在任何尝试访问该库时都受到了阻碍。我正在尝试的代码如下。

import sys
sys.path.append(r'C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies')
import win32com.client
server = win32com.client.Dispatch('Microsoft.SqlServer.Management.SMO.Server')

def main():
    print server

if __name__ == '__main__':
    main()

运行此代码时,我得到pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)

似乎我只是在调用 Dispatch 时弄错了库的名称,但我想不出任何方法来知道它应该是什么。


看起来这实际上可能是一个路径问题。

这行得通:

import win32api
win32api.LoadLibrary(r'C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Smo.dll')

但是,这不是:

import sys
sys.path.append(r'C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies')
import win32api
win32api.LoadLibrary(r'Microsoft.SqlServer.Smo.dll')

【问题讨论】:

    标签: python sql-server smo pywin32


    【解决方案1】:

    win32com 用于使用 COM 库,它对 .NET 程序集一无所知。目前,没有办法直接从 CPython 使用 .NET,因此您的选择是 use IronPython 或用 C# 或其他方式编写命令行工具,然后从 Python 调用它。

    【讨论】:

    • 谢谢。显然我不明白 COM 库和 .NET 程序集之间的区别......
    【解决方案2】:

    除了@Pondlife 的回答(对于所提出的问题是正确的)之外,还可以使用Python for .NET 模块和以下代码在CPython 中加载.NET 程序集:

    import clr
    clr.AddReference("Microsoft.SqlServer.Smo")
    from Microsoft.SqlServer.Management.Smo import Server
    

    为了完成这项工作,我需要手动将程序集的路径添加到PYTHONPATH。我无法使用sys.path.append 让它工作。

    【讨论】:

    • 你不能在 linux 机器上运行它,对吗?这是在 windows 盒子上用 python 运行 smo 吗?
    • 正确,这是严格意义上的 Windows 解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多