国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .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 文本文件。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 枣阳市| 临潭县| 阜平县| 呼伦贝尔市| 神池县| 仪陇县| 和平区| 樟树市| 合水县| 沿河| 隆安县| 卓尼县| 德钦县| 米林县| 景宁| 浪卡子县| 苍溪县| 建瓯市| 亳州市| 隆化县| 西充县| 北京市| 桂平市| 榆树市| 衡山县| 会宁县| 湘潭县| 巴中市| 玛纳斯县| 容城县| 贞丰县| 太白县| 烟台市| 金湖县| 原平市| 杭州市| 凤台县| 济阳县| 南宁市| 星子县| 深圳市|