私は 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 呼び出し自体と、インターネット上の貴重な例を除いて、事実上何も見つかりませんでした。イベントハンドラーをイベントに割り当てるだけで、信じられないほどシンプルで簡単に思えますが、注意しなかったバッテリーが含まれていないという通知がいくつかあります。
エラーが私の側で非常にばかげている場合は、最小限のブリックバットを丁寧に要求して、私のエラーへのポインターを大歓迎します:)