简体   繁体   English

如何从存储过程中获取output参数结果和查询结果?

[英]How to get output parameter results and query result from stored procedure?

I have this stored procedure我有这个存储过程

CREATE PROCEDURE UpdateWeatherReport (
    @TemperatureData VARCHAR(100),
    @StationID VARCHAR(7),
    @ErrorCode INT OUTPUT,
    @ErrorMessage VARCHAR(200) OUTPUT
)
AS
BEGIN

        SET @ErrorCode=12;
        SET @ErrorMessage='test error message';

        DECLARE @PredictionValid BIT = 'true' 
        DECLARE @ExpiryDays TINYINT = 2
        
        SELECT 
        @PredictionValid AS [PredictionValid]
        ,@ExpiryDays AS [ExpiryDays]
END

which I call from C# using Entity Framework Core using a DbContext我使用 Entity Framework Core 使用 DbContext 从 C# 调用

 var pTemperatureData = new SqlParameter("@TemperatureData", System.Data.SqlDbType.VarChar) { Value = "...", Direction = System.Data.ParameterDirection.Input };
 var pStationID = new SqlParameter("@StationID", System.Data.SqlDbType.VarChar) { Value = "...", Direction = System.Data.ParameterDirection.Input };
 var pErrorCode = new SqlParameter("@ErrorCode", System.Data.SqlDbType.Int) { Direction = System.Data.ParameterDirection.Output };
 var pErrorMessage = new SqlParameter("@ErrorMessage", System.Data.SqlDbType.Int, size: 200) { Direction = System.Data.ParameterDirection.Output };

 var sql = $"EXECUTE {name} ";
 parameters.ForEach(p => sql += $"{p.ParameterName},");
 sql = sql.TrimEnd(',');
 
 //"EXECUTE UpdateWeatherReport @TemperatureData, @StationID, @ErrorCode, @ErrorMessage"

await Context.Database.ExecuteSqlRawAsync(sql, parameters.ToArray());

pErrorCode.Value; <-------------------- empty after call to stored procedure
pErrorMessage.Value; <----------------- empty after call to stored procedure

When I call the SP from code, the output parameters are empty.当我从代码中调用 SP 时,output 参数为空。 How to get the output parameter values in code?如何在代码中获取 output 参数值?


When I call the SP directly from SQL the output parameters are populated correctly.当我直接从 SQL 调用 SP 时,正确填充了 output 参数。

DECLARE @TemperatureData VARCHAR(100)='abc 123 def 456 ...';
DECLARE @StationID VARCHAR(7)='19372';
DECLARE @ErrorCode INT;
DECLARE @ErrorMessage VARCHAR(200);

EXEC UpdateWeatherReport  @ParcelBarcode, @StationID, @ParcelStatus, @DateDelivered, @PickupCode, @ErrorCode OUTPUT, @ErrorMessage OUTPUT;

You're missing the OUTPUT keyword when building the parameters in the SQL text:在 SQL 文本中构建参数时,您缺少OUTPUT关键字:

EXECUTE UpdateWeatherReport @TemperatureData, @StationID, @ErrorCode, @ErrorMessage

Should be:应该:

EXECUTE UpdateWeatherReport @TemperatureData, @StationID, @ErrorCode OUTPUT, @ErrorMessage OUTPUT

You can fix that by modifying the line where you add the parameters to the SQL text:您可以通过修改将参数添加到 SQL 文本的行来解决此问题:

parameters.ForEach(p => sql += $"{p.ParameterName}{(p.Direction == System.Data.ParameterDirection.Output ? " OUTPUT" : string.Empty)},");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM