对于关闭DataReader的方法,实现起来很简单,在finally里将他关闭就行了。关键是如何去处冗余代码。
      经过我的分析,数据访问层的操作可以分为三类:不返回数据,返回单个实体类,返回实体类集合。我将这三种操作的公共部分抽出,写成三个方法放在AccessDALHelper里,类型不同的问题使用泛型解决。
      这样做有一个难题,就是不同实体在由DataReader转化为实体类时的代码很不一样,无法抽出。这里,我使用了Strategy模式解决。具体做法是:首先定义一个由DataReader转换为实体类的策略接口,然后为不同的实体编写不同的转换策略,示意图如下:

基于.NET平台的分层架构实战_休闲
      可以看出,所有转换策略都要实现IDataReaderToEntityStrategy接口,并且每个策略都有一个自组合,这是以为他们都要实现Singleton模式。而AccessDALHelper与具体策略无关,仅与接口耦合。
      下面来看一下具体代码:
      首先是IDataReaderToEntityStrategy接口

IDataReaderToEntityStrategy.cs:
基于.NET平台的分层架构实战_职场_03
 1基于.NET平台的分层架构实战_职场_04using System;
 2基于.NET平台的分层架构实战_职场_04using System.Collections.Generic;
 3基于.NET平台的分层架构实战_职场_04using System.Text;
 4基于.NET平台的分层架构实战_职场_04using System.Data;
 5基于.NET平台的分层架构实战_职场_04using System.Data.OleDb;
 6基于.NET平台的分层架构实战_职场_04
 7基于.NET平台的分层架构实战_职场_04namespace NGuestBook.AccessDAL
 8基于.NET平台的分层架构实战_.NET_11{
 9基于.NET平台的分层架构实战_职场_14    /// <summary>
10基于.NET平台的分层架构实战_.NET_16    /// 由DataReader转换成实体类的策略接口
11基于.NET平台的分层架构实战_.NET_17    /// </summary>

12基于.NET平台的分层架构实战_.NET_16    public interface IDataReaderToEntityStrategy<T>
13基于.NET平台的分层架构实战_平台_19    {
14基于.NET平台的分层架构实战_休闲_22        /// <summary>
15基于.NET平台的分层架构实战_.NET_16        /// 将DataReader转换为实体类,采用泛型
16基于.NET平台的分层架构实战_.NET_16        /// </summary>
17基于.NET平台的分层架构实战_.NET_16        /// <param name="dataReader">包含数据的DataReader对象</param>
18基于.NET平台的分层架构实战_.NET_17        /// <returns>实体类</returns>

19基于.NET平台的分层架构实战_.NET_16        T DataReaderToEntity(OleDbDataReader dataReader);
20基于.NET平台的分层架构实战_.NET_17    }

21基于.NET平台的分层架构实战_休闲_30}

      然后以Admin为例,看一下策略的具体实现:
AdminDataReaderToEntityStrategy.cs:
基于.NET平台的分层架构实战_休闲_32
 1基于.NET平台的分层架构实战_职场_04using System;
 2基于.NET平台的分层架构实战_职场_04using System.Collections.Generic;
 3基于.NET平台的分层架构实战_职场_04using System.Text;
 4基于.NET平台的分层架构实战_职场_04using System.Data;
 5基于.NET平台的分层架构实战_职场_04using System.Data.OleDb;
 6基于.NET平台的分层架构实战_职场_04using NGuestBook.Entity;
 7基于.NET平台的分层架构实战_职场_04
 8基于.NET平台的分层架构实战_职场_04namespace NGuestBook.AccessDAL
 9基于.NET平台的分层架构实战_.NET_42基于.NET平台的分层架构实战_.NET_13

      可以看到,这里实现了一个单件模式。下一个,是重构后的AccessDALHelper,增加了三个方法。
