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

基于.NET平台的分层架构实战(八)——数据访问层的第二种实现:SQLServer+存储过程

2011-03-26 21:34 781 查看
在上一篇(基于.NET平台的分层架构实战(七-外一篇)——对数据访问层第一种实现(Access+SQL)的重构)中,讨论了使用SQL构建数据访问层的方法,并且针对的是Access数据库。而这一篇中,将要创建一个针对SQLServer数据库的数据访问层,并且配合存储过程实现。

      曾经有朋友问我使用SQL和存储过程在效率上的差别,惭愧的是我对这方面没有研究,也没有实际做过测试。通过查阅资料,发现在一般情况下,存储过程的效率由于使用SQL,但是也不绝对,也发现有的朋友测试时发现在特定情况下SQL的效率优于存储过程,所以这个问题不能一概而论。

      好,废话不多说,这里先列出使用存储过程构建数据访问层的一般步骤:
      1.创建新工程
      2.创建数据库
      3.编写相应存储过程
      4.编写数据库辅助类
      5.实现数据访问层

创建新工程
      在开始所有开发工作前,我们需要在解决方案下新建一个工程,叫SQLServerDAL,用于存放所有SQLServer数据访问层的代码。

创建数据库
      首先,我们要根据前文设计的数据库,在SQLServer中创建相应的数据库及数据表。我使用的是SQLServer2005,使用企业管理器创建,创建方法不再赘述。

编写存储过程
      数据库创建完成后,我们就要编写存储过程了。由于数据访问层接口已经确定,所以需要哪些存储过程也很好确定。例如数据访问层接口中有一个添加管理员方法,那么就一定有一个存储过程实现这个功能。
      还是以管理员模块为例,经过简单分析,需要一下存储过程:

      插入管理员记录
      删除管理员记录
      更新管理员信息
      按ID取得管理员记录
      按用户名及密码取得管理员记录
      按用户名取得管理员记录
      取得全部管理员记录

      创建这些存储过程的SQL代码如下:

插入管理员记录

set ANSI_NULLS ON

set QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author:        <T2噬菌体>

-- Create date: <2008-07-04>

-- Description:    <插入管理员记录>

-- =============================================

CREATE PROCEDURE [dbo].[Pr_InsertAdmin]

(

    @Name Nvarchar(20),

    @Password Nvarchar(50)

)

AS

INSERT INTO TAdmin

(

    [Name],

    [Password]

)

VALUES

(

    @Name,

    @Password

)

复制代码
删除管理员记录

1set ANSI_NULLS ON

2set QUOTED_IDENTIFIER ON

3GO

4-- =============================================

5-- Author:        <T2噬菌体>

6-- Create date: <2008-07-04>

7-- Description:    <删除管理员记录>

8-- =============================================

9CREATE PROCEDURE [dbo].[Pr_DeleteAdmin]

10(

11    @ID Int

12)

13AS

14DELETE FROM TAdmin

15WHERE [ID]=@ID

复制代码
修改管理员信息

1set ANSI_NULLS ON

2set QUOTED_IDENTIFIER ON

3GO

4-- =============================================

5-- Author:        <T2噬菌体>

6-- Create date: <2008-07-04>

7-- Description:    <修改管理员记录>

8-- =============================================

9CREATE PROCEDURE [dbo].[Pr_UpdateAdmin]

10(

11    @ID Int,

12    @Name Nvarchar(20),

13    @Password Nvarchar(50)

14)

15AS

16UPDATE TAdmin

17SET

18[Name]=@Name,

19[Password]=@Password

20WHERE [ID]=@ID

复制代码
按ID取得管理员

1set ANSI_NULLS ON

2set QUOTED_IDENTIFIER ON

3GO

4-- =============================================

5-- Author:        <T2噬菌体>

6-- Create date: <2008-07-04>

7-- Description:    <按ID取得管理员信息>

8-- =============================================

9CREATE PROCEDURE [dbo].[Pr_GetAdminByID]

10(

11    @ID Int

12)

13AS

14SELECT * FROM TAdmin

15WHERE [ID]=@ID

复制代码
按用户名和密码取得管理员

1set ANSI_NULLS ON

2set QUOTED_IDENTIFIER ON

3GO

4-- =============================================

5-- Author:        <T2噬菌体>

6-- Create date: <2008-07-04>

7-- Description:    <按用户名及密码取得管理员信息>

8-- =============================================

9CREATE PROCEDURE [dbo].[Pr_GetAdminByNameAndPassword]

10(

11    @Name Nvarchar(20),

12    @Password Nvarchar(50)

13)

14AS

15SELECT * FROM TAdmin

16WHERE [Name]=@Name

17AND [Password]=@Password

复制代码
按用户名取得管理员

1set ANSI_NULLS ON

2set QUOTED_IDENTIFIER ON

