SqlHelperParameterCache 类提供了三种可以用来管理参数的公共共享方法。它们是:
- CacheParameter。用于将 SqlParameters 数组存储到缓存中。
- GetCachedParameter。用于检索缓存的参数数组的副本。
- GetSpParameter。一种重载方法,用于检索指定存储过程的相应参数(首先查询一次数据库,然后缓存结果以便将来查询)
缓存和检索参数
通过使用 CacheParameter方法,可以缓存 SqlParameter 对象数组。此方法通过将连接字符串和命令文本连接起来创建一个键,然后将参数数组存储在 Hashtable 中。也就是说hashtable实现了缓存机制.
要从缓存中检索参数,请使用 GetCachedParameter 方法。此方法将返回一个 SqlParameter 对象数组,这些对象已使用缓存中的参数的名称进行了初始化。
注意:
用作参数集的键的连接字符串通过简单的字符串比较进行匹配。用于从 GetCachedParameter中检索参数的连接字符串必须与用来通过 CacheParameter来存储这些参数的连接字符串完全相同。
流程如下:
PetShop.SQLServerDAL :
private const string SQL_INSERT_SIGNON = "INSERT INTO SignOn VALUES (@UserId, @Password)";
public AccountInfo SignIn(string userId, string password) {
SqlParameter[] signOnParms = GetSignOnParameters(); // 调用函数,得到参数数组
signOnParms[0].Value = userId;
signOnParms[1].Value = password;
using (SqlDataReader rdr = SQLHelper.ExecuteReader(SQLHelper.CONN_STRING_NON_DTC, CommandType.Text, SQL_SELECT_ACCOUNT, signOnParms))
{
if (rdr.Read()) {
AddressInfo myAddress = new AddressInfo(rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), rdr.GetString(4), rdr.GetString(5), rdr.GetString(6), rdr.GetString(7), rdr.GetString(8), rdr.GetString(9));
return new AccountInfo(userId, password, rdr.GetString(0), myAddress, rdr.GetString(10), rdr.GetString(11), Convert.ToBoolean(rdr.GetInt32(12)), Convert.ToBoolean(rdr.GetInt32(13)));
}
return null;
}
}
private static SqlParameter[] GetSignOnParameters() {
SqlParameter[] parms = SQLHelper.GetCachedParameters(SQL_INSERT_SIGNON); //看缓存中是否有
if (parms == null) //开始调用时空,然后创建
{
parms = new SqlParameter[] {
new SqlParameter(PARM_USER_ID, SqlDbType.VarChar, 80),
new SqlParameter(PARM_PASSWORD, SqlDbType.VarChar, 80)};
SQLHelper.CacheParameters(SQL_INSERT_SIGNON, parms); // 调用函数。存入hashtable中,它是用健值对表示的,实现了缓存; 键值是操作数据库的常量字符串
}
return parms;
}
PetShop.SQLServerDAL :
public static readonly string CONN_STRING_NON_DTC = ConnectionInfo.DecryptDBConnectionString(ConfigurationSettings.AppSettings["SQLConnString1"]);
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
public static void CacheParameters(string cacheKey, params SqlParameter[] cmdParms) {
parmCache[cacheKey] = cmdParms;
}
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;
}
总结:
SqlParameter[] signOnParms = GetSignOnParameters();
第一次调用时,给hashtable赋值。里边德方法全是静态的,是为了提高性能,不用建立对象了,这样就调用方便,唯一的就是消耗内存。等第二次调用时,直接取hashtable中的就行了,实现了重用性。