sql server-如何在C#中同时检索存储过程的结果值和select语句

本文关键字:结果 存储过程 语句 select 检索 server- sql | 更新日期: 2023-09-27 17:59:12

好的,所以这听起来可能有点奇怪
问题是,在一个项目中,有许多存储过程已经写成这样:

CREATE PROCEDURE [Status_Insert]
        @StatusId       int OUTPUT,
        @Status         nvarchar (50),
        @IsDeleted      bit = 0
AS
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRAN
INSERT INTO dbo.[Status]
(
        [Status],
        [IsDeleted]
)
VALUES
(
        @Status,
        @IsDeleted
)
SET @StatusId = @@IDENTITY
COMMIT TRAN
RETURN 1
END TRY
BEGIN CATCH
ROLLBACK TRAN
DECLARE @ErrorNumber_INT INT;
DECLARE @ErrorSeverity_INT INT;
DECLARE @ErrorProcedure_VC VARCHAR(200);
DECLARE @ErrorLine_INT INT;
DECLARE @ErrorMessage_NVC NVARCHAR(4000);
SELECT
        @ErrorMessage_NVC = ERROR_MESSAGE(),
        @ErrorSeverity_INT = ERROR_SEVERITY(),
        @ErrorNumber_INT = ERROR_NUMBER(),
        @ErrorProcedure_VC = ERROR_PROCEDURE(),
        @ErrorLine_INT = ERROR_LINE()
RETURN -1
END CATCH

主键是一个Identity,输出变量用于在insert语句之后检索其值。(顺便问一下,这种方法是一种好的做法吗?)
现在,返回值用于指示过程的成功或失败。(即,如果操作成功,则返回1;如果操作失败,则返回-1)如果在执行过程中出现错误,最后一条select语句将向用户返回错误。

现在我如何在C#中调用这个过程并同时得到这些结果?我想做的是,执行该过程,并获得返回值,如果它是1,则获得最后一个select语句的结果(它包含有关已发生错误的更多信息)提前谢谢。

sql server-如何在C#中同时检索存储过程的结果值和select语句

您可以在命令中使用"ReturnValue"参数。

using(var connection = GetOpenConnection()) {
    using(var cmd = connection.CreateCommand()){
        cmd.CommandText = "Status_Insert";
        cmd.CommandType = CommandType.StoredProcedure;
        var prmReturnValue = new SqlParameter( "@ReturnValue", DBNull.Value );
        prmReturnValue.Direction = ParameterDirection.ReturnValue;
        using(var reader = cmd.ExecuteReader()) {
            // process table result(s)
        }
        var returnValue = prmReturnValue.Value;
    }
}

编辑:问题出在选择中。如果您在变量中选择了一些内容,则该选择将不在结果集中。

如果您想从不需要SELECT语句的函数中分配变量,您可以使用SET命令,也可以初始化DECLARE语句中的值(从2008版开始):

/* variable initialization in DECLARE statements >>> */
DECLARE @ErrorNumber_INT INT              = ERROR_NUMBER();
DECLARE @ErrorSeverity_INT INT            = ERROR_SEVERITY();
DECLARE @ErrorProcedure_VC VARCHAR(200)   = ERROR_PROCEDURE();
/* <<< variable initialization in DECLARE statements */
/* variable initialization with SET statements >>> */
DECLARE @ErrorLine_INT INT;
DECLARE @ErrorMessage_NVC NVARCHAR(4000);
SET @ErrorLine_INT INT = ERROR_LINE();
SET @ErrorMessage_NVC  = ERROR_MESSAGE();
/* <<< variable initialization with SET statements */
/* this select will be in result-set(s) >>> */
SELECT
        @ErrorNumber_INT AS [ErrorNumber_INT],
        @ErrorSeverity_INT AS [ErrorSeverity_INT],
        @ErrorProcedure_VC AS [ErrorProcedure_VC],
        @ErrorLine_INT AS [ErrorLine_INT],
        @ErrorMessage_NVC AS [ErrorMessage_NVC]
/* <<< this select will be in result-set(s) */