AccessDALHelper.cs:
基于.NET平台的分层架构实战_平台_102
  1基于.NET平台的分层架构实战_职场_04using System;
  2基于.NET平台的分层架构实战_职场_04using System.Collections.Generic;
  3基于.NET平台的分层架构实战_职场_04using System.Web;
  4基于.NET平台的分层架构实战_职场_04using System.Web.Caching;
  5基于.NET平台的分层架构实战_职场_04using System.Configuration;
  6基于.NET平台的分层架构实战_职场_04using System.Data;
  7基于.NET平台的分层架构实战_职场_04using System.Data.OleDb;
  8基于.NET平台的分层架构实战_职场_04using NGuestBook.Utility;
  9基于.NET平台的分层架构实战_职场_04
 10基于.NET平台的分层架构实战_职场_04namespace NGuestBook.AccessDAL
 11基于.NET平台的分层架构实战_平台_113{
 12基于.NET平台的分层架构实战_职场_116    /// <summary>
 13基于.NET平台的分层架构实战_.NET_16    /// Access数据库操作助手
 14基于.NET平台的分层架构实战_.NET_17    /// </summary>

 15基于.NET平台的分层架构实战_.NET_16    public sealed class AccessDALHelper
 16基于.NET平台的分层架构实战_职场_121    {
 17基于.NET平台的分层架构实战_休闲_124        /// <summary>
 18基于.NET平台的分层架构实战_.NET_16        /// 读取Access数据库的连接字符串
 19基于.NET平台的分层架构实战_.NET_16        /// 首先从缓存里读取,如果不存在则到配置文件中读取,并放入缓存
 20基于.NET平台的分层架构实战_.NET_16        /// </summary>
 21基于.NET平台的分层架构实战_.NET_17        /// <returns>Access数据库的连接字符串</returns>

 22基于.NET平台的分层架构实战_.NET_16        private static string GetConnectionString()
 23基于.NET平台的分层架构实战_平台_131        {
 24基于.NET平台的分层架构实战_.NET_16            if (CacheAccess.GetFromCache("AccessConnectionString"!= null)
 25基于.NET平台的分层架构实战_.NET_135            {
 26基于.NET平台的分层架构实战_.NET_16                return CacheAccess.GetFromCache("AccessConnectionString").ToString();
 27基于.NET平台的分层架构实战_.NET_17            }

 28基于.NET平台的分层架构实战_.NET_16            else
 29基于.NET平台的分层架构实战_.NET_141            {
 30基于.NET平台的分层架构实战_.NET_16                string dbPath = ConfigurationManager.AppSettings["AccessPath"];
 31基于.NET平台的分层架构实战_.NET_16                string dbAbsolutePath = HttpContext.Current.Server.MapPath(dbPath);
 32基于.NET平台的分层架构实战_.NET_16                string connectionString = ConfigurationManager.AppSettings["AccessConnectionString"];
 33基于.NET平台的分层架构实战_.NET_16
 34基于.NET平台的分层架构实战_.NET_16                CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));
 35基于.NET平台的分层架构实战_.NET_16                CacheAccess.SaveToCache("AccessConnectionString", connectionString.Replace("{DBPath}", dbAbsolutePath), fileDependency);
 36基于.NET平台的分层架构实战_.NET_16
 37基于.NET平台的分层架构实战_.NET_16                return connectionString.Replace("{DBPath}", dbAbsolutePath);
 38基于.NET平台的分层架构实战_.NET_17            }

 39基于.NET平台的分层架构实战_.NET_17        }

 40基于.NET平台的分层架构实战_.NET_16
 41基于.NET平台的分层架构实战_职场_155        /// <summary>
 42基于.NET平台的分层架构实战_.NET_16        /// 执行SQL语句并且不返回任何值
 43基于.NET平台的分层架构实战_.NET_16        /// </summary>
 44基于.NET平台的分层架构实战_.NET_16        /// <param name="SQLCommand">所执行的SQL命令</param>
 45基于.NET平台的分层架构实战_.NET_17        /// <param name="parameters">参数集合</param>

 46基于.NET平台的分层架构实战_.NET_16        public static void ExecuteSQLNonQuery(string SQLCommand, OleDbParameter[] parameters)
 47基于.NET平台的分层架构实战_职场_162        {
 48基于.NET平台的分层架构实战_.NET_16            OleDbConnection connection = new OleDbConnection(GetConnectionString());
 49基于.NET平台的分层架构实战_.NET_16            OleDbCommand command = new OleDbCommand(SQLCommand, connection);
 50基于.NET平台的分层架构实战_.NET_16
 51基于.NET平台的分层架构实战_.NET_16            for (int i = 0; i < parameters.Length; i++)
 52基于.NET平台的分层架构实战_.NET_169            {
 53基于.NET平台的分层架构实战_.NET_16                command.Parameters.Add(parameters[i]);
 54基于.NET平台的分层架构实战_.NET_17            }

 55基于.NET平台的分层架构实战_.NET_16
 56基于.NET平台的分层架构实战_.NET_16            connection.Open();
 57基于.NET平台的分层架构实战_.NET_16            command.ExecuteNonQuery();
 58基于.NET平台的分层架构实战_.NET_16            connection.Close();
 59基于.NET平台的分层架构实战_.NET_17        }

 60基于.NET平台的分层架构实战_.NET_16
 61基于.NET平台的分层架构实战_职场_180        /// <summary>
 62基于.NET平台的分层架构实战_.NET_16        /// 执行SQL语句并返回包含查询结果的DataReader
 63基于.NET平台的分层架构实战_.NET_16        /// </summary>
 64基于.NET平台的分层架构实战_.NET_16        /// <param name="SQLCommand">所执行的SQL命令</param>
 65基于.NET平台的分层架构实战_.NET_16        /// <param name="parameters">参数集合</param>
 66基于.NET平台的分层架构实战_.NET_17        /// <returns></returns>

 67基于.NET平台的分层架构实战_.NET_16        public static OleDbDataReader ExecuteSQLDataReader(string SQLCommand, OleDbParameter[] parameters)
 68基于.NET平台的分层架构实战_平台_188        {
 69基于.NET平台的分层架构实战_.NET_16            OleDbConnection connection = new OleDbConnection(GetConnectionString());
 70基于.NET平台的分层架构实战_.NET_16            OleDbCommand command = new OleDbCommand(SQLCommand, connection);
 71基于.NET平台的分层架构实战_.NET_16
 72基于.NET平台的分层架构实战_.NET_16            for (int i = 0; i < parameters.Length; i++)
 73基于.NET平台的分层架构实战_平台_195            {
 74基于.NET平台的分层架构实战_.NET_16                command.Parameters.Add(parameters[i]);
 75基于.NET平台的分层架构实战_.NET_17            }

 76基于.NET平台的分层架构实战_.NET_16
 77基于.NET平台的分层架构实战_.NET_16            connection.Open();
 78基于.NET平台的分层架构实战_.NET_16            OleDbDataReader dataReader = command.ExecuteReader();
 79基于.NET平台的分层架构实战_.NET_16            //connection.Close();
 80基于.NET平台的分层架构实战_.NET_16
 81基于.NET平台的分层架构实战_.NET_16            return dataReader;
 82基于.NET平台的分层架构实战_.NET_17        }

 83基于.NET平台的分层架构实战_.NET_16
 84基于.NET平台的分层架构实战_平台_208        /// <summary>
 85基于.NET平台的分层架构实战_.NET_16        /// 执行不需要返回数据的操作
 86基于.NET平台的分层架构实战_.NET_16        /// </summary>
 87基于.NET平台的分层架构实战_.NET_16        /// <param name="SQLCommand">SQL命令</param>
 88基于.NET平台的分层架构实战_.NET_16        /// <param name="parameters">参数</param>
 89基于.NET平台的分层架构实战_.NET_17        /// <returns>是否成功</returns>

 90基于.NET平台的分层架构实战_.NET_16        public static bool OperateNonData(string SQLCommand, OleDbParameter[] parameters)
 91基于.NET平台的分层架构实战_.NET_216        {
 92基于.NET平台的分层架构实战_.NET_16            try
 93基于.NET平台的分层架构实战_平台_220            {
 94基于.NET平台的分层架构实战_.NET_16                ExecuteSQLNonQuery(SQLCommand, parameters);
 95基于.NET平台的分层架构实战_.NET_16                return true;
 96基于.NET平台的分层架构实战_.NET_17            }

 97基于.NET平台的分层架构实战_.NET_16            catch
 98基于.NET平台的分层架构实战_平台_227            {
 99基于.NET平台的分层架构实战_.NET_16                return false;
100基于.NET平台的分层架构实战_.NET_17            }

101基于.NET平台的分层架构实战_.NET_17        }

102基于.NET平台的分层架构实战_.NET_16
103基于.NET平台的分层架构实战_平台_234        /// <summary>
104基于.NET平台的分层架构实战_.NET_16        /// 执行返回单个实体类的操作
105基于.NET平台的分层架构实战_.NET_16        /// </summary>
106基于.NET平台的分层架构实战_.NET_16        /// <typeparam name="T">实体类类型</typeparam>
107基于.NET平台的分层架构实战_.NET_16        /// <param name="SQLCommand">SQL命令</param>
108基于.NET平台的分层架构实战_.NET_16        /// <param name="parameters">参数</param>
109基于.NET平台的分层架构实战_.NET_16        /// <param name="strategy">DataReader到实体类的转换策略</param>
110基于.NET平台的分层架构实战_.NET_17        /// <returns>实体类</returns>

111基于.NET平台的分层架构实战_.NET_16        public static T OperateEntity<T>(string SQLCommand, OleDbParameter[] parameters, IDataReaderToEntityStrategy<T> strategy)
112基于.NET平台的分层架构实战_平台_244        {
113基于.NET平台的分层架构实战_.NET_16            OleDbDataReader dataReader = ExecuteSQLDataReader(SQLCommand, parameters);
114基于.NET平台的分层架构实战_.NET_16            try
115基于.NET平台的分层架构实战_平台_249            {
116基于.NET平台的分层架构实战_.NET_16                if (!dataReader.HasRows)
117基于.NET平台的分层架构实战_职场_253                {
118基于.NET平台的分层架构实战_.NET_16                    throw new Exception();
119基于.NET平台的分层架构实战_.NET_17                }

120基于.NET平台的分层架构实战_.NET_16
121基于.NET平台的分层架构实战_.NET_16                dataReader.Read();
122基于.NET平台的分层架构实战_.NET_16                return strategy.DataReaderToEntity(dataReader);
123基于.NET平台的分层架构实战_.NET_17            }

124基于.NET平台的分层架构实战_.NET_16            catch
125基于.NET平台的分层架构实战_休闲_263            {
126基于.NET平台的分层架构实战_.NET_16                return default(T);
127基于.NET平台的分层架构实战_.NET_17            }

128基于.NET平台的分层架构实战_.NET_16            finally
129基于.NET平台的分层架构实战_平台_269            {
130基于.NET平台的分层架构实战_.NET_16                dataReader.Close();
131基于.NET平台的分层架构实战_.NET_17            }

132基于.NET平台的分层架构实战_.NET_17        }

133基于.NET平台的分层架构实战_.NET_16
134基于.NET平台的分层架构实战_休闲_276        /// <summary>
135基于.NET平台的分层架构实战_.NET_16        /// 执行返回实体类集合的操作
136基于.NET平台的分层架构实战_.NET_16        /// </summary>
137基于.NET平台的分层架构实战_.NET_16        /// <typeparam name="T">实体类类型</typeparam>
138基于.NET平台的分层架构实战_.NET_16        /// <param name="SQLCommand">SQL命令</param>
139基于.NET平台的分层架构实战_.NET_16        /// <param name="parameters">参数</param>
140基于.NET平台的分层架构实战_.NET_16        /// <param name="strategy">DataReader到实体类的转换策略</param>
141基于.NET平台的分层架构实战_.NET_17        /// <returns>实体类</returns>

142基于.NET平台的分层架构实战_.NET_16        public static IList<T> OperateEntityCollection<T>(string SQLCommand, OleDbParameter[] parameters, IDataReaderToEntityStrategy<T> strategy)
143基于.NET平台的分层架构实战_平台_286        {
144基于.NET平台的分层架构实战_.NET_16            OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, null);
145基于.NET平台的分层架构实战_.NET_16            try
146基于.NET平台的分层架构实战_.NET_291            {
147基于.NET平台的分层架构实战_.NET_16                if (!dataReader.HasRows)
148基于.NET平台的分层架构实战_平台_295                {
149基于.NET平台的分层架构实战_.NET_16                    throw new Exception();
150基于.NET平台的分层架构实战_.NET_17                }

151基于.NET平台的分层架构实战_.NET_16
152基于.NET平台的分层架构实战_.NET_16                IList<T> entityCollection = new List<T>();
153基于.NET平台的分层架构实战_.NET_16                int i = 0;
154基于.NET平台的分层架构实战_.NET_16                while (dataReader.Read())
155基于.NET平台的分层架构实战_.NET_304                {
156基于.NET平台的分层架构实战_.NET_16                    entityCollection.Add(strategy.DataReaderToEntity(dataReader));
157基于.NET平台的分层架构实战_.NET_16                    i++;
158基于.NET平台的分层架构实战_.NET_17                }

159基于.NET平台的分层架构实战_.NET_16
160基于.NET平台的分层架构实战_.NET_16                return entityCollection;
161基于.NET平台的分层架构实战_.NET_17            }

162基于.NET平台的分层架构实战_.NET_16            catch
163基于.NET平台的分层架构实战_平台_314            {
164基于.NET平台的分层架构实战_.NET_16                return default(IList<T>);
165基于.NET平台的分层架构实战_.NET_17            }

166基于.NET平台的分层架构实战_.NET_16            finally
167基于.NET平台的分层架构实战_平台_320            {
168基于.NET平台的分层架构实战_.NET_16                dataReader.Close();
169基于.NET平台的分层架构实战_.NET_17            }

170基于.NET平台的分层架构实战_.NET_17        }

