質問

現在、非コンピューターのリテラシーユーザーがSQL Serverデータベースをバックアップできるようにするツールを作成しようとしています。

これを行うには、Ado、Win32com、Adodbapiの興味深いミックスを使用したいと考えています。現在、私はサーバーに簡単に接続して、 BACKUP DATABASE T-SQLコマンド。

これは機能しますが、コマンドが実行されるまでに長い時間がかかることがよくあります(特に非常に大きなデータベースで)。この目的のために、私はキャプチャして解析したいと思っていました InfoMessage イベント (MSDN)そしてそれを使用して、パーセンテージバー/カウンターを表示します。

これも私が管理しています。私は今、私はイベントを解析して、最後のハードルに固執しています。 MSDN ドキュメントは、私はどちらかを渡すべきだと言います エラー また エラー のオブジェクト pError パラメーター。しかし、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 (おもう)

これらのメッセージのいずれかの例については、SQL Server Management Studioを起動し、スクリプトを使用してバックアップを実行します(左上のバックアップダイアログとスクリプトボタンを使用してスクリプトを生成できます)。スクリプトを実行すると、メッセージボックスが完全なメッセージのパーセンテージで入力されることに気付くでしょう。これらは私が欲しいものです。

編集:

以下は、に渡されるcomオブジェクトを尋問するために使用している新しいコードです InfoMessage. 。これは以下の答えに基づいています。他の誰かがそれを必要としている場合に備えて、ここに置いています。

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
役に立ちましたか?

解決

MSDNを読むだけです Error オブジェクトはイベントハンドラーに渡される必要があります。複数のエラーがある場合、からそれらを取得できます Errors コレクション あなたの Connection 物体. 。したがって、エラーオブジェクトのみが渡されることを期待する必要があります InfoMessage(). 。代わりにpyiunknownを取得した場合、電話してみることができます QueryInterface() その上でIdispatchをリクエストしますか?特定のカスタムインターフェイスをリクエストすることもできます Error 使用しますが、Pythoncomがカスタム(つまりIDISPATCH)インターフェイスをサポートしていて、インターネットが今すぐクロールしているので、確認できないので、自分で確認する必要があります。とにかく、Idispatchは何があっても動作するはずです。それがVB6が使用するものだからです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top