4

我正在尝试调用具有一个输入参数和两个输出参数的存储过程。

作为一个脚本,我这样称呼它:

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.

那么,除了不使用 Entity Framework 之外,我还需要做什么才能完成这项工作?

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

4

2 回答 2

3

这似乎是 MySQL 处理 out 参数的结果。我的解决方法是更改​​存储过程以返回输出参数的选择查询,创建一个具有与存储过程选择结果的列名匹配的公共属性名称的 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;
}
于 2013-03-02T20:16:14.417 回答
0

OUT我相信 MySQL for EF 不支持这些参数,而不是尝试使用参数,而是返回您想要从PROCEDUREusingSELECT语句返回的值。

这是因为每个未选择的 select 语句都INTO将作为过程的结果集返回。 我在这里发现了这个。

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

SELECT ROW_COUNT() AS Success;

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

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();

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

于 2014-10-09T14:11:49.383 回答