171基于.NET平台的分层架构实战_.NET_17    }

172基于.NET平台的分层架构实战_休闲_30}

      最后以Admin为例,看一下简化后的数据访问层实现:
AdminDAL.cs:
基于.NET平台的分层架构实战_平台_329
  1基于.NET平台的分层架构实战_职场_04using System;
  2基于.NET平台的分层架构实战_职场_04using System.Collections.Generic;
  3基于.NET平台的分层架构实战_职场_04using System.Text;
  4基于.NET平台的分层架构实战_职场_04using System.Data;
  5基于.NET平台的分层架构实战_职场_04using System.Data.OleDb;
  6基于.NET平台的分层架构实战_职场_04using NGuestBook.IDAL;
  7基于.NET平台的分层架构实战_职场_04using NGuestBook.Entity;
  8基于.NET平台的分层架构实战_职场_04
  9基于.NET平台的分层架构实战_职场_04namespace NGuestBook.AccessDAL
 10基于.NET平台的分层架构实战_职场_339{
 11基于.NET平台的分层架构实战_.NET_16    public class AdminDAL : IAdminDAL
 12基于.NET平台的分层架构实战_.NET_343    {
 13基于.NET平台的分层架构实战_.NET_346        /// <summary>
 14基于.NET平台的分层架构实战_.NET_16        /// 插入管理员
 15基于.NET平台的分层架构实战_.NET_16        /// </summary>
 16基于.NET平台的分层架构实战_.NET_16        /// <param name="admin">管理员实体类</param>
 17基于.NET平台的分层架构实战_.NET_17        /// <returns>是否成功</returns>

 18基于.NET平台的分层架构实战_.NET_16        public bool Insert(AdminInfo admin)
 19基于.NET平台的分层架构实战_平台_353        {
 20基于.NET平台的分层架构实战_.NET_16            string SQLCommand = "insert into [TAdmin]([Name],[Password]) values(@name,@password)";
 21基于.NET平台的分层架构实战_.NET_357            OleDbParameter[] parameters ={
 22基于.NET平台的分层架构实战_.NET_16                new OleDbParameter("name",OleDbType.VarChar,20),
 23基于.NET平台的分层架构实战_.NET_16                new OleDbParameter("password",OleDbType.VarChar,50)
 24基于.NET平台的分层架构实战_.NET_17            }
;
 25基于.NET平台的分层架构实战_.NET_16            parameters[0].Value = admin.Name;
 26基于.NET平台的分层架构实战_.NET_16            parameters[1].Value = admin.Password;
 27基于.NET平台的分层架构实战_.NET_16
 28基于.NET平台的分层架构实战_.NET_16            return AccessDALHelper.OperateNonData(SQLCommand, parameters);
 29基于.NET平台的分层架构实战_.NET_17        }

 30基于.NET平台的分层架构实战_.NET_16
 31基于.NET平台的分层架构实战_.NET_369        /// <summary>
 32基于.NET平台的分层架构实战_.NET_16        /// 删除管理员
 33基于.NET平台的分层架构实战_.NET_16        /// </summary>
 34基于.NET平台的分层架构实战_.NET_16        /// <param name="id">欲删除的管理员的ID</param>
 35基于.NET平台的分层架构实战_.NET_17        /// <returns>是否成功</returns>

 36基于.NET平台的分层架构实战_.NET_16        public bool Delete(int id)
 37基于.NET平台的分层架构实战_职场_376        {
 38基于.NET平台的分层架构实战_.NET_16            string SQLCommand = "delete from [TAdmin] where [ID]=@id";
 39基于.NET平台的分层架构实战_职场_380            OleDbParameter[] parameters ={
 40基于.NET平台的分层架构实战_.NET_16                new OleDbParameter("id",OleDbType.Integer)
 41基于.NET平台的分层架构实战_.NET_17            }
;
 42基于.NET平台的分层架构实战_.NET_16            parameters[0].Value = id;
 43基于.NET平台的分层架构实战_.NET_16
 44基于.NET平台的分层架构实战_.NET_16            return AccessDALHelper.OperateNonData(SQLCommand, parameters);
 45基于.NET平台的分层架构实战_.NET_17        }

 46基于.NET平台的分层架构实战_.NET_16
 47基于.NET平台的分层架构实战_职场_390        /// <summary>
 48基于.NET平台的分层架构实战_.NET_16        /// 更新管理员信息
 49基于.NET平台的分层架构实战_.NET_16        /// </summary>
 50基于.NET平台的分层架构实战_.NET_16        /// <param name="admin">管理员实体类</param>
 51基于.NET平台的分层架构实战_.NET_17        /// <returns>是否成功</returns>

 52基于.NET平台的分层架构实战_.NET_16        public bool Update(AdminInfo admin)
 53基于.NET平台的分层架构实战_.NET_397        {
 54基于.NET平台的分层架构实战_.NET_16            string SQLCommand = "update [TAdmin] set [Name]=@name,[Password]=@password where [ID]=@id";
 55基于.NET平台的分层架构实战_平台_401            OleDbParameter[] parameters ={
 56基于.NET平台的分层架构实战_.NET_16                new OleDbParameter("id",OleDbType.Integer),
 57基于.NET平台的分层架构实战_.NET_16                new OleDbParameter("name",OleDbType.VarChar,20),
 58基于.NET平台的分层架构实战_.NET_16                new OleDbParameter("password",OleDbType.VarChar,50)
 59基于.NET平台的分层架构实战_.NET_17            }
;
 60基于.NET平台的分层架构实战_.NET_16            parameters[0].Value = admin.ID;
 61基于.NET平台的分层架构实战_.NET_16            parameters[1].Value = admin.Name;
 62基于.NET平台的分层架构实战_.NET_16            parameters[2].Value = admin.Password;
 63基于.NET平台的分层架构实战_.NET_16
 64基于.NET平台的分层架构实战_.NET_16            return AccessDALHelper.OperateNonData(SQLCommand, parameters);
 65基于.NET平台的分层架构实战_.NET_17        }

 66基于.NET平台的分层架构实战_.NET_16
 67基于.NET平台的分层架构实战_休闲_415        /// <summary>
 68基于.NET平台的分层架构实战_.NET_16        /// 按ID取得管理员信息
 69基于.NET平台的分层架构实战_.NET_16        /// </summary>
 70基于.NET平台的分层架构实战_.NET_16        /// <param name="id">管理员ID</param>
 71基于.NET平台的分层架构实战_.NET_17        /// <returns>管理员实体类</returns>

 72基于.NET平台的分层架构实战_.NET_16        public AdminInfo GetByID(int id)
 73基于.NET平台的分层架构实战_休闲_422        {
 74基于.NET平台的分层架构实战_.NET_16            string SQLCommand = "select * from [TAdmin] where [ID]=@id";
 75基于.NET平台的分层架构实战_休闲_426            OleDbParameter[] parameters ={
 76基于.NET平台的分层架构实战_.NET_16                new OleDbParameter("id",OleDbType.Integer)
 77基于.NET平台的分层架构实战_.NET_17            }
;
 78基于.NET平台的分层架构实战_.NET_16            parameters[0].Value = id;
 79基于.NET平台的分层架构实战_.NET_16
 80基于.NET平台的分层架构实战_.NET_16            return AccessDALHelper.OperateEntity<AdminInfo>(SQLCommand, parameters, AdminDataReaderToEntityStrategy.GetInstance());
 81基于.NET平台的分层架构实战_.NET_17        }

 82基于.NET平台的分层架构实战_.NET_16
 83基于.NET平台的分层架构实战_职场_436        /// <summary>
 84基于.NET平台的分层架构实战_.NET_16        /// 按用户名及密码取得管理员信息
 85基于.NET平台的分层架构实战_.NET_16        /// </summary>
 86基于.NET平台的分层架构实战_.NET_16        /// <param name="name">用户名</param>
 87基于.NET平台的分层架构实战_.NET_16        /// <param name="password">密码</param>
 88基于.NET平台的分层架构实战_.NET_17        /// <returns>管理员实体类,不存在时返回null</returns>

 89基于.NET平台的分层架构实战_.NET_16        public AdminInfo GetByNameAndPassword(string name, string password)
 90基于.NET平台的分层架构实战_.NET_444        {
 91基于.NET平台的分层架构实战_.NET_16            string SQLCommand = "select * from [TAdmin] where [Name]=@name and [Password]=@password";
 92基于.NET平台的分层架构实战_职场_448            OleDbParameter[] parameters ={
 93基于.NET平台的分层架构实战_.NET_16                new OleDbParameter("name",OleDbType.VarChar,20),
 94基于.NET平台的分层架构实战_.NET_16                new OleDbParameter("password",OleDbType.VarChar,50)
 95基于.NET平台的分层架构实战_.NET_17            }
;
 96基于.NET平台的分层架构实战_.NET_16            parameters[0].Value = name;
 97基于.NET平台的分层架构实战_.NET_16            parameters[1].Value = password;
 98基于.NET平台的分层架构实战_.NET_16
 99基于.NET平台的分层架构实战_.NET_16            return AccessDALHelper.OperateEntity<AdminInfo>(SQLCommand, parameters, AdminDataReaderToEntityStrategy.GetInstance());
100基于.NET平台的分层架构实战_.NET_17        }

101基于.NET平台的分层架构实战_.NET_16
102基于.NET平台的分层架构实战_职场_460        /// <summary>
103基于.NET平台的分层架构实战_.NET_16        /// 按管理员名取得管理员信息
104基于.NET平台的分层架构实战_.NET_16        /// </summary>
105基于.NET平台的分层架构实战_.NET_16        /// <param name="name">管理员名</param>
106基于.NET平台的分层架构实战_.NET_17        /// <returns>管理员实体类</returns>

107基于.NET平台的分层架构实战_.NET_16        public AdminInfo GetByName(string name)
108基于.NET平台的分层架构实战_.NET_467        {
109基于.NET平台的分层架构实战_.NET_16            string SQLCommand = "select * from [TAdmin] where [Name]=@name";
110基于.NET平台的分层架构实战_职场_471            OleDbParameter[] parameters ={
111基于.NET平台的分层架构实战_.NET_16                new OleDbParameter("name",OleDbType.VarChar,20)
112基于.NET平台的分层架构实战_.NET_17            }
;
113基于.NET平台的分层架构实战_.NET_16            parameters[0].Value = name;
114基于.NET平台的分层架构实战_.NET_16
115基于.NET平台的分层架构实战_.NET_16            return AccessDALHelper.OperateEntity<AdminInfo>(SQLCommand, parameters, AdminDataReaderToEntityStrategy.GetInstance());
116基于.NET平台的分层架构实战_.NET_17        }

117基于.NET平台的分层架构实战_.NET_16
118基于.NET平台的分层架构实战_.NET_481        /// <summary>
119基于.NET平台的分层架构实战_.NET_16        /// 取得全部管理员信息
120基于.NET平台的分层架构实战_.NET_16        /// </summary>
121基于.NET平台的分层架构实战_.NET_17        /// <returns>管理员实体类集合</returns>

122基于.NET平台的分层架构实战_.NET_16        public IList<AdminInfo> GetAll()
123基于.NET平台的分层架构实战_休闲_487        {
124基于.NET平台的分层架构实战_.NET_16            string SQLCommand = "select * from [TAdmin]";
125基于.NET平台的分层架构实战_.NET_16
126基于.NET平台的分层架构实战_.NET_16            return AccessDALHelper.OperateEntityCollection<AdminInfo>(SQLCommand, null, AdminDataReaderToEntityStrategy.GetInstance());
127基于.NET平台的分层架构实战_.NET_17        }

128基于.NET平台的分层架构实战_.NET_17    }

129基于.NET平台的分层架构实战_休闲_30}