2

Microsoft.ApplicationBlocks.Dataのコードを読んでいます(コードはこちら)

しかし、私は奇妙なことに気づきました:

関数の1つ(executeNonQuery)で、Spのパラメーターをキャッシュから読み取ろうとし、存在しない場合はそれらをキャッシュに入れます(asp.netキャッシュではなく、内部HashSet)

public static int ExecuteNonQuery(string connectionString, string spName, params SqlParameter[] parameterValues)
    {
        if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString");
        if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
        // If we receive parameter values, we need to figure out where they go
        if ((parameterValues != null) && (parameterValues.Length > 0))
        {
            // Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
            //------------------------------------

            SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName);

           //------------------------------------
            // Assign the provided values to these parameters based on parameter order
            AssignParameterValues(commandParameters, parameterValues);
            // Call the overload that takes an array of SqlParameters
            return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters);
        }
        else
        {
            // Otherwise we can just call the SP without params
            return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName);
        }
    }

孤立した線を見てください。

なぜ彼らはそれをしたのですか?Cache にパラメーターがある場合、どのように役立ちますか? とにかく、私のdalからパラメータを送信するつもりです...(そして、パラメータをSPに送信する必要があります)...

何が欠けていますか?

4

1 に答える 1

0

キャッシュがなければ、MSDNが述べているSqlCommandBuilder.DeriveParametersへの呼び出しごとに呼び出すこと ExecuteNonQueryになります。

DeriveParameters では、情報を取得するためにデータベースへの追加の呼び出しが必要です。パラメーター情報が事前にわかっている場合は、情報を明示的に設定してパラメーター コレクションに入力する方が効率的です。

したがって、これらの余分な呼び出しを避けるために、取得したパラメーター情報をキャッシュすることは理にかなっています。

アップデート:

とにかく、私のdalからパラメータを送信するつもりです...(そして、パラメータをSPに送信する必要があります)...

int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)過負荷に注意してください。パラメータを送信する場合と送信しない場合があります。

于 2012-10-25T17:16:06.773 に答える