飘飘悠悠 发表于 2015-1-16 22:39:45

ASP.NET网页编程之使ASP.NET中的数据库操纵变得复杂

在经过全球个人PC市场占有90%的微软对asp.net不断优化与整合后,asp.net与微软自身平台的动用上更加的高效,加上asp.net在应用上非常容易上手,相信asp.net仍会是最多客户选用的脚本语言,并会在未来几年继续领跑。asp.net|数据|数据库<P>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
{
///
///SummarydescriptionforArticle.
///
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
{
///
///文章的汇合类,承继于ArrayList
///
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
{
/**////
///数据库操纵类,完成文章数据库的读取,拔出,更新,删除
///
publicclassArticleDb
{
privateSqlConnection_conn;//SQLServer数据库毗连
privatestring_articledb="News_Articles";//SQLServer文章数据库表

/**////
///类的初始化,设置数据库毗连
///
publicArticleDb()
{
_conn=newSqlConnection(ConfigurationSettings.AppSettings["connectionString"]);
}

/**////
///翻开数据库毗连
///
publicvoidOpen()
{
if(_conn.State==ConnectionState.Closed)
_conn.Open();
}

/**////
///封闭数据库毗连
///
publicvoidClose()
{
if(_conn.State==ConnectionState.Open)
_conn.Close();
}

/**////
///读取数据库中一切的文章
///
///ArticleCollection
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;
}

<P>/**////
///给定一个文章编号,读取数据库中的一篇文章
///
///Article
publicArticleGetArticle(intarticleId)
{
stringsql="Select*FROM"+_articledb+"WhereID="+articleId+"";
SqlCommandcmd=newSqlCommand(sql,_conn);
SqlDataReaderdr=cmd.ExecuteReader();
Articlearticle=PopulateArticle(dr);
dr.Close();
returnarticle;
}

/**////
///更新数据库纪录,注重必要设定文章的编号
///
///
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();

}


/**////
///掏出数据库中特定作者宣布的文章
///
///
///ArticleCollection
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;

}


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




/**////
///经由过程SqlDataReader天生文章工具
///
///
///
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;
}



/**////
///增添一篇文章到数据库中,前往文章的编号
///
///
///方才拔出的文章的编号
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(
IDENTITY(1,1)NOTNULL,
(100)COLLATEChinese_PRC_CI_ASNOTNULL,
(100)COLLATEChinese_PRC_CI_ASNULL,
COLLATEChinese_PRC_CI_ASNOTNULL,
NOTNULLCONSTRAINTDEFAULT(getutcdate())
)ONTEXTIMAGE_ON
GO


附2:News_Articles项目源代码
申明:翻开项目文件News_Articles.csproj之前必要先设置假造路径News_Articles,大概在News_Articles.csproj.webinfo中变动设置。要一般运转还必需安装有SQLServer而且安装了文章数据库News_Articles。项目源代码的根目次下有SQL文本文件。
不可能天天有学习.net),我一同学说,你应该早就有作品啦。我惶惶然……

admin 发表于 2015-1-17 06:51:57

但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。

再见西城 发表于 2015-1-20 14:41:37

JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。

莫相离 发表于 2015-1-29 09:49:12

可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。

若相依 发表于 2015-2-6 00:18:58

有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。

飘灵儿 发表于 2015-2-14 14:32:23

asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!

若天明 发表于 2015-3-4 07:10:06

是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。

精灵巫婆 发表于 2015-3-11 17:52:07

HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.

谁可相欹 发表于 2015-3-19 04:50:54

ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。

灵魂腐蚀 发表于 2015-3-27 08:09:24

平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。
页: [1]
查看完整版本: ASP.NET网页编程之使ASP.NET中的数据库操纵变得复杂