petshop 中的有些方法不太理解,觉得有些方法多余,望大家指点下

bad_egg 2007-02-04 03:50:39
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];

...全文
405 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bad_egg 2007-02-05
  • 打赏
  • 举报
回复
现在我的想法是,对petshop这样做,是不是真的提高了一点点性能而感到疑惑。
bad_egg 2007-02-05
  • 打赏
  • 举报
回复
sp1234(开发应用控件必须举一返十才能奏效)
感谢你的回复,你说的我都知道,我只是不知道他用这两个方法的含意。

lovenets(しovのんeТ)的说法是“如果把第一次构造好的参参数列存到hashtable里,下次如果发些已经有同样的,就直接返回就行了,但我也有点不明白,这样做是不是真的提高了一点点性能?”
lovenets(しovのんeТ),他说到这里我就豁然开朗了,只是为了下次出现相同时不再构造个新的,直接返回就可以了。
最后,lovenets(しovのんeТ)说了“这样做是不是真的提高了一点点性能?”,我也觉得是。

最后还是非常感谢你的回复!
SkyeyGarden 2007-02-05
  • 打赏
  • 举报
回复
支持!
  • 打赏
  • 举报
回复
而parmCache[cacheKey] = commandParameters;,这显然至少可以避免重复执行GetCachedParameters,对同一个cacheKey最多仅执行一次GetCachedParameters。
  • 打赏
  • 举报
回复
“SqlHelper.CacheParameters(sqlProductsBySearch, parms);”的第二个参数是定义是parameter数组,我给你解释这个为什么,看来我是把你想得深了。

为什么在CacheParameters之前要使用GetCachedParameters而不“直接用SqlParameter就可以了”?因为CacheParameters的第二个参数定义就是Parameter的数组而不是单个Parameter,这不是很明显的吗?我本来以为你看得懂这个。

既然需要的不是单个Parameter而是他的数组,因此就需要先准备好数组parms而不是单个parm,而parms应该包含多少个parm呢?GetCachedParameters设置好parms的大小。

其实解释到这里我觉得很没有意思了。
zorou_fatal 2007-02-04
  • 打赏
  • 举报
回复
用ACT跑一跑就知道性能如何了。
xiaoliangwh 2007-02-04
  • 打赏
  • 举报
回复

关注,顶一下
bad_egg 2007-02-04
  • 打赏
  • 举报
回复
这个问题已经理解(CacheParameters和GetCachedParameters的方法)。。。。谢谢大家回复,对于lovenets(しovのんeТ) 说的“这样做是不是真的提高了一点点性能?”有同样的疑惑:)
静_心 2007-02-04
  • 打赏
  • 举报
回复
一点也不多余,只是你没有用到.
bad_egg 2007-02-04
  • 打赏
  • 举报
回复
我对楼上的lovenets(しovのんeТ) 想法有点赞同。
lovenets 2007-02-04
  • 打赏
  • 举报
回复
CacheParameters和GetCachedParameters的方法是干什么?

我觉得是用来缓冲那些参数的,要不然,你用到同样的这些参数时,又要重新构造一次

但是如果把第一次构造好的参参数列存到hashtable里,下次如果发些已经有同样的,就直接返回

就行了,但我也有点不明白,这样做是不是真的提高了一点点性能?
bad_egg 2007-02-04
  • 打赏
  • 举报
回复
楼上的,不理解你的意思,我了解sqlhelper.cs的方法,在sqlhelper.cs的ExecuteNonQuery()的方法本来就可以支持多参的Parameter。。
这完全和下面两句没关系,我个人理解。
//SqlHelper.GetCachedParameters(sqlProductsBySearch);
//SqlHelper.CacheParameters(sqlProductsBySearch, parms);
--------------
从以下
SqlParameter[] parms = SqlHelper.GetCachedParameters(sqlProductsBySearch);

// If the parameters are null build a new set
if (parms == null) {
parms = new SqlParameter[numKeywords];
可以看出,调用SqlHelper.GetCachedParameters(sqlProductsBySearch),只为了判断参数是否为空。parms == null。。。
  • 打赏
  • 举报
回复
在ADO.NET中,没有上面那种将Parameter集合用作方法参数的方法定义,SQLHelper这个方面定义一些方法可以少写不少处理Parameter的代码。
  • 打赏
  • 举报
回复
虽然我比较讨厌sqlhelper,不过你的问题也完全可以正面回答:一个好的程序员必然痛恨低水平重复写代码行,Parameter的写法往往觉得太机械了。例如与其写一大堆枯燥的代码来ExecuteNonQuery,不如写一行:
cmd.ExecuteNonQuery(sql, intParam, stringParam, 3, "123", dateParam);
这样干净,好用。
bad_egg 2007-02-04
  • 打赏
  • 举报
回复
在product.cs 下
去掉//SqlHelper.GetCachedParameters(sqlProductsBySearch);
去掉//SqlHelper.CacheParameters(sqlProductsBySearch, parms);
不了解这两句的用途。。。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