学习PetShop3.0(8)数据访问

转载 2006年06月16日 10:03:00

看一下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更是重要。

PetShop3.0数据访问层实现详解

前面的文章对Petshop的多层应用和表现层进行了介绍。本篇将详细介绍PetShop3.0的数据访问层实现,及其优缺点。  PetShop3.0的Oracle数据层实现在OracleDAL工程中。 ...
  • liuwei1128
  • liuwei1128
  • 2014年03月14日 21:35
  • 288

springboot【8】数据访问之JdbcTemplate访问数据库

一、数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式。 首先,为了连接数据库需要引入jdbc支持,在pom.xml中引入如下配置: org....
  • IT_lyd
  • IT_lyd
  • 2017年08月02日 17:37
  • 258

读《Java JDK 8 学习笔记》

1.Java 编程语言刚开始 Oak 橡树 办公室外 已被注册 边喝咖啡边讨论名称  2.动态加载类别文档、字符串池(String Pool)等特性为节省内存而设计 3....
  • u012677972
  • u012677972
  • 2017年03月20日 21:55
  • 316

CUDA总结:合并访问coalesced

传输延迟(latency)在host端和device端之间存在latency,数据通过PCI-E总线从CPU传输给GPU,我们必须避免 频繁的host、device间数据传输,即使是最新的PCIE ...
  • Kelvin_Yan
  • Kelvin_Yan
  • 2016年12月12日 23:03
  • 1500

台湾大学林轩田机器学习技法课程学习笔记8 -- Adaptive Boosting

上节课我们主要开始介绍Aggregation Models,目的是将不同的hypothesis得到的gtg_t集合起来,利用集体智慧得到更好的预测模型G。首先我们介绍了Blending,blendin...
  • red_stone1
  • red_stone1
  • 2017年07月17日 14:16
  • 1256

《Java JDK8学习笔记》读书笔记(4)

第4章 认识对象 学习目标  区分基本类型与对象类型  了解对象与引用的关系  从打包器认识对象  以对象观点看待数组  认识字符串的特性...
  • mouyong
  • mouyong
  • 2016年04月18日 20:10
  • 4414

Myeclipse学习总结(8)——Eclipse实用操作

工欲善其事,必先利其器。对于程序员来说,Eclipse便是其中的一个“器”。本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍。Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分...
  • u012562943
  • u012562943
  • 2016年07月22日 13:06
  • 2364

JAVA8新特性学习笔记

一、Lamda表达式 在JAVA8新特性中主要一点就是支持了Lamda表达式,这为我们开发带来了一些便利。 传统中我们实现匿名内部类是这样的: interface Message {// 这适宜个一个...
  • a917390823
  • a917390823
  • 2015年12月31日 17:38
  • 720

Python笔记8——数据封装和访问限制

1.类是创建实例的模板,而实例则是一个个具体的对象,各个实例拥有的数据都相互独立,互不影响。 2.方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据。通过在实例上调用方法,我们就直...
  • Luckyhot
  • Luckyhot
  • 2017年10月30日 15:44
  • 89

《Java JDK8学习笔记》读书笔记(3)

第3章 基础语法,虽然很简单,但其中有些知识是平时没太留意到的,有些是JDK8加入的新特性,蛮有用的。已完成排版。...
  • mouyong
  • mouyong
  • 2016年02月25日 12:27
  • 2649
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习PetShop3.0(8)数据访问
举报原因:
原因补充:

(最多只允许输入30个字)