使用ADO和win32com获取sqlserver消息

2024-09-27 07:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试编写一个工具,它将使不懂计算机的用户非常容易地备份SQL Server数据库。在

为此,我希望使用ADO、win32com和adodbapi的有趣组合。目前,我可以轻松地连接到服务器并发出BACKUP DATABASET-SQL命令。在

这是可行的,但是执行命令通常需要很长时间(特别是在非常大的数据库上)。为此,我希望捕获并解析InfoMessage事件(MSDN),并使用它来显示百分比条/计数器。在

这一点我也做到了,现在我被困在最后一道关口,解析事件。MSDN文档表示应该在pError参数中传递一个ErrorErrors对象。但是win32com传递给我一个我不知道如何处理的PyIUnknown对象。在

以下是我目前为止编写的代码:

import win32com
import pythoncom
import adodbapi
from win32com.client import gencache
gencache.EnsureModule('{2A75196C-D9EB-4129-B803-931327F72D5C}', 0, 2, 8)

defaultNamedOptArg=pythoncom.Empty
defaultNamedNotOptArg=pythoncom.Empty
defaultUnnamedArg=pythoncom.Empty

class events():
    def OnInfoMessage(self, pError, adStatus, pConnection):
        print 'A', pError
        #print 'B', adStatus
        #print 'C', pConnection

# This is taken from the makepy file
#    def OnCommitTransComplete(self, pError=defaultNamedNotOptArg, adStatus=defaultNamedNotOptArg, pConnection=defaultNamedNotOptArg): pass
    def OnWillExecute(self, Source=defaultNamedNotOptArg, CursorType=defaultNamedNotOptArg, LockType=defaultNamedNotOptArg, Options=defaultNamedNotOptArg
            , adStatus=defaultNamedNotOptArg, pCommand=defaultNamedNotOptArg, pRecordset=defaultNamedNotOptArg, pConnection=defaultNamedNotOptArg):
        return Source
#    def OnDisconnect(self, adStatus=defaultNamedNotOptArg, pConnection=defaultNamedNotOptArg): pass
    def OnExecuteComplete(self, RecordsAffected=defaultNamedNotOptArg, pError=defaultNamedNotOptArg, adStatus=defaultNamedNotOptArg, pCommand=defaultNamedNotOptArg
            , pRecordset=defaultNamedNotOptArg, pConnection=defaultNamedNotOptArg): pass
        #print pError
    def OnWillConnect(self, ConnectionString=defaultNamedNotOptArg, UserID=defaultNamedNotOptArg, Password=defaultNamedNotOptArg, Options=defaultNamedNotOptArg
            , adStatus=defaultNamedNotOptArg, pConnection=defaultNamedNotOptArg): pass
#    def OnConnectComplete(self, pError=defaultNamedNotOptArg, adStatus=defaultNamedNotOptArg, pConnection=defaultNamedNotOptArg): pass
#    def OnBeginTransComplete(self, TransactionLevel=defaultNamedNotOptArg, pError=defaultNamedNotOptArg, adStatus=defaultNamedNotOptArg, pConnection=defaultNamedNotOptArg):pass
#    def OnRollbackTransComplete(self, pError=defaultNamedNotOptArg, adStatus=defaultNamedNotOptArg, pConnection=defaultNamedNotOptArg): pass




if __name__ == '__main__':

    pythoncom.CoInitialize()
    conn = win32com.client.DispatchWithEvents("ADODB.Connection", events)
    print dir(conn)
    conn.ConnectionString = 'Initial Catalog=test; Data Source=HPDX2250RAAZ\\SQLEXPRESS; Provider=SQLOLEDB.1; Integrated Security=SSPI'
    conn.CommandTimeout = 30
    print conn.ConnectionString
    conn.Open()

    con = adodbapi.Connection(conn)

    c = con.cursor()
    import time
    print 'Execute'
    time.sleep(1)
    c.execute(u"BACKUP DATABASE [test] TO DISK = N'c:/test/test2' WITH STATS = 1")
    print 'Done Execute'

有人能从事件中提取信息吗?在

这是在VB中实现的(我想)

例如,启动SQLServerManagementStudio并使用脚本运行备份(可以使用“备份”对话框和左上角的“脚本”按钮生成脚本)。您会注意到,当您运行脚本时,消息框将填充完成百分比的消息。这些是我想要的。在

编辑:

下面是我用来询问传递给InfoMessage的COM对象的新代码。这是基于下面的答案,我把它放在这里,以防其他人需要它。在

^{pr2}$

Tags: importself脚本defpass备份connwin32com
1条回答
网友
1楼 · 发布于 2024-09-27 07:20:24

读取MSDN时,似乎只有Error对象应该传递给事件处理程序。如果你有多个的集合,你可以从中得到多个错误。所以您应该只希望错误对象被传递到InfoMessage()。如果您得到pyunknown,也许您可以尝试对它调用QueryInterface()并请求IDispatch?您也可以尝试请求Error使用的特定自定义接口,但我不记得Pythoncom是否支持自定义(即非IDispatch)接口,而且我的internet正在爬网,所以我无法检查,所以您必须自己检查。不管怎样,IDispatch无论如何都可以工作,因为VB6就是这样使用的。在

相关问题 更多 >

    热门问题