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

标签 c# sql-server stored-procedures

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

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,输出变量用于在插入语句之后检索其值。 (顺便问一下,这种方法是一个好的做法吗?)
现在,返回值用于指示过程的成功或失败。 (即,如果操作成功则返回1,如果操作失败则返回-1) 如果过程执行过程中出现错误,最后的 select 语句会将错误返回给用户。

现在我如何在 C# 中调用这个过程并同时获得这些结果? 我想要做的是,执行该过程,并获取返回值,如果它是 1,则获取最后一个 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) */

关于c# - 如何在C#中同时检索存储过程的结果值和select语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6329553/

相关文章:

c# - 如何在 ASP.NET Core 中默认添加 URL 参数

c# - 无需发布即可完成构建 asp.net mvc core 2.0 应用程序的检查

c# - 如何在 SQL Server 2008 中的特定列中存储列值?

sql - SQL Server 中根据列值连接表

postgresql - 提高重复查询的查询效率

oracle - 如何在 PL/SQL 过程中声明/分配变量给游标类型

c# - 来自 IActionResult 的打字机 ReturnType

c# - Cassandra C# insert 似乎正在删除先前的数据?

sql-server - 递归选择

mysql - 根据 IF EXIST INSERT 数据