您的位置:首页 > 数据库 > SQL

基于.NET平台的分层架构实战(七)——数据访问层的第一种实现:Access+SQL

2011-03-26 21:23 681 查看
经过上面篇文章的介绍,整个系统的框架算是基本搭建完了,下面,我们要具体实现各个层次。关于数据访问层的实现,我准备讨论三种实现方式,这一篇文章讨论第一种:Access+动态生成SQL。

顾名思义,这种实现将使用Access作为后台数据库,而操作方式也是最基本的使用SQL命令。

在具体编写实现代码之前,我们需要做一些准备工作:

第一步,我们要将Access数据库搭建完成,具体做法如下。

在Web工程下新建一个文件夹,命名为AccessData,并在其中新建一个mdb文件(即Access数据库文件),按照前面介绍过的数据库设计构架,将数据表及表间关系建好,这里不再赘述。

第二步,我们要进行一些配置。
打开Web工程下的Web.config文件,在其中的appSettings节点下,添加如下键值:
<add key="AccessConnectionString" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={DBPath}"/>
<add key="AccessPath" value="~/AccessData/AccessDatabase.mdb"/>
第一条为Access的连接字符串,第二条为Access数据库文件的路径,其中“~”表示网站根目录。

第三步,新建一个工程。
我们要新建一个工程AccessDAL,用来存放Access数据访问层的代码。

准备工作做完了,现在来实现具体的代码。

1.编写数据访问助手类
因为很多数据访问操作流程很相似,所以,这里将一些可复用的代码抽取出来,编写成助手类,以此减少代码量,提高代码复用性。
这个助手类放在AccessDAL下,叫AccessDALHelper,主要负责Access数据库的访问。它包括三个方法:
GetConnectionString:从配置文件中读取配置项,组合成连接字符串。
ExecuteSQLNonQuery:执行指定SQL语句,不返回任何值,一般用于Insert,Delete,Update命令。
ExecuteSQLDataReader:执行SQL语句返回查询结果,一般用于Select命令。
具体代码如下:

AccessDALHelper.cs:

AccessDALHelper

1using System;

2using System.Web;

3using System.Web.Caching;

4using System.Configuration;

5using System.Data;

6using System.Data.OleDb;

7using NGuestBook.Utility;

8

9namespace NGuestBook.AccessDAL

10{

11 /**//// <summary>

12 /// Access数据库操作助手

13 /// </summary>

14 public sealed class AccessDALHelper

15 {

16 /**//// <summary>

17 /// 读取Access数据库的连接字符串

18 /// 首先从缓存里读取,如果不存在则到配置文件中读取,并放入缓存

19 /// </summary>

20 /// <returns>Access数据库的连接字符串</returns>

21 private static string GetConnectionString()

22 {

23 if (CacheAccess.GetFromCache("AccessConnectionString") != null)

24 {

25 return CacheAccess.GetFromCache("AccessConnectionString").ToString();

26 }

27 else

28 {

29 string dbPath = ConfigurationManager.AppSettings["AccessPath"];

30 string dbAbsolutePath = HttpContext.Current.Server.MapPath(dbPath);

31 string connectionString = ConfigurationManager.AppSettings["AccessConnectionString"];

32

33 CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));

34 CacheAccess.SaveToCache("AccessConnectionString", connectionString.Replace("{DBPath}", dbAbsolutePath), fileDependency);

35

36 return connectionString.Replace("{DBPath}", dbAbsolutePath);

37 }

38 }

39

40 /**//// <summary>

41 /// 执行SQL语句并且不返回任何值

42 /// </summary>

43 /// <param name="SQLCommand">所执行的SQL命令</param>

44 /// <param name="parameters">参数集合</param>

45 public static void ExecuteSQLNonQuery(string SQLCommand,OleDbParameter[] parameters)

