0

以下で渡すパラメーターの dataID がテキスト (または varchar または int) であることを確認するにはどうすればよいでしょうか (以下のコードで)。

public T ExecuteQuery<T>(Func<IDataReader, T> getResult, string query, params IDataParameter[] parameters)
    {
        using (SqlConnection conn = new SqlConnection(this.DefaultConnectionString))
        {
            conn.Open();

            // Declare the parameter in the query string
            using (SqlCommand command = new SqlCommand(query, conn))
            {
                foreach (var parameter in parameters)
                {
                    command.Parameters.Add(parameter);
                }

                command.Prepare();

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

    public string GetMySpecId(string dataId)
    {
        return ExecuteQuery(
            dr =>
            {
                if (dr.Read())
                {
                    return dr[0].ToString();
                }

                return string.Empty;
            },
            "select specId from MyTable where dataId = @dataId",
            new SqlParameter("dataId", dataId));
    }

私は次のようにコーディングすることに慣れています:

command.Parameters.Add(new SqlParameter("key", SqlDbType.Text));

command.Prepare();

command.Parameters[0].Value = dataId;

上部のコードで、2 つ以上のパラメーターを ExecuteQuery に渡すにはどうすればよいでしょうか?

4

2 に答える 2

2

ExecuteQueryすでに複数のパラメータを取ります。これは、ParamArray任意の数のパラメーターを取り、それらを配列に変換することを意味します。

たとえば、次のような関数がある場合:

public int Sum(params int[] numbersToSum) { ... }

私はそれをこのように呼ぶことができます:

Sum(1, 2, 5, 6, 1)

あなたの場合、あなたはそれをこのように呼ぶことができます:

ExecuteQuery(
   dr => { //snip }, 
   query,
   new SqlParameter("dataId", dataId),
   new SqlParameter("anotherParm", parm2),
   new SqlParameter("anotherParm", parm3),
   ... );
于 2012-12-05T21:02:10.303 に答える
1

コードはparamsキーワードを使用しているため、エスケープされたSQLを追加して、メソッドの最後にパラメーターを追加し続ける必要があるようです。コードをベースとして使用する例を次に示します。

リンクはより完全な説明を提供しparamsますが、メソッドシグネチャの最後に可変数のパラメーター(同じタイプである限り)を持つことができるようにします。このparams変数に含まれるすべての最終パラメーターを配列に入れます。

 return ExecuteQuery(
        dr =>
        {
            if (dr.Read())
            {
                return dr[0].ToString();
            }

            return string.Empty;
        },
        "select specId from MyTable where dataId = @dataId and somethingelse = @else",
        new SqlParameter("dataId", dataId), 
        new SqlParameter("else", elseVar);
于 2012-12-05T20:59:39.710 に答える