缓存中的Ado.net和Sp的参数?

时间:2012-10-25 16:38:52

标签: c# .net ado.net sqlparameter

我正在阅读Microsoft.ApplicationBlocks.Datacode is here

的代码

但我注意到一些奇怪的事情:

在其中一个函数(executeNonQuery)中,他尝试从缓存中读取Sp的param,如果不存在,则将它们放入缓存中(不是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)...

我错过了什么?

1 个答案:

答案 0 :(得分:0)

如果没有缓存,他们最终会针对SqlCommandBuilder.DeriveParameters的每次调用致电ExecuteNonQuery,其MSDN个州:

  

DeriveParameters需要额外调用数据库才能获取信息。如果事先知道参数信息,则通过明确设置信息来填充参数集合会更有效。

因此,有意义的是缓存检索到的参数信息以避免这些额外的调用。

更新:

  

我会从我的dal发送params ...(我必须将我的params发送到SP)...

请注意int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)重载 - 您可能或可能发送参数。