1

以下のこの回答と、それがデリゲートでどのように機能するかを説明する助けを得ることができますか. ここからの答え: C# 抽象化とデータベース層

...DataReader を使用するという考えに行き詰まっている場合は、デリゲートをヘルパーに渡すことができます。デリゲートは、using ステートメント内で呼び出されます。

public string GetMySpecId(string dataId)
{
    return _dbHelper.ExecuteQuery(
        dr => 
           {
               if(dr.Read())
               {
                   return dr[0].ToString();
               }
               // do whatever makes sense here.
           },
        @"select ""specId"" from ""MyTable"" where ""dataId"" = :dataId",
        new SqlParameter("dataId", dataId));
    return result.Rows[0][0].ToString();
}

Dapper のような軽量ツールを使用して、構文の一部を簡素化し、データ型へのマッピングを処理することもできます。(接続を開くなどの処理を行う必要があります。)

4

1 に答える 1

0

上からメソッドを宣言すると、次のExecuteQueryようになります。

public DataTable ExecuteQuery(Func<DataReader, DataTable> delegateMethod, string sqlQuery, SqlParameter param)
    {
        using (SqlConnection conn = new SqlConnection(this.MyConnectionString))
        {
            conn.Open();

            // Declare the parameter in the query string
            using (SqlCommand command = new SqlCommand(sqlQuery, conn))
            {
                // Now add the parameter to the parameter collection of the command specifying its type.
                command.Parameters.Add(param);

                command.Prepare();

                // Now, add a value to it and later execute the command as usual.
                command.Parameters[0].Value = dataId;


                using (SqlDataReader dr = command.ExecuteReader())
                {
                   return delegateMethod(dr);
                }
            }
        }
    }

そうです、FuncでDataReaderとDataTableを入れ替える必要があるかもしれませんが、どちらが最初にparamタイプかreturnタイプか思い出せません。

デリゲートを使用する別の例を次に示します。リターンタイプが必要ない場合はFunc、デリゲートもあります。Action

Funcデリゲートリーディング 通常のデリゲートリーディング

于 2012-12-04T23:50:56.373 に答える