【问题标题】:SqlServer SMO Scripting.ScriptingError event handler not firingSqlServer SMO Scripting.ScriptingError 事件处理程序未触发
【发布时间】:2012-10-16 19:32:59
【问题描述】:

我有一个 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 处理程序的内容。对我来说,这似乎非常简单和直接 - 只需为事件分配一个事件处理程序 - 但有一些不包括电池的通知我没有注意到。

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

【问题讨论】:

  • 你能举个例子说明抛出的异常类型吗?
  • 好吧,这并不重要——无论抛出什么异常,都不会触发 ScriptingError 事件。它通常总是一个简单的“服务器 xxxx 脚本失败”,内部异常如下:“属性 HeaderText 不适用于过程 xxxxx”,另一次是“无法检索依赖项”,两者都可以通过不同的方式修复Scripter 对象上的选项。我只是希望我的 ScriptingError 处理程序在它们发生时触发。

标签: sql-server database smo


【解决方案1】:

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

【讨论】:

  • 这就是我的想法,但是将此选项设置为 true/false 没有任何区别。尽管如此,还是感谢您花时间提供答案!
  • 好吧,伙计,从 Just Trying It Again For the Heck Of It 的黑暗中,我将其更改为 false,重新编译,仍然无效,将其更改回 true,瞧,它神奇开始工作。 叹息。给你快乐的答案! :)
猜你喜欢
  • 2012-04-15
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多