petshop 中的有些方法不太理解,觉得有些方法多余,望大家指点下
petshop 的CacheParameters和GetCachedParameters的方法是干什么?我觉得好像多余?为什么不在product.cs直接用SqlParameter就可以了,不太理解,望大家指点下。
代码如下
sqlhelper.cs
-----------------------------------------------------
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters) {
parmCache[cacheKey] = commandParameters;
}
/// <summary>
/// Retrieve cached parameters
/// </summary>
/// <param name= "cacheKey "> key used to lookup parameters </param>
/// <returns> Cached SqlParamters array </returns>
public static SqlParameter[] GetCachedParameters(string cacheKey) {
SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];
if (cachedParms == null)
return null;
SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];
for (int i = 0, j = cachedParms.Length; i < j; i++)
clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();
return clonedParms;
}
-----------------------------------------------------
product.cs
------------------------------------
StringBuilder sql = new StringBuilder(SQL_SELECT_PRODUCTS_BY_SEARCH1);
//Add each keyword to the query
for (int i = 0; i < numKeywords; i++) {
sql.Append(string.Format(SQL_SELECT_PRODUCTS_BY_SEARCH2, PARM_KEYWORD + i));
sql.Append(i + 1 < numKeywords ? SQL_SELECT_PRODUCTS_BY_SEARCH3 : SQL_SELECT_PRODUCTS_BY_SEARCH4);
}
string sqlProductsBySearch = sql.ToString();
SqlParameter[] parms = SqlHelper.GetCachedParameters(sqlProductsBySearch);
// If the parameters are null build a new set
if (parms == null) {
parms = new SqlParameter[numKeywords];
for (int i = 0; i < numKeywords; i++)
parms[i] = new SqlParameter(PARM_KEYWORD + i, SqlDbType.VarChar, 80);
SqlHelper.CacheParameters(sqlProductsBySearch, parms);
}
// Bind the new parameters
for (int i = 0; i < numKeywords; i++)
parms[i].Value = keywords[i];
[解决办法]
CacheParameters和GetCachedParameters的方法是干什么?
我觉得是用来缓冲那些参数的,要不然,你用到同样的这些参数时,又要重新构造一次
但是如果把第一次构造好的参参数列存到hashtable里,下次如果发些已经有同样的,就直接返回
就行了,但我也有点不明白,这样做是不是真的提高了一点点性能?
[解决办法]
“SqlHelper.CacheParameters(sqlProductsBySearch, parms);”的第二个参数是定义是parameter数组,我给你解释这个为什么,看来我是把你想得深了。
为什么在CacheParameters之前要使用GetCachedParameters而不“直接用SqlParameter就可以了”?因为CacheParameters的第二个参数定义就是Parameter的数组而不是单个Parameter,这不是很明显的吗?我本来以为你看得懂这个。
既然需要的不是单个Parameter而是他的数组,因此就需要先准备好数组parms而不是单个parm,而parms应该包含多少个parm呢?GetCachedParameters设置好parms的大小。
其实解释到这里我觉得很没有意思了。
[解决办法]
而parmCache[cacheKey] = commandParameters;,这显然至少可以避免重复执行GetCachedParameters,对同一个cacheKey最多仅执行一次GetCachedParameters。