首页 > 编程 > .NET > 正文

编写数据库操作类,使ASP.NET中的数据库操作变得简单

2024-07-10 13:10:43
字体:
来源:转载
供稿:网友

作者:willmove
主页:http://www.amuhouse.com
e-mail: [email protected]
声明:系作者原创作品,转载请注明出处。

asp.net中一般都是使用sql server作为后台数据库。一般的asp.net数据库操作示例程序都是使用单独的数据访问,就是说每个页面都写连接到数据库,存取数据,关闭数据库的代码。这种方式带来了一些弊端,一个就是如果你的数据库改变了,你必须一个页面一个页面的去更改数据库连接代码。
第二个弊端就是代码冗余,很多代码都是重复的,不必要的。
因此,我试图通过一种一致的数据库操作类来实现asp.net种的数据访问。

我们就拿一般网站上都会有的新闻发布系统来做例子,它需要一个文章数据库,我们把这个数据库命名为 news_articles。新闻发布系统涉及到 发布新闻,展示文章,管理文章等。

一篇文章一般都会有标题,作者,发表时间,内容,另外我们需要把它们编号。我们把它写成一个类,叫 article 类,代码如下:

//article.cs
using system;

namespace news_articles.data
{
 /// <summary>
 /// summary description for article.
 /// </summary>
 public class article
 {
  private int _id;   //文章编号
  private string _author;  //文章的作者
  private string _topic;  //文章的标题
  private datetime _posttime;  //文章的发表时间
  private string _content;  //文章内容

  public int id
  {
   get { return _id;}
   set { _id = value;}
  }
  public string author
  {
   get { return _author; }
   set { _author = value; }
  }
  public string topic
  {
   get { return _topic; }
   set { _topic = value; }
  }
  public string content
  {
   get { return _content; }
   set { _content = value; }
  }
  public datetime posttime
  {
   get { return _posttime; }
   set { _posttime = value; }
  }
 }
}


然后我们写一个文章集合类 articlecollection
代码如下


 程序代码

//articlecollection.cs
using system;
using system.collections;

namespace news_articles.data
{
 /// <summary>
 /// 文章的集合类,继承于 arraylist
 /// </summary>
 public class articlecollection : arraylist
 {
  public articlecollection() : base()
  {
  }

  public articlecollection(icollection c) : base(c)
  {
  }
 }
}


这个类相当于一个asp.net中的dataset(其实两者很不一样),很简单,主要的目的是把将很多篇文章集合,以便在asp.net页面中给datagrid或者datalist作为数据源,以显示文章。

现在我们可以实现对news_articles数据库的操作了,我说过,这是一个数据库操作类。不妨命名为 articledb。实现如下:

 程序代码

//articledb.cs
using system;
using system.configuration;
using system.data;
using system.data.sqlclient;

namespace news_articles.data
{
 /**//// <summary>
 /// 数据库操作类,实现文章数据库的读取,插入,更新,删除
 /// </summary>
 public class articledb
 {
  private sqlconnection _conn;       //sql server 数据库连接
  private string   _articledb = "news_articles"; //sql server 文章数据库表
 
  /**//// <summary>
  /// 类的初始化,设置数据库连接
  /// </summary>
  public articledb()
  {
   _conn = new sqlconnection(configurationsettings.appsettings["connectionstring"]);
  }

  /**//// <summary>
  /// 打开数据库连接
  /// </summary>
  public void open()
  {
   if(_conn.state == connectionstate.closed)
    _conn.open();
  }

  /**//// <summary>
  /// 关闭数据库连接
  /// </summary>
  public void close()
  {
   if(_conn.state == connectionstate.open)
    _conn.close();
  }

