4

1つのinパラメーターと2つのoutパラメーターを持つストアドプロシージャを呼び出そうとしています。

スクリプトとして、私はそれを次のように呼びます:

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パラメータを処理した結果のようです。私の回避策は、ストアドプロシージャを変更して、outパラメータのselectクエリを返し、ストアドプロシージャの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;
}
于 2013-03-02T20:16:14.417 に答える
0

パラメーターを使用しようとするのではなく、これらは EF の MySQL でサポートされていないと思います。ステートメントを使用しOUTて戻りたい値を返します。PROCEDURESELECT

これは、選択されていない各選択ステートメントがINTOプロシージャから結果セットとして返されるためです。 ここでこれを見つけました。

ストアド プロシージャから影響を受ける行の数を返したかったので、out パラメーターを削除し、これをその場所に配置しました。

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 に答える