频道栏目
读书频道 > 软件开发 > C# > 深入体验C#项目开发
2.5.2 数据库访问层设计
2013-03-27 14:41:08     我来说两句
收藏   我要投稿

本文所属图书 > 深入体验C#项目开发

C#是当今使用最为频繁的编程语言之一,一直在开发领域占据重要的地位。本书通过10个综合实例的实现过程,详细讲解了C#在实践项目中的综合运用过程。这些项目从作者的学生时代写起,到项目经理结束,一直贯穿于作...  立即去当当网订购

2005年12月10日,下午,出现阳光,什么是数据库访问层设计

数据库访问层我已经使用了多次,但是其具体是一个什么东西我还是不很明白。带着问题,我在网络中找到了答案:数据库访问层就是实现数据库访问。网络中检索到的信息如下。

数据库访问层:有时也称为是持久层,其功能主要是负责数据库的访问。简单的说法就是实现对数据表的 Select、Insert、Update、Delete的操作。如果要加入ORM的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化。

我编写了文件lei.cs,实现应用程序的数据库访问层。文件lei.cs的主要功能是,在ASPNETAJAXWeb. AjaxLeaveword空间内建立Message类,并实现对系统库中数据的处理。上述功能的实现流程如图2-7所示。


 

2005年12月15日,傍晚,数据访问的方式

数据库访问层是.NET框架的核心知识,建立合理的数据库访问层结构,可以提高系统的效率,并为后期维护带来极大的方便。通过实现数据的访问模式,可达到对物理数据库中的表、视图等的访问。应用程序对数据库的访问有以下3种方式。

(1) 事务脚本:存储过程。

(2)  ORM:对象-关系映射。

(3) 表模型:以物理数据表为基本单位进行访问,类似 .NET中的DataTable。

而我的想法是:在.NET中第三种方式更容易实现。因为表和视图有很多相似点,不同的是视图是只读的。通过表模型,可以很好地解决实现层和表现层的结合问题,并解决效率问题,这在大型站点中十分重要。

下面介绍文件lei.cs的具体实现流程。

1. 定义Message类

定义Message类的实现代码如下。

using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
namespace ASPNETAJAXWeb.AjaxLeaveword
{
 public class Message
 {
  public Message()
  {
  …
  }
}

2. 获取系统内留言信息

获取系统内留言信息即获取系统库内已存在的留言信息,其功能是由方法GetMessages()实现的。方法GetMessages()的具体实现流程如下。

(1) 从系统配置文件Web.config内获取数据库连接参数,并将其保存在connectionString内。

(2) 使用连接字符串创建con对象,实现数据库连接。

(3) 新建获取数据库留言数据的SQL查询语句。

(4) 创建获取数据的对象da。

(5) 打开数据库连接,获取查询数据。

(6) 将获取的查询结果保存在ds中,并返回ds。

上述功能的对应实现代码如下。

public DataSet GetMessages()
{ ///获取连接字符串
 string connectionString = ConfigurationManager.ConnectionStrings
  ["SQLCONNECTIONSTRING"].ConnectionString;
 ///创建连接
 SqlConnection con = new SqlConnection(connectionString);
 ///创建SQL语句
 string cmdText = "SELECT * FROM Message Order by CreateDate DESC";
 ///创建SqlDataAdapter
 SqlDataAdapter da = new SqlDataAdapter(cmdText,con);
 ///定义DataSet
 DataSet ds = new DataSet();
 try
 {   ///打开连接
  con.Open();
  ///填充数据
  da.Fill(ds,"DataTable");
 }
 catch(Exception ex)
 {   ///抛出异常
  throw new Exception(ex.Message,ex);
 }
 finally
 {   ///关闭连接
  con.Close();
 }
 return ds;
}

数据库的设计真的很重要,因为几乎所有的动态Web站点的内容都是基于数据库数据的,所以对数据库的操作应该充分考虑效率问题。在此告诉读者一个小小的建议,建议读者充分利用所在机器内存中缓存的ADO对象。

3. 添加系统留言信息

添加系统留言信息,即将新发布的留言信息添加到系统库中,此功能是由方法AddMessage(string title,string message,string ip,string email)实现的。方法AddMessage(string title,string message,string ip,string email)的具体实现流程如下。

(1) 从系统配置文件Web.config内获取数据库连接参数,并将其保存在connectionString内。

(2) 使用连接字符串创建con对象,实现数据库连接。

(3) 使用SQL添加语句,然后创建cmd对象准备插入操作。

(4) 打开数据库连接,执行新数据插入操作。

(5) 将数据插入操作所涉及的行数保存在result中。

(6) 插入成功则返回result值,失败则返回-1。

上述功能的对应实现代码如下。

public int AddMessage(string title,string message,string ip,string email)
{
 string connectionString = ConfigurationManager.ConnectionStrings
  ["SQLCONNECTIONSTRING"].ConnectionString;
 SqlConnection con = new SqlConnection(connectionString);
 ///创建SQL语句
 string cmdText = "INSERT INTO Message(Title,Message,IP,Email,CreateDate,
 Status)VALUES(@Title,@Message,@IP,@Email,GETDATE(),0)";
 SqlCommand cmd = new SqlCommand(cmdText,con);
 ///创建参数并赋值
 cmd.Parameters.Add("@Title",SqlDbType.VarChar,200);
 cmd.Parameters.Add("@Message",SqlDbType.Text);
 cmd.Parameters.Add("@Ip",SqlDbType.VarChar,20);
 cmd.Parameters.Add("@Email",SqlDbType.VarChar,255);
 cmd.Parameters[0].Value = title;
 cmd.Parameters[1].Value = message;
 cmd.Parameters[2].Value = ip;
 cmd.Parameters[3].Value = email;
 int result = -1;
 try
 {   ///打开连接
  con.Open();
  ///操作数据
  result = cmd.ExecuteNonQuery();
 }
 catch(Exception ex)
 {   ///抛出异常
  throw new Exception(ex.Message,ex);
 }
 finally
 {   ///关闭连接
  con.Close();
 }
 return result;
}

