我有一个SQL Sever 2008 R2 / 64位数据库服务器,我正在使用Sql Server管理对象(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);
调用的,其中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处理程序中的断点永远不会跳闸。
我现在正在以树林为模式,不知道我做错了什么。我是否期望ScriptingError处理程序出错?
我在SMO对象上搜索过MSDN文档,除了基本的API调用本身之外,在ScriptingError处理程序上几乎没有找到任何内容,并且在互联网上很少有例子。这对我来说似乎非常简单和直接 - 只是为事件分配了一个事件处理程序 - 但是有些电池没有包含通知我没有注意到。
非常感谢指向错误的指针,如果错误对我来说非常愚蠢,请提供最小的砖块礼貌请求:)