c#和SMO - 获取用于记录的消息输出,例如“表已存在”

时间:2009-09-28 11:59:55

标签: c# smo

我正在使用SQL Management对象连接到SQL Server。目前,它们包含了我的示例中的简单“创建表”命令。

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

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

任何人有任何想法,如何在我的代码中获取此消息,然后更改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();
}

2 个答案:

答案 0 :(得分:3)

根据MSDN

  

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

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

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

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

答案 1 :(得分:1)

我不是程序员(DBA),因此我不确定。 我假设跟随cam有帮助

conn.FireInfoMessageEventOnUserErrors = true;