Obtener mensajes de SQL Server con ADO y win32com

ctualmente estoy tratando de escribir una herramienta que hará que sea muy fácil para un usuario no experto en informática hacer una copia de seguridad de una base de datos de SQL Server.

Para hacer esto, espero usar una mezcla interesante de ADO, win32com y adodbapi. Actualmente puedo conectarme fácilmente al servidor y emitir unBACKUP DATABASE Comando T-SQL.

Esto funciona, sin embargo, a menudo el comando tarda mucho tiempo en ejecutarse (especialmente en bases de datos muy grandes). Con este fin, esperaba capturar y analizar elInfoMessage evento MSDN) y úselo para mostrar un porcentaje de barra / contador.

Esto también lo he logrado, ahora estoy atrapado en el obstáculo final, analizando el evento. Los MSDN docs dicen que debería pasarme unErro o Errores objeto en elpError parámetro. Sin embargo win32com me pasa unPyIUnknown objeto con el que no sé cómo tratar.

Abajo está el código que he escrito hasta ahora:

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'

Puede alguien extraer los mensajes informativos de los eventos?

Esto se implementa en VB (Yo creo que

Para ver un ejemplo de uno de estos mensajes, inicie SQL Server Management Studio y ejecute una copia de seguridad con un script (puede generar el script con el diálogo de respaldo y el botón de script en la esquina superior izquierda). Notará que cuando ejecuta el script, el cuadro de mensajes se completará con mensajes de porcentaje completado. Esto es lo que quiero.

Editar

Abajo está el nuevo código que estoy usando para interrogar los objetos COM que se pasan a laInfoMessage. Esto se basa en la respuesta a continuación, lo pondré aquí en caso de que alguien más lo necesite.

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