0

私は SQL Sever 2008 R2/64 ビット データベース サーバーを使用しており、そのために Sql Server Management Objects (SMO) を使用してかなり基本的なスクリプト ユーティリティを作成しています。私のプロジェクトは、C# で記述された 32 ビットの VS2010 実行可能ファイルです。

努力のほとんどはかなり単純で成功しています。私が抱えている唯一の問題は、スクリプト エラーに応答して呼び出す必要があるカスタム イベント ハンドラーの起動にあります。

Scripterオブジェクトはイベントを公開します。ScriptingErrorこれを活用しようとしました:

//srv contains a valid server name
Scripter scrp = new Scripter(srv);

//scrp_ScriptingError is my handler
scrp.ScriptingError += new ScriptingErrorEventHandler(scrp_ScriptingError); 

私のハンドラーは次のように宣言されています:

   static void scrp_ScriptingError(object sender, ScriptingErrorEventArgs e)
   {
       // my handler goes here, just printing e.Current.Urn to the console
       // This is merely representative, have had other things here, but
       // the handler never fires
       Console.WriteLine(e.Current.Value);
   }

これはすべてき​​れいにコンパイルされます。

私のコードは、スクリプト化されたデータベース オブジェクトの単なる配列であるscrp.Script(urns);simpleを介して呼び出されます。urns派手なものはありません:

    try
    {
        sc = scripter.Script(urns);
    }
    catch (Exception e)
    {
        WriteLog(String.Format("Failure during scripting: {0}: Inner exception message (if any): {1}",e.Message,((e.InnerException==null)?"[None]":e.InnerException.Message)));
    }
    using (System.IO.StreamWriter file = new System.IO.StreamWriter(fileName,true))
    {
        foreach(String currentLine in sc)
        {
            file.WriteLine(currentLine);
            file.WriteLine("GO");
        }
    }

問題は、これまでに何を試しても、スクリプト作成中にエラーが発生すると、ScriptingError ハンドラが起動しないことです。

VS2010 内のデバッグ モードでも、ハンドラー内にブレークポイントを設定し、スクリプト コードを起動して、エラーが発生することがわかっている場合、例外のみがスローされますが、ScriptingError ハンドラーのブレークポイントはトリップしません。

私は現在、trees-for-forest モードに入っていますが、何が間違っていたのかわかりません。ScriptingError ハンドラに間違ったことを期待しているのでしょうか?

SMO オブジェクトに関する MSDN のドキュメントを検索しましたが、ScriptingError ハンドラーについては、基本的な API 呼び出し自体と、インターネット上の貴重な例を除いて、事実上何も見つかりませんでした。イベントハンドラーをイベントに割り当てるだけで、信じられないほどシンプルで簡単に思えますが、注意しなかったバッテリーが含まれていないという通知がいくつかあります。

エラーが私の側で非常にばかげている場合は、最小限のブリックバットを丁寧に要求して、私のエラーへのポインターを大歓迎します:)

4

1 に答える 1