  /**//// <summary>
  /// 读取数据库中所有的 文章
  /// </summary>
  /// <returns>articlecollection</returns>
  public articlecollection getarticles()
  {
   articlecollection articles = new articlecollection();
   string sql = "select * from " + _articledb;
   sqlcommand cmd = new sqlcommand(sql,_conn);
   sqldatareader dr = cmd.executereader();
   while(dr.read())
   {
    article art = populatearticle(dr);
    articles.add(art);
   }
   dr.close();
   return articles;
  }


  /**//// <summary>
  /// 给定一个文章编号, 读取数据库中的一篇文章
  /// </summary>
  /// <returns>article</returns>
  public article getarticle(int articleid)
  {
   string sql = "select * from " + _articledb + "where id='" + articleid + "'";
   sqlcommand cmd = new sqlcommand(sql,_conn);
   sqldatareader dr = cmd.executereader();
   article article = populatearticle(dr);
   dr.close();
   return article;
  }

  /**//// <summary>
  /// 更新数据库记录,注意需要设定文章的编号
  /// </summary>
  /// <param name="article"></param>
  public void updatearticle(article article)
  {
   string sql = "update " + _articledb +" set [email protected],[email protected],[email protected],[email protected]"
    + " where id = @articleid";
   sqlcommand cmd = new sqlcommand(sql,_conn);

   cmd.parameters.add("@articleid",sqldbtype.int,4).value  = article.id;
   cmd.parameters.add("@topic",sqldbtype.nvarchar,100).value = article.topic;
   cmd.parameters.add("@author",sqldbtype.nvarchar,100).value = article.author;
   cmd.parameters.add("@content",sqldbtype.ntext).value  = article.content;
   cmd.parameters.add("@posttime",sqldbtype.datetime).value = article.posttime;

   cmd.executenonquery();

  }


  /**//// <summary>
  /// 取出数据库中特定作者发表的文章
  /// </summary>
  /// <param name="author"></param>
  /// <returns>articlecollection</returns>
  public articlecollection getarticlesbyauthor(string author)
  {
   string sql = "select * from " + _articledb +" where author='" + author + "'";
   sqlcommand cmd = new sqlcommand(sql, _conn);

   articlecollection articlecollection = new articlecollection();

   sqldatareader dr = cmd.executereader();

   while (dr.read())
   {
    article a = populatearticle(dr);
    articlecollection.add(a);
   }
   dr.close(); 
   return articlecollection;
  
  }


  /**//// <summary>
  /// 删除给定编号的一篇文章
  /// </summary>
  /// <param name="articleid"></param>
  public void deletearticle(int articleid)
  {
   string sql = "delete from " + _articledb + " where id='" + articleid + "'";
   sqlcommand cmd = new sqlcommand(sql, _conn);
   cmd.executenonquery();
  }

 


  /**//// <summary>
  /// 通过 sqldatareader 生成文章对象
  /// </summary>
  /// <param name="dr"></param>
  /// <returns></returns>
  private article populatearticle(sqldatareader dr)
  {
   article art = new article();

   art.id  = convert.toint32(dr["id"]);
   art.author = convert.tostring(dr["author"]);
   art.topic = convert.tostring(dr["topic"]);

   art.content = convert.tostring(dr["content"]);
   art.posttime= convert.todatetime(dr["posttime"]);

   return art;
  }

 

  /**//// <summary>
  /// 增加一篇文章到数据库中,返回文章的编号
  /// </summary>
  /// <param name="article"></param>
  /// <returns>刚刚插入的文章的编号</returns>
  public int addpost(article article)
  { 
   string sql = "insert into " + _articledb +"(author,topic,content,posttime)"+
    "values(@author, @topic, @content, @posttime) "+
    "select @postid = @@identity";
   sqlcommand cmd = new sqlcommand(sql,_conn);
   cmd.parameters.add("@postid",sqldbtype.int,4);
   cmd.parameters["@postid"].direction = parameterdirection.output;

   cmd.parameters.add("@author",sqldbtype.nvarchar,100).value = article.author;
   cmd.parameters.add("@topic",sqldbtype.nvarchar,400).value = article.topic;
   cmd.parameters.add("@content",sqldbtype.text).value   = article.content;
   cmd.parameters.add("@posttime",sqldbtype.datetime).value = article.posttime;
 
   cmd.executenonquery();

   article.id = (int)cmd.parameters["@postid"].value;
   return article.id;
  
  }
 }
}

 

