begin try
begin transaction
select 1/0
commit transaction
end trybegin catch
rollback 
raiserror ('ffff',16,1)end catch请问为什么我在c#端 无法捕获 raiserror 抛出的信息? 谢谢

解决方案 »

  1.   

    参考如下
    create procedure sp_InfoMsgTest
    @times int
    as
    begin 
      declare @msg NVARCHAR(100)
       
      while(@times>0)
      begin
        set @msg = 'Error' + cast(@times as VARCHAR(5))
        raiserror(@msg,16,1)
        set @times =@times - 1
      end
    endprivate const string conString = "Server=SZSOFT-SZZB\\SQLEXPRESS;database=office;uid=sa;pwd=abc_!123456;";
            private void button1_Click(object sender, EventArgs e)
            {
                SqlConnection con = new SqlConnection();
                con.ConnectionString = conString;
                 
                con.FireInfoMessageEventOnUserErrors = true;
                con.InfoMessage += new SqlInfoMessageEventHandler(con_InfoMessage);
                con.Open();
     
                SqlCommand cmd = new SqlCommand();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "sp_InfoMsgTest";
                cmd.Connection = con;
                cmd.Parameters.Add(new SqlParameter("@times", 10));
                cmd.ExecuteNonQuery();
            }
     
            void con_InfoMessage(object sender, SqlInfoMessageEventArgs e)
            {
                Console.WriteLine(e.Message);
            }
      

  2.   

    谢谢你的代码。问题在于 catch 里面的 raiserror 无法被捕获 。如果 将raiserror  放在  begin try 与 end try 之间就可以被捕获。
      

  3.   

    begin try
    begin transaction
    select 1/0
    commit transaction
    end trybegin catch
    raiserror ('ffff',16,1)
    rollback 
    end catch