作者:willmove
主页:http://www.amuhouse.com
e-mail: willmove@gmail.com
声明:系作者原创作品,转载请注明出处。
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[color=#0000ff];
using system.collections;
namespace news_articles.data
{
/// <summary>
/// 文章的集合类,继承于 arraylist
/// </summary>
public class articlecollection : arraylist
{
public articlecollection() : base()
{
}
public articlecollection(icollection c) : base(c)
{
}
}
}[/color]
这个类相当于一个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 topic=@topic,author=@author,content=@content,posttime=@posttime”
+ ” 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 文本文件。