首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

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

2012-01-21 
petshop 中的有些方法不太理解,觉得有些方法多余,望大家指点下petshop的CacheParameters和GetCachedParame

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。

热点排行