【问题标题】:c# and SMO - Get Message output such as "Table already exists" for loggingc# 和 SMO - 获取消息输出,例如“表已存在”以进行日志记录
【发布时间】:2009-09-28 11:59:55
【问题描述】:

我正在使用 SQL 管理对象连接到 SQL 服务器。目前,它们包含用于我的示例的简单“创建表”命令。

我故意运行此代码两次以导致“表已存在”的错误。

但是我下面的事件没有被触发。

任何人都有任何想法,我如何在我的代码中获取此消息,然后更改 ExecutionType 以停止导致异常的错误(我不想这样做,我想继续)

我的代码:

public void executeSomeSQL() {
    FileInfo file = new FileInfo(@"\c:\sqlcommands.sql");
    string script = file.OpenText().ReadToEnd();
    SqlConnection conn = new SqlConnection(sqlConnectionString);
    conn.InfoMessage +=new SqlInfoMessageEventHandler(conn_InfoMessage);
    Server server = new Server(new ServerConnection(conn));
    server.ConnectionContext.InfoMessage += new SqlInfoMessageEventHandler(ConnectionContext_InfoMessage);
    server.ConnectionContext.ExecuteNonQuery(script,ExecutionTypes.ContinueOnError);                
    MessageBox.Show("All Done");
}

事件:-

public void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e) {
    textBox3.Text += "1:"+DateTime.Now.ToString();
}

public void ConnectionContext_InfoMessage(object sender, SqlInfoMessageEventArgs e) {
    textBox3.Text += "2:" + DateTime.Now.ToString();
}

【问题讨论】:

    标签: c# smo


    【解决方案1】:

    根据MSDN

    InfoMessage 事件发生在一个 严重性为 10 或更低的消息 由 SQL Server 返回。留言 严重程度在 11 到 20 之间 引发错误和消息 严重程度超过 20 会导致 连接关闭。

    已存在的表上的 CreateTable 的错误严重性为 16,这绕过了 InfoMessage 事件。

    您可能希望将 TSQL 包装在 Try...Catch 块中并使用 RAISEERROR。 TRY...CATCH 构造会捕获所有严重程度大于 10 且不会终止数据库连接的执行错误。

    或者,您可能希望在 TSQL 中添加一个检查表是否存在并执行打印,这将引发到您的 InfoMessage 事件。

    【讨论】:

    • 击败我发布了来自 MSDN 的完全相同的报价:-D
    • 非常感谢您的输入 - 为了解决这个问题,我通过正则表达式拆分命令并单独执行它们并记录每个内部异常。
    【解决方案2】:

    我不是程序员 (DBA),因此我不确定。 我认为以下 cam 会有所帮助

    conn.FireInfoMessageEventOnUserErrors = true;

    【讨论】:

    • 这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多