11

以下のメソッドを使用して、ストアド プロシージャによって返される整数を返そうとしています。値は 0 または 0 以上です。データが返されるときの私の理解では、整数を返そうとしているので、辞書になります(わかりません)。どうすればそれを達成できますか。以下のコードは不完全で、コメントのコードは私が最初に行ったものであり、同じコードをより簡単な方法で書き直すことができることに気付きました。私はそれらの両方をそこに残したので、間違っているので、誰かが私を修正してくれます。

public int Exists(string plan)
{
    using (var connection = new SqlConnection(Connection))
    {
        connection.Open();
       var parameters = new DynamicParameters();
       //parameters.Add("@Plan", plan, DbType.String,
           //ParameterDirection.Input, null);
           //I guess I can directly pass param but not sure how ??

        var data=connection.Query("storeProcmem_Plan", new{ ? ?},
               CommandType.StoredProcedure);

        //how to return an integer               
        int myvalue= data ???                


        connection.Close();
        return Convert.ToInt32(data);
4

1 に答える 1

15

パラメータが固定されていると仮定すると (これは通常、ストアド プロシージャ用です。必要な主な時間DynamicParametersは、複雑で柔軟なクエリに一致するようにオンザフライで SQL を生成する場合です)。パラメータの側面は次のように単純です。

new { Plan = plan }

これは、コンパイラの匿名型機能を使用して、パラメーターが名前付きPlanであり、型stringであり、変数から値が取得されることを定義しますplan

ストアド プロシージャの結果が (個別にコーディングする必要があるselectではなく) 1 行にあると仮定すると、それを読み取る最も簡単な方法は次のとおりです。return

var myvalue = connection.Query<int>("storeProcmem_Plan", new { Plan = plan },
           CommandType.StoredProcedure).First();

ジェネリック API と非ジェネリック API は、型指定された結果とdynamic結果を切り替えます。どちらにも用途がありますが、<int>ここでは適切と思われます。は、最初の値を選択することによって からに.First()変換する標準の LINQ 操作です (存在しない場合は例外をスローします) 。必要な正確なセマンティクスに応じて、 、、またはを使用することもできます。IEnumerable<T>TSingle()FirstOrDefault()SingleOrDefault()

完全を期すために、非ジェネリック API を使用している場合は、列名を知る必要があります。基本的には次のようになります。

dynamic row = connection.Query("storeProcmem_Plan", new { Plan = plan },
       CommandType.StoredProcedure).First();
int myvalue = row.ColumnName;
于 2013-09-10T07:06:25.307 に答える