Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server中的错误处理问题_C#_Sql Server_Database - Fatal编程技术网

C# SQL Server中的错误处理问题

C# SQL Server中的错误处理问题,c#,sql-server,database,C#,Sql Server,Database,我使用的是C#和一个类型化数据集,它链接到SQLServerExpress数据库中的存储过程。在存储过程中,我使用try catch进行错误处理 这是我的拦网: begin catch select error_number() as errorNumber, error_severity() as errorSeverity, error_state() as errorState, error_procedure()

我使用的是C#和一个类型化数据集,它链接到SQLServerExpress数据库中的存储过程。在存储过程中,我使用
try catch
进行错误处理

这是我的拦网:

begin catch
    select 
        error_number() as errorNumber, 
        error_severity() as errorSeverity,
        error_state() as errorState,
        error_procedure() as errorProcedure,
        error_line() as errorLine,
        error_message() as errorMessage
end catch
  • try catch
    是处理数据库错误的最佳方法吗

  • 由于SQL Server将以表的形式返回错误信息,因此我如何识别返回的表是充满数据还是包含错误信息


  • 编辑:好吧,我得到了异常并重新显示它??但是为什么呢?我的意思是,如果我一开始没有抓住它,它将冒泡到我的应用程序中,我可以在那里管理它。那么我为什么要使用try-catch???

    请记住,如果需要向应用程序报告异常(如C#中的catch(SQLException ex)),存储过程捕获块将需要重新显示(RAISERROR)异常,并确保严重性级别>10,这是处理存储过程中错误的一种好方法,但是,您通常会这样做,以便将错误记录到表中:

    begin catch
        insert into ErrorLog
        select 
            error_number() as errorNumber, 
            error_severity() as errorSeverity,
            error_state() as errorState,
            error_procedure() as errorProcedure,
            error_line() as errorLine,
            error_message() as errorMessage
    end catch
    
    然而,基于异常只应在异常情况下发生这一事实,您几乎肯定希望重新显示错误,以便您的代码能够以最合理的方式处理此异常

    在sql server中,这是使用
    RAISERROR
    ()命令实现的

    您的代码最终会看起来像:

    BEGIN CATCH
        DECLARE @ErrorMessage NVARCHAR(4000);
        DECLARE @ErrorSeverity INT;
        DECLARE @ErrorState INT;
    
        SELECT 
            @ErrorMessage = ERROR_MESSAGE(),
            @ErrorSeverity = ERROR_SEVERITY(),
            @ErrorState = ERROR_STATE();
    
        -- You could log the error here
        INSERT INTO ErrorLog(message, severity, state)
        VALUES(@ErrorMessage, @ErrorSeverity, @ErrorState)
    
        -- Use RAISERROR inside the CATCH block to return error
        RAISERROR (@ErrorMessage, -- Message text.
                   @ErrorSeverity, -- Severity.
                   @ErrorState -- State.
                   );
    END CATCH;
    

    还要注意,如果事务被回滚,那么日志记录也会以没有日志条目结束