学习PetShop3.0(7)SimplePager

王朝asp·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

看一下SQLServerDAL,前面有高人说了,那个SQLHelper类似于daab for .net,因此在这里我就不多话了,对daab for .net的讨论可以参看msdn的相关文章

来看Account.cs,里面有一个GetAddress方法,用来通过用户名获得用户资料。在这里面主要是分两步,第一步是获得参数并给其赋值,第二步是使用SqlDataReader来从数据库取值。

public AddressInfo GetAddress(string userId) {

AddressInfo address= null;

//获得参数列表

SqlParameter[] addressParms = GetAddressParameters();

//给参数赋值

addressParms[0].Value = userId;

//使用SqlDataReader来从数据库取值

using (SqlDataReader rdr = SQLHelper.ExecuteReader(SQLHelper.CONN_STRING_NON_DTC, CommandType.Text, SQL_SELECT_ADDRESS, addressParms)) {

if (rdr.Read()) {

address = new AddressInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), rdr.GetString(4), rdr.GetString(5), rdr.GetString(6), rdr.GetString(7), rdr.GetString(8));

}

}

return address;

}

参数的获得比较复杂,先来看SqlDataReader的使用吧

using (SqlDataReader rdr = SQLHelper.ExecuteReader(SQLHelper.CONN_STRING_NON_DTC, CommandType.Text, SQL_SELECT_ADDRESS, addressParms)) {

if (rdr.Read()) {

address = new AddressInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), rdr.GetString(4), rdr.GetString(5), rdr.GetString(6), rdr.GetString(7), rdr.GetString(8));

}

}

很简单的应用,SQLHelper.ExecuteReader的确是起到了和daab for .net差不多的作用。因为是获得个人资料,所以这里只有一条记录,就算是要处理需要分页的大数据量时,它也是这样用SqlDataReader返回所有的记录,但是之后就会把这些记录全部保存在Cache中,这样以后就不用查询数据库了。

GetAddressParameters方法用来获得此次操作需要的参数,它也是使用了SQLHelper的相关方法来完成的。

private static SqlParameter[] GetAddressParameters() {

//如果以前有保存参数,那就取出来

SqlParameter[] parms = SQLHelper.GetCachedParameters(SQL_SELECT_ADDRESS);

if (parms == null) {

parms = new SqlParameter[] {

new SqlParameter(PARM_USER_ID, SqlDbType.VarChar, 80)};

//创建新的参数数组,然后“缓存”起来

SQLHelper.CacheParameters(SQL_SELECT_ADDRESS, parms);

}

return parms;

}

我们可以接着看SQLHelper中的细节部分

//parmCache的定义

private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

//“缓存”参数

public static void CacheParameters(string cacheKey, params SqlParameter[] cmdParms) {

parmCache[cacheKey] = cmdParms;

}

/// <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];

//使用clone通过遍历得到一个新的参数数组

for (int i = 0, j = cachedParms.Length; i < j; i++)

clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();

return clonedParms;

}

用来缓存参数的parmCache实际上一个private static Hashtable,因为是static,所以自然是独一无二的了,创建一次就可以永远使用,起到和缓存差不多的效果。

在返回参数时要用clone来创建一个新的参数数组返回,是因为parmCache只有一个,而返回的参数数组则至少一个人用一个。更为重要的是,现在保存在parmCache的参数列表都是没有具体值的参数,而返回后则根据每个用户的不同情况而被赋于不同的值。

从这里子可以看出,有一个自己的daab是多么的重要。先前在论坛看到过有人喜欢用拖的方式来进行数据库的连接,那种做法我觉得不是很好,手写代码很重要的,写一个自己顺手的daab更是重要。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航