0

我有一个 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 调用本身以及 Internet 上的极少数示例之外,几乎没有发现任何关于 ScriptingError 处理程序的内容。对我来说,这似乎非常简单和直接——只需为事件分配一个事件处理程序——但有一些我没有注意到的不包括电池的通知。

非常感谢您指出我的错误,如果我的错误非常愚蠢,请礼貌地要求最少的砖块:)

4

1 回答 1

2

我不知道,但我认为您应该尝试设置ContinueScriptingOnError选项。否则,SMO 将没有理由调用该事件,而是通过异常来代替。

于 2012-10-16T22:05:07.367 回答