Obtenção de mensagens do SQL Server usando ADO e win32com

No momento, estou tentando escrever uma ferramenta que facilite o backup de um banco de dados do SQL Server para um usuário sem conhecimentos de informátic

Para fazer isso, espero usar uma interessante mistura de ADO, win32com e adodbapi. Atualmente, posso me conectar facilmente ao servidor e emitir umBACKUP DATABASE Comando T-SQL.

Isso funciona, no entanto, muitas vezes leva muito tempo para o comando executar (especialmente em bancos de dados muito grandes). Para esse fim, eu esperava capturar e analisar oInfoMessage evento MSDN) e use-o para mostrar uma barra / contador percentua

Isso eu também consegui, agora estou preso no obstáculo final, analisando o evento. O MSDNs @ docs dizem que eu deveria receber umErr ou Erros objeto nopError parâmetro. No entanto win32com me passa umPyIUnknown objeto com o qual não sei lida

Abaixo é o código que escrevi até agora:

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'

lguém pode extrair as mensagens informativas dos evento

Este é implementado em VB (Eu acho que

Para obter um exemplo de uma dessas mensagens, inicie o SQL Server Management Studio e execute um backup usando um script (você pode gerar o script usando a caixa de diálogo de backup e o botão de script no canto superior esquerdo). Você notará que, ao executar o script, a caixa de mensagens será preenchida com a porcentagem de mensagens concluídas. É isso que eu quero.

Editar

Abaixo é o novo código que estou usando para interrogar os objetos COM que são passados para oInfoMessage. Isso se baseia na resposta abaixo. Estou colocando aqui caso alguém mais precis

def OnInfoMessage(self, pError, adStatus, pConnection):
    print 'Info Message'
    a = pError.QueryInterface(pythoncom.IID_IDispatch)
    a = win32com.client.Dispatch(a)
    print a.Description
    print a.Number
    print a.Source
    #print 'B', adStatus
    c = pConnection.QueryInterface(pythoncom.IID_IDispatch)
    c = win32com.client.Dispatch(c)
    print c.Errors.Count
    print c.Errors.Item(0).Description
    print c.Errors.Clear()
    print 'c', adStatus

questionAnswers(1)

yourAnswerToTheQuestion