数据访问层实现了一个类Database,完成了最基本的数据访问能力,包括以下功能。
(1)连接数据库:Open()。
(2)根据一个SQL查询字符串,获取一个数据集GetDataSet()。
(3)关闭数据库:Close()。
其类图如图19.6所示。
为了便于管理工程中的文件,在创建Database类之前,首先在工程中加入一个文件夹DataAccessLayer,用于放置数据访问层有关的文件,具体步骤为:在【解决方案资源管理器】中,右键单击工程,在弹出的菜单中选择【添加】|【新建文件夹】命令,然后将文件夹取名为DataAccessLayer即可。
在DataAccessLayer文件夹中,添加一个CS文件,取名为Database,用于实现DataBase类,实现代码如下。
代码19-11 Database类实现:DataAccessLayer/Database.cs
1. /**********************************************************
2. * 示例:Web系统的三层体系结构之
3. * 数据操作层
4. *********************************************************/
5. using System;
6. using System.Data;
7. using System.Data.SqlClient;
8. using System.Configuration;
9.
10. namespace NorthWind.DataLayer
11. {
12. /// <summary>
13. /// Database类,用于数据访问。
14. /// </summary>
15. public class Database
16. {
17. /// <summary>
18. /// 保护变量,数据库连接。
19. /// </summary>
20. protected SqlConnection Connection;
21.
22. /// <summary>
23. /// 保护变量,数据库连接串。
24. /// </summary>
25. protected String ConnectionString;
26.
27. /// <summary>
28. /// 构造函数。
29. /// </summary>
30. public Database()
31. {
32. ConnectionString =
33. ConfigurationSettings.AppSettings ["DBConnectionString"];
34. }
35.
36. /// <summary>
37. /// 析构函数,关闭数据库
38. /// </summary>
39. ~Database()
40. {
41. try
42. {
43. if (Connection != null)
44. Connection.Close();
45. }
46. catch{}
47. }
48.
49. /// <summary>
50. /// 保护方法,打开数据库连接。
51. /// </summary>
52. protected void Open()
53. {
54. if (Connection == null)
55. {
56. Connection = new SqlConnection(ConnectionString);
57. }
58. if (Connection.State.Equals(ConnectionState.Closed))
59. {
60. Connection.Open();
61. }
62. }
63.
64. /// <summary>
65. /// 公有方法,关闭数据库连接。
66. /// </summary>
67. public void Close()
68. {
69. if (Connection != null)
70. Connection.Close();
71. }
72.
73. /// <summary>
74. /// 公有方法,获取数据,返回一个DataSet。
75. /// </summary>
76. /// <param name="SqlString">Sql语句</param>
77. /// <returns>DataSet</returns>
78. public DataSet GetDataSet(String SqlString)
79. {
80. Open();
81. SqlDataAdapter adapter = new SqlDataAdapter(SqlString, Connection);
82. DataSet dataset = new DataSet();
83. adapter.Fill(dataset);
84. Close();
85. return dataset;
86. }
87. }
88. }
代码实现了Database类,解释如下。
(1)第1~4行为文档注释。
(2)第5~8行为系统引入的.NET命名空间。
(3)第17~25行定义了Database类的两个保护成员Connection和ConnectionString,分别为其数据库连接对象和连接字符串。
(4)第27~34行实现了Database的构造方法,在构造方法中,Database读取了配置文件,并因此获取了连接字符串。
把数据库连接字符串写在配置文件中,是常用的一种方式,这种方式便于系统的部署和配置。具体实现为,在工程的Web.Config文件中,添加如下代码。
<appSettings>
<add key="DBConnectionString"
value="server=(local);database=NorthWind;User Id=sa;pwd=sa"/>
</appSettings>
Web.Config文件是一个XML文档,可以为同一目录及子目录中的文件提供配置信息。如果想要添加一个工程级别的配置属性,可以通过标签<appSettings><appSettings>实现。
本例所添加的代码中,就为整个工程添加了一个配置属性DBConnectionString,在工程的任意文件中,都可以通过ConfigurationSettings类的AppSetting属性来获取其值,如代码第32、33行所示。
(5)第36~47行实现了Database类的析构函数,使对象在销毁前,断开数据库连接。
(6)第49~62行实现了Open方法,根据ConnectionString属性,连接数据库。
(7)第64~71行实现了Close方法,关闭已经连接的数据库。
(8)第73~86行实现了GetDataSet方法,该方法接受一个SQL查询字符串SqlString,然后根据已经连接的数据库,返回查询结果数据集,详细实现技术,可参考【10.4.3】节介绍。