4. 删除系统留言信息

删除系统留言信息即将系统内存在的留言数据从系统库中删除,此功能是由方法DeleteMessage(int messageID)实现的。其具体实现流程如下。

(1) 从系统配置文件Web.config内获取数据库连接参数,并将其保存在connectionString内。

(2) 使用连接字符串创建con对象,实现数据库连接。

(3) 使用SQL删除语句,然后创建cmd对象准备删除操作。

(4) 打开数据库连接,执行新数据删除操作。

(5) 将数据删除操作所涉及的行数保存在result中。

(6) 删除成功则返回result值,失败则返回-1。

上述功能的对应实现代码如下。

public int DeleteMessage(int messageID)
{string connectionString = ConfigurationManager.ConnectionStrings
["SQLCONNECTIONSTRING"].ConnectionString;
 SqlConnection con = new SqlConnection(connectionString);
 ///创建SQL语句
 string cmdText = "DELETE Message WHERE ID = @ID";
 SqlCommand cmd = new SqlCommand(cmdText,con);
 ///创建参数并赋值
 cmd.Parameters.Add("@ID",SqlDbType.Int,4);
 cmd.Parameters[0].Value = messageID;
 int result = -1;
 try
 {   ///打开连接
  con.Open();
  ///操作数据
  result = cmd.ExecuteNonQuery();
 }
 catch(Exception ex)
 {   ///抛出异常
  throw new Exception(ex.Message,ex);
 }
 finally
 {   ///关闭连接
 con.Close();
 }
 return result;
}

5. 获取系统内留言回复信息

获取系统内留言回复信息即查询系统库内用户对留言的回复信息数据,此功能是由方法GetReplyByMessage(int messageID)实现的。其具体实现流程如下。

(1) 从系统配置文件Web.config内获取数据库连接参数,并将其保存在connectionString内。

(2) 使用连接字符串创建con对象,实现数据库连接。

(3) 新建查询数据库留言回复数据的SQL查询语句。

(4) 创建获取数据的对象da。

(5) 打开数据库连接,获取查询数据。

(6) 将获取的查询结果保存在ds中,并返回ds。

上述功能的对应实现代码如下。

public DataSet GetReplyByMessage(int messageID)
  {
   string connectionString = ConfigurationManager. ConnectionStrings
    ["SQLCONNECTIONSTRING"].ConnectionString;
   SqlConnection con = new SqlConnection(connectionString);
   ///创建SQL语句
   string cmdText = "SELECT * FROM Reply WHERE MessageID = @MessageID
   Order by CreateDate DESC";
   SqlDataAdapter da = new SqlDataAdapter(cmdText,con);
   ///创建参数并赋值
   da.SelectCommand.Parameters.Add("@MessageID",SqlDbType.Int,4);
   da.SelectCommand.Parameters[0].Value = messageID;
   ///定义DataSet
   DataSet ds = new DataSet();
   try
   {
    con.Open();
    ///填充数据
    da.Fill(ds,"DataTable");
   }
   catch(Exception ex)
   {
    throw new Exception(ex.Message,ex);
   }
   finally
   {   //关闭连接
    con.Close();
   }
   return ds;
  }

