作者: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 文本文件。
新聞熱點
疑難解答
圖片精選