如何使用返回值参数执行实体框架 SQLQuery 存储过程



我正在尝试执行和使用具有状态代码返回参数的存储过程的返回值。

下面是存储过程:

DECLARE @RetVal int;
DECLARE @CustPK int;
BEGIN
    SET @RetVal = 0;
    SET NOCOUNT ON;
    SET @CustPK = (SELECT CustPK FROM tCustomer WHERE WebCustomerId = @WebCustomerId);
    -- Insert statements for procedure here
    INSERT INTO tOrder(CustPK, WebOrderId, TxCode,DelCompany, DelContact, DelAddress1, DelAddress2, DelCity, DelPostcode, DelPhone, WhiteLabel, ServiceLevelPK, DeliveryCharge, ProductionSpeed, Paid, DateOrdered, [IP Contact], vc, ProductionTIME, ProductionCharge, VDiscountExVAT, VDiscountVAT,QuoteName,[Cost Centre Reference], [Client Reference], MethodOfTransport) 
    VALUES(@CustPK, @WebOrderId, @TxCode, @DelCompany, @DelContact, @DelAddress1, @DelAddress2, @DelCity, @DelPostcode, @DelPhone, @WhiteLabel, @DeliveryType, @DeliveryCharge, @ProductionSpeed, 1, @DateOrdered, 'NEW', @Voucher, @ProductionSpeed, @ProductionCharge, @VoucherDiscount, @VoucherVAT, @PersonalReference, @CostCentreReference, @ClientReference, @MethodOfTransport)
IF @@ERROR = 0
BEGIN
    SET @RetVal = 1
END
RETURN @RetVal
此存储过程

是旧存储过程,无法更改。我正在尝试在我的应用程序中使用Retval。我正在使用实体框架的Database.SqlQuery()来执行此存储过程。

我正在创建一个SqlParameter列表,然后调用toArray()以便 EF 可以读取它们。真的很正常的东西。

这是我的EF代码:

    public string PlaceOrder(IPOPPlaceOrderRequest order)
    {
        try
        {
            string storedProcedure = BuildSQLExecutionString<IPOPPlaceOrderRequest>(order, "Web_NewOrder");
            //storedProcedure = storedProcedure + ", @RetVal";
            List<SqlParameter> parameters = BuildSQLParameters<IPOPPlaceOrderRequest>(order);
            var retVal = new SqlParameter("RetVal", System.Data.SqlDbType.Int) { Direction = System.Data.ParameterDirection.Output };
            parameters.Add(retVal);
            var test = tOrderRepository.RunSqlStoredProcedureSingle<IPOPPlaceOrderRequest>(storedProcedure, parameters.ToArray());
            return "";
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

这是RunSqlStoredProcedureSingle()

return unitOfWork.DataContext.Database.SqlQuery<T>(sql, parameters.ToArray()).FirstOrDefault();

这将运行,但 retVal 的值永远不会设置为任何值。我对此不知所措。

我尝试在存储过程字符串中执行@RetVal,末尾有和不带 OUT。

我也尝试过在SqlParameter对象的参数名称中使用和不使用@。

两种构建方法

都只是使用反射根据传递给方法的对象的名称和值来构建字符串和列表,如果需要,我也将提供此代码。

我通过修改从 @galenus 提供的注释中对存储过程的调用来解决这个问题

        public string PlaceOrder(IPOPPlaceOrderRequest order)
    {
        try
        {
            string storedProcedure = BuildSQLExecutionString<IPOPPlaceOrderRequest>(order, "exec @RetVal = Web_NewOrder");
            List<SqlParameter> parameters = BuildSQLParameters<IPOPPlaceOrderRequest>(order);
            var retVal = new SqlParameter("@RetVal", System.Data.SqlDbType.Int) { Direction = System.Data.ParameterDirection.Output, DbType = System.Data.DbType.Int32};
            parameters.Add(retVal);
            return tOrderRepository.RunSqlStoredProcedureSingle<object>(storedProcedure, parameters.ToArray());
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

通过在 storedProcedure 字符串中添加返回参数的声明,它现在返回正确的值。

以下是我从中获取此信息的问题和答案: 从存储过程获取返回值