6. 添加留言回复信息

添加留言回复信息即将新发布的留言回复信息添加到系统库中,此功能是由方法AddReply(string message,string ip,int messageID)实现的。其具体实现流程如下。

(1) 从系统配置文件Web.config内获取数据库连接参数,并将其保存在connectionString内。

(2) 使用连接字符串创建con对象,实现数据库连接。

(3) 使用SQL添加语句,然后创建cmd对象准备插入操作。

(4) 打开数据库连接,执行新数据插入操作。

(5) 将数据插入操作所涉及的行数保存在result中。

(6) 插入成功则返回result值,失败则返回-1。

上述功能的对应实现代码如下。

public int AddReply(string message,string ip,int messageID)
  {
   string connectionString = ConfigurationManager.ConnectionStrings
    ["SQLCONNECTIONSTRING"].ConnectionString;
   SqlConnection con = new SqlConnection(connectionString);
   string cmdText = "INSERT INTO Reply(Reply,IP,CreateDate,
   MessageID)VALUES(@Reply,@IP,GETDATE(),@MessageID)";
   SqlCommand cmd = new SqlCommand(cmdText,con);
   ///创建参数并赋值
   cmd.Parameters.Add("@Reply",SqlDbType.VarChar,1000);
   cmd.Parameters.Add("@Ip",SqlDbType.VarChar,20);
   cmd.Parameters.Add("@MessageID",SqlDbType.Int,4);
   cmd.Parameters[0].Value = message;
   cmd.Parameters[1].Value = ip;
   cmd.Parameters[2].Value = messageID;
   int result = -1;
   try
   {   ///打开连接
    con.Open();
    ///操作数据
    result = cmd.ExecuteNonQuery();
   }
   catch(Exception ex)
   {   ///抛出异常
    throw new Exception(ex.Message,ex);
   }
   finally
   {   ///关闭连接
    con.Close();
   }
   return result;
  }
 }
}

在上述各处理方法中,使用了SQL的查询、添加和删除语句,对系统数据库内的数据进行了操作处理。在现实Web应用系统中,各类应用的数据库相关操作都是基于上述3种操作的。SQL语句是数据库技术的核心知识之一,读者可以通过在百度中检索“SQL教程”关键字来获取其相关知识。

2005年12月18日,晴空万里

今天完成了数据库访问层的编码工作,压力顿时减轻了许多,决定抽出一点时间做一个技术总结。在ASP.NET程序中,常把经常用到的设置性信息保存到数据库中,这些信息对于每一个访问用户都是相同的。若每一个用户访问时,都要去数据库里取出来,然后显示给用户,会加重数据库服务器负载,使之无法快速服务于更重要的事务处理。而且Web服务器也必须不停地创建ADO对象,从而消耗大量资源,导致当用户很多时几乎失去响应。如果能把一些常用信息事先存储在内存中,当用户访问时,直接从内存中取出,显示给用户,则可以大大减小系统的压力,提高响应速度。

在具体应用时,可以把已经取得了数据的RecordSet对象存储在Application变量中。当用户访问时,从Application变量中取得RecordSet对象,而不需再次建立数据库连接。也可以将RecordSet对象里的数据存储在数组中,然后再将数组存储在Application变量中,使用时用数组的方式读取。

另外,在此总结一下效率的问题。因为数据库技术是动态站点的基础,所以在Web程序内会有大量的查询语句。同时,随着站点访问量的增加,一个站点可能同时需要查询大量数据,所以数据库查询的效率问题便提上了日常议程。在此向读者提出如下两条建议。

(1) 合理使用索引。

并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量重复数据时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。读者可以通过在百度中检索“索引效率优化”关键字来获取相关知识。

(2) 使用存储过程。

存储过程是一个很好的工具,它不但提高了程序的安全性,而且也提高了数据处理效率。编写合理的语句可以决定存储过程和触发器的效率。

总结完毕之后,我决定早点休息,为接下来的具体编码阶段做准备。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:2.5.1 系统配置
下一篇:2.6 编码实现
相关文章
图文推荐
排行
热门
最新书评
文章
下载
读书
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站