我正在尝试执行并使用具有状态代码返回参数的存储过程的返回值。
这是存储过程:
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
。我正在使用Entity Framework的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的值永远不会设置为任何值。我对此感到茫然。
我尝试在存储过程字符串中使用和不使用OUT执行@RetVal
。
我在SqlParameter
对象的参数名称中尝试使用和不使用@。
两种构建方法都只使用反射来构建字符串和列表,基于传递给方法的对象的名称和值,如果需要,我也将提供此代码。
答案 0 :(得分:1)
我通过修改@galenus提供的comment对存储过程的调用来实现此目的
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
字符串中添加return参数的声明,它现在返回正确的值。