我正在使用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();
}
答案 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;