2012-10-16 35 views
0

我有,我正在写与SQL Server管理一些相当基本的脚本实用程序,SQL Sever的2008 R2/64位数据库服务器对象(SMO)。我的项目是一个用C#编写的32位VS2010可执行文件。SqlServer的SMO Scripting.ScriptingError事件处理程序不触发

大部分的努力都相当简单和成功。我遇到的唯一问题是我的自定义事件处理程序的触发器,应该在响应脚本错误时调用它。

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处理程序几乎没有要求自己,珍贵的几个例子在互联网上。对我而言,这似乎非常简单直接 - 只是给事件分配了一个事件处理程序 - 但还有一些我没有注意到的未包含电池的通知。

指针到我的错误是极大的赞赏,与旁人的言语中伤最小的礼仪要求,如果错误是我的一部分:)

+0

你能给出一个例子来说明抛出的异常吗? –

+0

好吧,它永远不会真正重要 - 无论发生什么异常,都不会触发ScriptingError事件。它通常总是一个简单的“脚本失败的服务器x​​xxx”,内部的例外情况如下:“属性HeaderText不适用于过程xxxxx”,另一次是“无法检索依赖关系”,这两者都可以修复不同的Scripter对象上的选项。我只是希望我的ScriptingError处理程序在发生时触发。 –

回答

2

我不是在PC正确认识非常愚蠢,但我想你应该尝试设置ContinueScriptingOnError选项。否则,SMO没有理由调用该事件,而是通过一个异常来代替。

+0

这就是我想的,但将此选项设置为true/false不会有任何区别。感谢您花时间提供答案! –

+0

好吧,伙计们,从再次尝试它的黑暗中,我改变它为假,重新编译,仍然没有工作,改变它回到真实,瞧,它神奇地开始工作。 *叹*。快乐的答案点给你! :) –

相关问题