仓酷云

标题: ASP.NET教程之编写数据库操纵类,使ASP.NET中的数据库... [打印本页]

作者: 活着的死人    时间: 2015-1-16 22:39
标题: ASP.NET教程之编写数据库操纵类,使ASP.NET中的数据库...
如果需要重新编写代码,几乎任何一门计算机语言都可以跨平台了,还用得着Java嘛,而且像PHP/C#等语言不需要修改代码都可以跨Windows/Linux。asp.net|数据|数据库Willmove
主页:http://www.amuhouse.com
E-mail:willmove@gmail.com
声明:系作者原创作品,转载请说明出处。
ASP.NET中一样平常都是利用SQLServer作为背景数据库。一样平常的ASP.NET数据库操纵示例程序都是利用独自的数据会见,就是说每一个页面都写毗连到数据库,存取数据,封闭数据库的代码。这类体例带来了一些坏处,一个就是假如你的数据库改动了,你必需一个页面一个页面的往变动数据库毗连代码。
第二个坏处就是代码冗余,良多代码都是反复的,不用要的。
因而,我试图经由过程一种分歧的数据库操纵类来完成ASP.NET种的数据会见。
我们就拿一样平常网站上城市有的旧事公布体系来做例子,它必要一个文章数据库,我们把这个数据库定名为News_Articles。旧事公布体系触及到公布旧事,展现文章,办理文章等。
一篇文章一样平常城市有题目,作者,宣布工夫,内容,别的我们必要把它们编号。我们把它写成一个类,叫Article类,代码以下:
//Article.cs
usingSystem;
namespaceNews_Articles.Data
{
///<summary>
///SummarydescriptionforArticle.
///</summary>
publicclassArticle
{
privateint_id;//文章编号
privatestring_author;//文章的作者
privatestring_topic;//文章的题目
privateDateTime_postTime;//文章的宣布工夫
privatestring_content;//文章内容
publicintID
{
get{return_id;}
set{_id=value;}
}
publicstringAuthor
{
get{return_author;}
set{_author=value;}
}
publicstringTopic
{
get{return_topic;}
set{_topic=value;}
}
publicstringContent
{
get{return_content;}
set{_content=value;}
}
publicDateTimePostTime
{
get{return_postTime;}
set{_postTime=value;}
}
}
}

然后我们写一个文章汇合类ArticleCollection
代码以下

程序代码
//ArticleCollection.cs
usingSystem;
usingSystem.Collections;
namespaceNews_Articles.Data
{
///<summary>
///文章的汇合类,承继于ArrayList
///</summary>
publicclassArticleCollection:ArrayList
{
publicArticleCollection():base()
{
}
publicArticleCollection(ICollectionc):base(c)
{
}
}
}