3GO

4-- =============================================

5-- Author:        <T2噬菌体>

6-- Create date: <2008-07-04>

7-- Description:    <按用户名取得管理员信息>

8-- =============================================

9CREATE PROCEDURE [dbo].[Pr_GetAdminByName]

10(

11    @Name Nvarchar(20)

12)

13AS

14SELECT * FROM TAdmin

15WHERE [Name]=@Name

复制代码
取得全部管理员信息

1set ANSI_NULLS ON

2set QUOTED_IDENTIFIER ON

3GO

4-- =============================================

5-- Author:        <T2噬菌体>

6-- Create date: <2008-07-04>

7-- Description:    <取得全部管理员信息>

8-- =============================================

9CREATE PROCEDURE [dbo].[Pr_GetAllAdmin]

10AS

11SELECT * FROM TAdmin

复制代码
编写数据库辅助类
      由于访问数据库的代码很相似,这里我们仍需要编写一个数据库辅助类,来将常用代码封装起来,方便复用。虽然在这里只使用到了存储过程,但是为了扩展性考虑,这个数据库辅助类仍然包含了通过SQL访问数据库的方法。具体实现如下:

SQLServerDALHelper.cs:

SQLServerDALHelper

1using System;

2using System.Collections.Generic;

3using System.Configuration;

4using System.Data;

5using System.Data.SqlClient;

6

7namespace NGuestBook.SQLServerDAL

8{

9    /**//// <summary>

10    /// SQLServer数据库操作助手

11    /// </summary>

12    public sealed class SQLServerDALHelper

13    {

14        /**//// <summary>

15        /// 用于连接SQLServer数据库的连接字符串,存于Web.config中

16        /// </summary>

17        private static readonly string _sqlConnectionString = ConfigurationManager.AppSettings["SQLServerConnectionString"];

18

19        /**//// <summary>

20        /// 执行SQL命令,不返回任何值

21        /// </summary>

22        /// <param name="sql">SQL命令</param>

23        public static void ExecuteSQLNonQurey(string sql)

24        {

25            SqlConnection connection = new SqlConnection(_sqlConnectionString);

26            SqlCommand command = new SqlCommand(sql,connection);

27            connection.Open();

28            command.ExecuteNonQuery();

29            connection.Close();

30        }

31

32        /**//// <summary>

33        /// 执行SQL命令,并返回SqlDataReader

34        /// </summary>

35        /// <param name="sql">SQL命令</param>

36        /// <returns>包含查询结果的SqlDataReader</returns>

37        public static SqlDataReader ExecuteSQLReader(string sql)

38        {

39            SqlConnection connection = new SqlConnection(_sqlConnectionString);

40            SqlCommand command = new SqlCommand(sql, connection);

41            connection.Open();

42            SqlDataReader sqlReader = command.ExecuteReader();

43            //connection.Close();

44

45            return sqlReader;

46        }

47

48        /**//// <summary>

49        /// 执行存储过程,不返回任何值

50        /// </summary>

51        /// <param name="storedProcedureName">存储过程名</param>

52        /// <param name="parameters">参数</param>

53        public static void ExecuteProcedureNonQurey(string storedProcedureName,IDataParameter[] parameters)

54        {

55            SqlConnection connection = new SqlConnection(_sqlConnectionString);

56            SqlCommand command = new SqlCommand(storedProcedureName,connection);

57            command.CommandType = CommandType.StoredProcedure;

58            if (parameters != null)

59            {

60                foreach (SqlParameter parameter in parameters)

61                {

62                    command.Parameters.Add(parameter);

63                }

64            }

65            connection.Open();

66            command.ExecuteNonQuery();

67            connection.Close();

68        }

69

70        /**//// <summary>

71        /// 执行存储,并返回SqlDataReader

72        /// </summary>

73        /// <param name="storedProcedureName">存储过程名</param>

74        /// <param name="parameters">参数</param>

75        /// <returns>包含查询结果的SqlDataReader</returns>

76        public static SqlDataReader ExecuteProcedureReader(string storedProcedureName,IDataParameter[] parameters)

77        {

78            SqlConnection connection = new SqlConnection(_sqlConnectionString);

79            SqlCommand command = new SqlCommand(storedProcedureName,connection);

80            command.CommandType = CommandType.StoredProcedure;

81            if (parameters != null)

82            {

83                foreach (SqlParameter parameter in parameters)

84                {

85                    command.Parameters.Add(parameter);

86                }

87            }

88            connection.Open();

89            SqlDataReader sqlReader = command.ExecuteReader();

90            //connection.Close();

91

92            return sqlReader;

93        }

94    }

95}

复制代码
实现数据访问层
      最后仍以管理员模块为例,看一下具体数据访问层的实现。

AdminDAL.cs:

AdminDAL

  1using System;

  2using System.Collections.Generic;

  3using System.Text;

  4using System.Data;

  5using System.Data.SqlClient;

  6using NGuestBook.IDAL;

  7using NGuestBook.Entity;

  8

  9namespace NGuestBook.SQLServerDAL

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            SqlParameter[] parameters =

21                {

22                    new SqlParameter("@Name",SqlDbType.NVarChar),

23                    new SqlParameter("@Password",SqlDbType.NVarChar)

24                };

25            parameters[0].Value = admin.Name;

26            parameters[1].Value = admin.Password;

27            try

28            {

29                SQLServerDALHelper.ExecuteProcedureNonQurey("Pr_InsertAdmin", parameters);

30                return true;

31            }

32            catch

33            {

34                return false;

35            }

36        }

37

38        /**//// <summary>

39        /// 删除管理员

40        /// </summary>

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

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

43        public bool Delete(int id)

44        {

45            SqlParameter[] parameters =

46                {

47                    new SqlParameter("@ID",SqlDbType.Int)

48                };

49            parameters[0].Value = id;

50            try

51            {

52                SQLServerDALHelper.ExecuteProcedureNonQurey("Pr_DeleteAdmin", parameters);

53                return true;

54            }

55            catch

56            {

57                return false;

58            }

59        }

60

61        /**//// <summary>

62        /// 更新管理员信息

63        /// </summary>

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

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

66        public bool Update(AdminInfo admin)

67        {

68            SqlParameter[] parameters =

69                {

70                    new SqlParameter("@ID",SqlDbType.Int),

71                    new SqlParameter("@Name",SqlDbType.NVarChar),

72                    new SqlParameter("@Password",SqlDbType.NVarChar)

73                };

74            parameters[0].Value = admin.ID;

75            parameters[1].Value = admin.Name;

76            parameters[2].Value = admin.Password;

77            try

78            {

79                SQLServerDALHelper.ExecuteProcedureNonQurey("Pr_UpdateAdmin", parameters);

80                return true;

81            }

82            catch

83            {

84                return false;

85            }

86        }

87

88        /**//// <summary>

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

90        /// </summary>

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

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

93        public AdminInfo GetByID(int id)

94        {

95            SqlParameter[] parameters =

96                {

97                    new SqlParameter("@ID",SqlDbType.Int)

98                };

99            parameters[0].Value = id;

100            SqlDataReader dataReader = null;

101            try

102            {

103                dataReader = SQLServerDALHelper.ExecuteProcedureReader("GetAdminByID", parameters);

104                dataReader.Read();

105                AdminInfo admin = new AdminInfo();

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

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

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

109

110                return admin;

111            }

112            catch

113            {

114                return null;

115            }

116            finally

117            {

118                dataReader.Close();

119            }

120        }

121

122        /**//// <summary>

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

124        /// </summary>

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

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

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

128        public AdminInfo GetByNameAndPassword(string name, string password)

129        {

130            SqlParameter[] parameters =

131                {

132                    new SqlParameter("@Name",SqlDbType.NVarChar),

133                    new SqlParameter("@Password",SqlDbType.NVarChar)

134                };

135            parameters[0].Value = name;

136            parameters[1].Value = password;

137            SqlDataReader dataReader = null;

138            try

139            {

140                dataReader = SQLServerDALHelper.ExecuteProcedureReader("GetAdminByNameAndPassword", parameters);

141                dataReader.Read();

142                AdminInfo admin = new AdminInfo();

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            finally

154            {

155                dataReader.Close();

156            }

157        }

158

159        /**//// <summary>

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

161        /// </summary>

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

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

164        public AdminInfo GetByName(string name)

165        {

166            SqlParameter[] parameters =

167                {

168                    new SqlParameter("@Name",SqlDbType.NVarChar)

169                };

170            parameters[0].Value = name;

171            SqlDataReader dataReader = null;

172            try

173            {

174                dataReader = SQLServerDALHelper.ExecuteProcedureReader("GetAdminByName", parameters);

175                dataReader.Read();

176                AdminInfo admin = new AdminInfo();

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            finally

188            {

189                dataReader.Close();

190            }

191        }

192

193        /**//// <summary>

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

195        /// </summary>

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

197        public IList<AdminInfo> GetAll()

198        {

199            SqlDataReader dataReader = null;

200            try

201            {

202                dataReader = SQLServerDALHelper.ExecuteProcedureReader("GetAllAdmin", null);

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

204                while (dataReader.Read())

205                {

206                    AdminInfo admin = new AdminInfo();

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

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

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

210                    adminCollection.Add(admin);

211                }

212

213                return adminCollection;

214            }

215            catch

216            {

217                return null;

218            }

219            finally

220            {

221                dataReader.Close();

222            }

223        }

224    }

225}

复制代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