1

次のようなコードがある場合:

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));
    }
}

どうすれば確実に

new SqlParameter("dataId", dataId)); 

コードはテキストまたは整数を渡していますか? @"select..."また、私がよく知っているように、実際にどのように機能しますか:

 select id from mytable where dataId = @dataID;
4

1 に答える 1

0

それが適切にパラメータ化されているかどうかはわかりません。以下の変更されたコードを見てください。これにより、パラメーターが適切に追加され、呼び出しの構築が簡素化されますExecuteQuery(もちろん私の意見では)。これはかなり簡単です。@varnameselect ステートメントは、次の構文を使用しているため、適切にパラメーター化されています。

"select \"specId\" from \"MyTable\" where \"dataId\" = @dataId"

さらに、AddWithValueメソッドにより、パラメーターは適切に入力されます。

command.Parameters.AddWithValue(parameter.Key, parameter.Value);

最後に、ディクショナリを使用してパラメーターを送信することで、パラメーター値であろうとオブジェクトであろうと、任意の構造体からパラメーターを簡単に作成できます。

public T ExecuteQuery<T>(Func<IDataReader, T> getResult, string query, Dictionary<string, object> 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.AddWithValue(parameter.Key, parameter.Value);
            }

            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 Dictionary<string, object>() { { "@dataId", dataId } });
}

PS -@あなたの例の文字列の前は、C# で使用される単なるエスケープ シーケンスです。

于 2012-12-05T20:30:23.877 に答える