好吧,这听起来可能有点奇怪!
问题是,在一个项目中,有很多存储过程已经写成这样:
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/