我正在尝试调用一个存储过程,其中包含一个参数和两个输出参数。
作为一个脚本,我称之为:
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之外,我还需要做些什么呢?
到目前为止我的一些研究:
答案 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,它可以工作。