基本的框架已经出来了。如果我们要在一个asp.net页面中显示文章数据库 news_artices的数据,那么仅仅需要添加一个 datagrid 或者 datalist,然后绑定数据源。例如
在 default.aspx 中添加一个 datagrid ,命名为 articlesdatagrid,在 后台代码 default.aspx.cs 中添加

 程序代码
using news_articles.data;


并在 page_load 中添加如下的代码:


 程序代码
private void page_load(object sender, system.eventargs e)
{
 // put user code to initialize the page here
 articledb myarticledb = new articledb();
 myarticledb.open();
 articlecollection articles = myarticledb.getarticles();
 this.articlesdatagrid.datasource = articles;
 if(!page.ispostback)
 {
  this.articlesdatagrid.databind();
 }

 myarticledb.close();
}


这样就可以实现读取文章数据库中所有文章。
如果需要删除一篇文章那么添加如下代码:

 程序代码

 //删除编号为 1 的文章
 myarticledb.deletearticle(1);

插入一篇文章,代码如下:


 程序代码
  //插入一篇新的文章,不需要指定文章编号,文章编号插入成功后由sql server返回。
 article newarticle  = new article();
 newarticle.author  = "willmove";
 newarticle.topic  = "测试插入一篇新的文章";
 newarticle.content  = "这是我写的文章的内容";
 newarticle.posttime = datetime.now;
 int articleid = myarticledb.addpost(newarticle);


更新一篇文章,代码如下:
 

 程序代码
  //更新一篇文章,注意需要指定文章的编号
 article updatearticle  = new article();
 updatearticle.id = 3; //注意需要指定文章的编号
 updatearticle.author  = "willmove";
 updatearticle.topic  = "测试更新数据";
 updatearticle.content  = "这是我更新的文章的内容";
 updatearticle.posttime = datetime.now;
 myarticledb.updatearticle(updatearticle);


以上只是一个框架,具体的实现还有很多细节没有列出来。但是基于上面的框架,你可以比较方便的写出对数据库操作的代码。另外一个建议就是把上面的数据库访问的 sql 语句写成数据库存储过程,比如 添加一篇文章:

 程序代码
create procedure addpost
(
 @id  int output,
 @author nvarchar(100),
 @topic nvarchar(100),
 @content ntext,
 @posttime datetime
)
as
insert into news_articles(author, topic, content, posttime) values (@author, @topic, @content, @posttime);
 select @id = @@identity
go


附1:news_articles 数据库的字段


 程序代码

字段名 描述 数据类型 长度 是否可为空
id 文章编号 int  4 否
topic 文章标题 nvarchar 100  否
author 作者 nvarchar 100 是
content 文章内容 ntext 16 否
posttime 发表时间 datetime 8 否

其中 posttime 的默认值可以设置为(getutcdate())

sql 语句是

  create table [news_articles] (
 [id] [int] identity (1, 1) not null ,
 [topic] [nvarchar] (100) collate chinese_prc_ci_as not null ,
 [author] [nvarchar] (100) collate chinese_prc_ci_as null ,
 [content] [ntext] collate chinese_prc_ci_as not null ,
 [posttime] [datetime] not null constraint [df_news_articles_posttime] default (getutcdate())
) on [primary] textimage_on [primary]
go

附2:news_articles 项目源代码
说明:打开项目文件 news_articles.csproj 之前需要先设置 虚拟路径 news_articles,或者在 news_articles.csproj.webinfo 中更改设置。要正常运行还必须安装有sql server 并且安装了文章数据库 news_articles。项目源代码的根目录下有 sql 文本文件。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表