46 {

47 OleDbConnection connection = new OleDbConnection(GetConnectionString());

48 OleDbCommand command = new OleDbCommand(SQLCommand, connection);

49

50 for (int i = 0; i < parameters.Length; i++)

51 {

52 command.Parameters.Add(parameters);

53 }

54

55 connection.Open();

56 command.ExecuteNonQuery();

57 connection.Close();

58 }

59

60 /**//// <summary>

61 /// 执行SQL语句并返回包含查询结果的DataReader

62 /// </summary>

63 /// <param name="SQLCommand">所执行的SQL命令</param>

64 /// <param name="parameters">参数集合</param>

65 /// <returns></returns>

66 public static OleDbDataReader ExecuteSQLDataReader(string SQLCommand,OleDbParameter[] parameters)

67 {

68 OleDbConnection connection = new OleDbConnection(GetConnectionString());

69 OleDbCommand command = new OleDbCommand(SQLCommand, connection);

70

71 for (int i = 0; i < parameters.Length; i++)

72 {

73 command.Parameters.Add(parameters);

74 }

75

76 connection.Open();

77 OleDbDataReader dataReader = command.ExecuteReader();

78 //connection.Close();

79

80 return dataReader;

81 }

82 }

83}

复制代码
2.实现具体的数据访问操作类
因为前面已经定义了数据访问层接口,所以实现数据访问操作类就是很机械的工作了。下面仅以Admin的数据访问操作类为例:

AdminDAL:

AdminDAL

1using System;

2using System.Collections.Generic;

3using System.Text;

4using System.Data;

5using System.Data.OleDb;

6using NGuestBook.IDAL;

7using NGuestBook.Entity;

8

9namespace NGuestBook.AccessDAL

10{

11 public class AdminDAL : IAdminDAL

12 {

13 /**//// <summary>

14 /// 插入管理员

15 /// </summary>

16 /// <param name="admin">管理员实体类</param>

17 /// <returns>是否成功</returns>

18 public bool Insert(AdminInfo admin)

19 {

20 string SQLCommand = "insert into [TAdmin]([Name],[Password]) values(@name,@password)";

21 OleDbParameter[] parameters ={

22 new OleDbParameter("name",admin.Name),

23 new OleDbParameter("password",admin.Password)

24 };

25

26 try

27 {

28 AccessDALHelper.ExecuteSQLNonQuery(SQLCommand, parameters);

29 return true;

30 }

31 catch

32 {

33 return false;

34 }

35 }

36

37 /**//// <summary>

38 /// 删除管理员

39 /// </summary>

40 /// <param name="id">欲删除的管理员的ID</param>

41 /// <returns>是否成功</returns>

42 public bool Delete(int id)

43 {

44 string SQLCommand = "delete from [TAdmin] where [ID]=@id";

45 OleDbParameter[] parameters ={

46 new OleDbParameter("id",id)

47 };

48

49 try

50 {

51 AccessDALHelper.ExecuteSQLNonQuery(SQLCommand, parameters);

52 return true;

53 }

54 catch

55 {

56 return false;

57 }

58 }

59

60 /**//// <summary>

61 /// 更新管理员信息

62 /// </summary>

63 /// <param name="admin">管理员实体类</param>

64 /// <returns>是否成功</returns>

65 public bool Update(AdminInfo admin)

66 {

67 string SQLCommand = "update [TAdmin] set [Name]=@name,[Password]=@password where [ID]=@id";

68 OleDbParameter[] parameters ={

69 new OleDbParameter("id",admin.ID),

70 new OleDbParameter("name",admin.Name),

71 new OleDbParameter("password",admin.Password)

72 };

73

74 try

75 {

76 AccessDALHelper.ExecuteSQLNonQuery(SQLCommand, parameters);

77 return true;

78 }

79 catch

80 {

81 return false;

82 }

83 }

84

85 /**//// <summary>

86 /// 按ID取得管理员信息

87 /// </summary>

88 /// <param name="id">管理员ID</param>

89 /// <returns>管理员实体类</returns>

90 public AdminInfo GetByID(int id)

91 {

92 string SQLCommand = "select * from [TAdmin] where [ID]=@id";

93 OleDbParameter[] parameters ={

94 new OleDbParameter("id",id)

95 };

96

97 try

98 {

99 OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, parameters);

100 if (!dataReader.HasRows)

101 {

102 throw new Exception();

103 }

104

105 AdminInfo admin = new AdminInfo();

106 dataReader.Read();

107 admin.ID=(int)dataReader["ID"];

108 admin.Name=(string)dataReader["Name"];

109 admin.Password=(string)dataReader["Password"];

110

111 return admin;

112 }

113 catch

114 {

115 return null;

116 }

117 }

118

119 /**//// <summary>

120 /// 按用户名及密码取得管理员信息

121 /// </summary>

122 /// <param name="name">用户名</param>

123 /// <param name="password">密码</param>

124 /// <returns>管理员实体类,不存在时返回null</returns>

125 public AdminInfo GetByNameAndPassword(string name, string password)

126 {

127 string SQLCommand = "select * from [TAdmin] where [Name]=@name and [Password]=@password";

128 OleDbParameter[] parameters ={

129 new OleDbParameter("name",name),

130 new OleDbParameter("password",password),

131 };

132

133 try

134 {

135 OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, parameters);

136 if (!dataReader.HasRows)

137 {

138 throw new Exception();

139 }

140

141 AdminInfo admin = new AdminInfo();

142 dataReader.Read();

143 admin.ID = (int)dataReader["ID"];

144 admin.Name = (string)dataReader["Name"];

145 admin.Password = (string)dataReader["Password"];

146

147 return admin;

148 }

149 catch

150 {

151 return null;

152 }

153 }