这个类相称于一个ASP.NET中的DataSet(实在二者很纷歧样),很复杂,次要的目标是把将良多篇文章汇合,以便在ASP.NET页面中给DataGrid大概DataList作为数据源,以显现文章。
如今我们能够完成对News_Articles数据库的操纵了,我说过,这是一个数据库操纵类。无妨定名为ArticleDb。完成以下:
程序代码
//ArticleDb.cs
usingSystem;
usingSystem.Configuration;
usingSystem.Data;
usingSystem.Data.SqlClient;
namespaceNews_Articles.Data
{
/**////<summary>
///数据库操纵类,完成文章数据库的读取,拔出,更新,删除
///</summary>
publicclassArticleDb
{
privateSqlConnection_conn;//SQLServer数据库毗连
privatestring_articledb="News_Articles";//SQLServer文章数据库表

/**////<summary>
///类的初始化,设置数据库毗连
///</summary>
publicArticleDb()
{
_conn=newSqlConnection(ConfigurationSettings.AppSettings["connectionString"]);
}
/**////<summary>
///翻开数据库毗连
///</summary>
publicvoidOpen()
{
if(_conn.State==ConnectionState.Closed)
_conn.Open();
}
/**////<summary>
///封闭数据库毗连
///</summary>
publicvoidClose()
{
if(_conn.State==ConnectionState.Open)
_conn.Close();
}
/**////<summary>
///读取数据库中一切的文章
///</summary>
///<returns>ArticleCollection</returns>
publicArticleCollectionGetArticles()
{
ArticleCollectionarticles=newArticleCollection();
stringsql="Select*FROM"+_articledb;
SqlCommandcmd=newSqlCommand(sql,_conn);
SqlDataReaderdr=cmd.ExecuteReader();
while(dr.Read())
{
Articleart=PopulateArticle(dr);
articles.Add(art);
}
dr.Close();
returnarticles;
}

/**////<summary>
///给定一个文章编号,读取数据库中的一篇文章
///</summary>
///<returns>Article</returns>
publicArticleGetArticle(intarticleId)
{
stringsql="Select*FROM"+_articledb+"WhereID="+articleId+"";
SqlCommandcmd=newSqlCommand(sql,_conn);
SqlDataReaderdr=cmd.ExecuteReader();
Articlearticle=PopulateArticle(dr);
dr.Close();
returnarticle;
}
/**////<summary>
///更新数据库纪录,注重必要设定文章的编号
///</summary>
///<paramname="article"></param>
publicvoidUpdateArticle(Articlearticle)
{
stringsql="Update"+_articledb+"SETTopic=@topic,Author=@author,Content=@content,PostTime=@postTime"
+"WhereID=@articleId";
SqlCommandcmd=newSqlCommand(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>
///<paramname="author"></param>
///<returns>ArticleCollection</returns>
publicArticleCollectionGetArticlesByAuthor(stringauthor)
{
stringsql="Select*FROM"+_articledb+"WhereAuthor="+author+"";
SqlCommandcmd=newSqlCommand(sql,_conn);
ArticleCollectionarticleCollection=newArticleCollection();
SqlDataReaderdr=cmd.ExecuteReader();
while(dr.Read())
{
Articlea=PopulateArticle(dr);
articleCollection.Add(a);
}
dr.Close();
returnarticleCollection;

}

/**////<summary>
///删除给定编号的一篇文章
///</summary>
///<paramname="articleID"></param>
publicvoidDeleteArticle(intarticleID)
{
stringsql="DeleteFROM"+_articledb+"WhereID="+articleID+"";
SqlCommandcmd=newSqlCommand(sql,_conn);
cmd.ExecuteNonQuery();
}

/**////<summary>
///经由过程SqlDataReader天生文章工具
///</summary>
///<paramname="dr"></param>
///<returns></returns>
privateArticlePopulateArticle(SqlDataReaderdr)
{
Articleart=newArticle();
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"]);
returnart;
}
/**////<summary>
///增添一篇文章到数据库中,前往文章的编号
///</summary>
///<paramname="article"></param>
///<returns>方才拔出的文章的编号</returns>
publicintAddPost(Articlearticle)
{
stringsql="InsertINTO"+_articledb+"(Author,Topic,Content,PostTime)"+
"VALUES(@author,@topic,@content,@postTime)"+
"Select@postID=@@IDENTITY";
SqlCommandcmd=newSqlCommand(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;
returnarticle.ID;

}
}
}
基础的框架已出来了。假如我们要在一个ASP.NET页面中显现文章数据库News_Artices的数据,那末仅仅必要增加一个DataGrid大概DataList,然后绑定命据源。比方
在Default.aspx中增加一个DataGrid,定名为ArticlesDataGrid,在背景代码Default.aspx.cs中增加
程序代码
usingNews_Articles.Data;

并在Page_Load中增加以下的代码:

程序代码
privatevoidPage_Load(objectsender,System.EventArgse)
{
//Putusercodetoinitializethepagehere
ArticleDbmyArticleDb=newArticleDb();
myArticleDb.Open();
ArticleCollectionarticles=myArticleDb.GetArticles();
this.ArticlesDataGrid.DataSource=articles;
if(!Page.IsPostBack)
{
this.ArticlesDataGrid.DataBind();
}
myArticleDb.Close();
}

如许就能够完成读取文章数据库中一切文章。
假如必要删除一篇文章那末增加以下代码:
程序代码
//删除编号为1的文章
myArticleDb.DeleteArticle(1);
拔出一篇文章,代码以下:

程序代码
//拔出一篇新的文章,不必要指定文章编号,文章编号拔出乐成后由SQLServer前往。
ArticlenewArticle=newArticle();
newArticle.Author="Willmove";
newArticle.Topic="测试拔出一篇新的文章";
newArticle.Content="这是我写的文章的内容";
newArticle.PostTime=DateTime.Now;
intarticleId=myArticleDb.AddPost(newArticle);

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

程序代码
//更新一篇文章,注重必要指定文章的编号
ArticleupdateArticle=newArticle();
updateArticle.ID=3;//注重必要指定文章的编号
updateArticle.Author="Willmove";
updateArticle.Topic="测试更新数据";
updateArticle.Content="这是我更新的文章的内容";
updateArticle.PostTime=DateTime.Now;
myArticleDb.UpdateArticle(updateArticle);

以上只是一个框架,详细的完成另有良多细节没有列出来。可是基于下面的框架,你能够对照便利的写出对数据库操纵的代码。别的一个倡议就是把下面的数据库会见的SQL语句写成数据库存储历程,好比增加一篇文章:
程序代码
CreatePROCEDUREAddPost
(
@IDintOUTPUT,
@Authornvarchar(100),
@Topicnvarchar(100),
@Contentntext,
@PostTimedatetime
)
AS
InsertINTONews_Articles(Author,Topic,Content,PostTime)VALUES(@Author,@Topic,@Content,@PostTime);
Select@ID=@@IDENTITY
GO

附1:News_Articles数据库的字段

程序代码
字段名形貌数据范例长度是不是可为空
ID文章编号int4否
Topic文章题目nvarchar100否
Author作者nvarchar100是
Content文章内容ntext16否
PostTime宣布工夫datetime8否
个中PostTime的默许值能够设置为(getutcdate())
SQL语句是
CreateTABLE[News_Articles](
[ID][int]IDENTITY(1,1)NOTNULL,
[Topic][nvarchar](100)COLLATEChinese_PRC_CI_ASNOTNULL,
[Author][nvarchar](100)COLLATEChinese_PRC_CI_ASNULL,
[Content][ntext]COLLATEChinese_PRC_CI_ASNOTNULL,
[PostTime][datetime]NOTNULLCONSTRAINT[DF_News_Articles_PostTime]DEFAULT(getutcdate())
)ON[PRIMARY]TEXTIMAGE_ON[PRIMARY]
GO
附2:News_Articles项目源代码
申明:翻开项目文件News_Articles.csproj之前必要先设置假造路径News_Articles,大概在News_Articles.csproj.webinfo中变动设置。要一般运转还必需安装有SQLServer而且安装了文章数据库News_Articles。项目源代码的根目次下有SQL文本文件。
2003年中微软发布最新版本的ASP.netWebMatrix,对于我们喜欢用Asp.net来编程的朋友实在是个好消息,我也实实在在的将Asp.net更深入的研究了一下,以方便我以后更好的运用它,同时我也讲讲使用它的感受。
作者: 金色的骷髅    时间: 2015-1-19 20:31
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。
作者: 莫相离    时间: 2015-1-25 20:29
由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。
作者: 因胸联盟    时间: 2015-2-3 21:13
是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。
作者: 海妖    时间: 2015-2-9 05:11
代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。
作者: 活着的死人    时间: 2015-3-8 18:49
弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
作者: 柔情似水    时间: 2015-3-16 11:39
最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
作者: 山那边是海    时间: 2015-3-22 22:48
但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2