使用out参数调用存储过程

时间:2013-03-02 20:16:14

标签: c# mysql entity-framework-5

我正在尝试调用一个存储过程,其中包含一个参数和两个输出参数。

作为一个脚本,我称之为:

set @MaxPrice = 0.00;
set @MinPrice = 0.00;
set @BSku = '1011001403';
call GetSkuMinMaxPrice(@Sku,@MaxPrice, @MinPrice);

我收回价格

以下是我用ef5调用它的方法:

decimal? minPrice;
decimal? maxPrice;

var skuParameter = new MySqlParameter("?SKU", productToUpload.Sku)
{
    Direction = ParameterDirection.Input
};
var maxPriceParameter = new MySqlParameter("?MaxPrice", SqlDbType.Decimal)
{
    Direction = ParameterDirection.Output
};
var minPriceParameter = new MySqlParameter("?MinPrice", SqlDbType.Decimal)
{
    Direction = ParameterDirection.Output
};
db.Database.ExecuteSqlCommand("call GetSkuMinMaxPrice(?SKU,?MaxPrice,?MinPrice)",
                               skuParameter, 
                               maxPriceParameter, 
                               minPriceParameter);

minPrice = minPriceParameter.Value as decimal?;
maxPrice = maxPriceParameter.Value as decimal?;

对我来说,这看起来不错,但我从MySQL服务器收到此错误消息:OUT or INOUT argument 2 for routine tng.GetSkuBaseMinMaxPrice is not a variable or NEW pseudo-variable in BEFORE trigger

那么,除了not using Entity Framework之外,我还需要做些什么呢?

到目前为止我的一些研究:

2 个答案:

答案 0 :(得分:3)

这似乎是MySQL处理out参数的结果。我的解决方法是更改​​存储过程以返回out参数的select查询,创建一个POCO,其公共属性名称与存储过程选择结果的列名称匹配。

新存储过程调用

set @BSku = '1011001403';
call GetSkuPrices(@Sku);

我的POCO:

private class PriceOutput
{
    public decimal? MaxPrice { get; set; }
    public decimal? MinPrice { get; set; }
}

我的主叫代码:

decimal? minPrice = null;
decimal? maxPrice = null;

var skuParameter = new MySqlParameter("?SKU", productToUpload.Sku);
var basePrices = db.Database.SqlQuery<PriceOutput>("call GetSkuPrices(?SKU)",                                                       
                                                   skuParameter).FirstOrDefault();
if (basePrices != null)
{
    minPrice = basePrices.MinPrice;
    maxPrice = basePrices.MinPrice;
}

答案 1 :(得分:0)

我认为MySQL不支持使用OUT参数,而不是尝试使用PROCEDURE参数,使用SELECT语句返回您想要从INTO返回的值

这是因为每个不选择SELECT ROW_COUNT() AS Success; 的select语句都将作为过程的结果集返回。 I found this out here.

我想从我的存储过程中返回受影响的行数,所以我删除了我的输出参数并把它放在它的位置:

public class UsePasswordResult
{
    public int Success { get; set; }
}

然后我创建了以下对象来捕获值:

// Set values to desired parameter values
int quizId = 1;
string password = "mypassword";

UsePasswordResult result = this.Context.Database.SqlQuery<UsePasswordResult>("CALL UsePassword({0}, {1})", quizId, password).FirstOrDefault();

然后我使用以下方法获取值:

{{1}}

我希望这有助于某人!我正在使用EF6,它可以工作。