154

155 /**//// <summary>

156 /// 按管理员名取得管理员信息

157 /// </summary>

158 /// <param name="name">管理员名</param>

159 /// <returns>管理员实体类</returns>

160 public AdminInfo GetByName(string name)

161 {

162 string SQLCommand = "select * from [TAdmin] where [Name]=@name";

163 OleDbParameter[] parameters ={

164 new OleDbParameter("name",name),

165 };

166

167 try

168 {

169 OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, parameters);

170 if (!dataReader.HasRows)

171 {

172 throw new Exception();

173 }

174

175 AdminInfo admin = new AdminInfo();

176 dataReader.Read();

177 admin.ID = (int)dataReader["ID"];

178 admin.Name = (string)dataReader["Name"];

179 admin.Password = (string)dataReader["Password"];

180

181 return admin;

182 }

183 catch

184 {

185 return null;

186 }

187 }

188

189 /**//// <summary>

190 /// 取得全部管理员信息

191 /// </summary>

192 /// <returns>管理员实体类集合</returns>

193 public IList<AdminInfo> GetAll()

194 {

195 string SQLCommand = "select * from [TAdmin]";

196 try

197 {

198 OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, null);

199 if (!dataReader.HasRows)

200 {

201 throw new Exception();

202 }

203

204 IList<AdminInfo> adminCollection = new List<AdminInfo>();

205 int i = 0;

206 while (dataReader.Read())

207 {

208 AdminInfo admin = new AdminInfo();

209 admin.ID = (int)dataReader["ID"];

210 admin.Name = (string)dataReader["Name"];

211 admin.Password = (string)dataReader["Password"];

212

213 adminCollection.Add(admin);

214 i++;

215 }

216

217 return adminCollection;

218 }

219 catch

220 {

221 return null;

222 }

223 }

224 }

225}

复制代码
可以看到,这里主要包括三种类型的操作,一种是修改型,如Insert;一种是返回单个实体类型,如GetByID;还有一种是返回实体类集合型,如GetAll。
MessageDAL和CommentDAL的实现非常相似,在这里不再赘述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