亲密接触ASP.Net(1-14)—-站长强烈推荐
- .Net编程
- 2005-08-21
- 6热度
- 0评论
《 亲密接触ASP.Net(1) 》
首先我得申明,本教程适用于有一定网络编程经验的人,比如asp,php,cgi,jsp开发者,如果你对网络编程一点也不了解,那么您还是先去学学其它的语言,不然以下的文章您会有很多看不懂的地方。呵呵。
我们开始吧。
ASP+的运行环境
我们要学习ASP+,就先得搞一个调试环境出来。让你的"爱鸡"支持asp+,那么您需要以下的条件:
Windows 2000 Professional, Windows 2000 Server , Windows 2000 Advanced Server
NGWS
IE 5.5
以上是支持ASP+的需要,大家看到目前只有Windows 2000才有安装NGWS的可能,NT,Windows 98,Windows Me 暂时还没有办法支持asp+,不会老盖答应我们在以后的版本中会在其它的平台上支持asp+的,大家慢慢等吧。而且还不是所有的window 2000都可以,windows 2000的版本号要是RC 3618以上的才行(这是本人写这篇文章时的情况,现在连win98都可以了)。飞刀我以前就是windows 2000的版本太低,不得不放弃正版,买了D版(全是ASP+惹的祸)。
NGWS是个大块头,有111M之巨,飞刀兄弟我的小猫跑了5个小时才把它搞定,它的下载地址是http://download.microsoft.com/download/VisualStudioNET/Install/2204/NT5/EN-US/setup.exe 幸得M$有钱,下载站点的带宽还大,下载速度还可以咯。大家慢慢来吧。
IE 5.5 是上面最好搞定的东东了。这个东西现在已经是泛滥了:),D版的不少,呵呵,不能称D版,它本身就是免费的:)
ASP+与ASP的比较
说起ASP+的好处,那就很多了。我们这里举几个最明显的。
速度,ASP+是编译后执行的,也就是说当aspx文件第一次被请求时被编译,以后的请求就不需要重新编译了。而ASP是解释性脚本语言,每次都需要重新编译,这种原因,其速度就无法和ASP+来比了。不过ASP+的编译速度也够慢的,在本地机上调试,第一次执行的速度是很慢的。不过以后就很快了,第一次执行的任务就交给管理员去做吧。我们就去享受以后的高速度吧:)
功能,ASP+的功能是无比强大的,几乎能做我们在网络能想到的事情,呵呵,举个简单的例子,那就是文件的上传,在ASP的时代,这个问题只能通过组件才行,但是在ASP+中只需要以下的代码就可以了。下面是一个例子:
< html>
< head>
< script language="C#" runat="server">
void Button1_Click(object Source, EventArgs e) {
if (Text1.Value == "") {
Span1.InnerHtml = "Error: you must enter a file name";
return;
}
if (File1.PostedFile != null) {
try {
File1.PostedFile.SaveAs("c:\\temp\\"+Text1.Value);
Span1.InnerHtml = "File uploaded successfully to c:\\temp\\"+Text1.Value+" on the web server";
}
catch (Exception exc) {
Span1.InnerHtml = "Error saving file c:\\temp\\"+Text1.Value+"
"+ exc.ToString();
}
}
}
< /head>
< body>
HtmlInputFile Sample
< form enctype="multipart/form-data" runat="server">
Select File to Upload:
Save as filename (no path): < input id="Text1" type="text" runat="server">
< span id=Span1 style="font: 8pt verdana;" runat="server" />
< input type=button id="Button1" value="Upload" OnServerClick="Button1_Click" runat="server">
< /form>
< /body>
< /html>
相信大家都能看懂上面的程序,不是太难。看看用ASP+上传文件就是这么简单,根本就不需要什么组件了,呵呵,只可怜飞刀我写了半天的"aspcnUP上传组件",一片心血就被M$给搞完了。我们的组件也要下岗了,唉,可悲啊。(飞刀悲情地唱起"风萧萧兮,易水寒,壮士一去不复返......")
ASP+能做的事远不止如此,这里只是举个小例子,它的更多功能我们以后再去介绍,呵呵。
ASP+还有一大优点就是结构化编程,他的程序语言可以自已任意加,目前支持C#,VB,JavaScript,呵呵,大家是不是对不支持VBScript感到失望 ?!:)这是大势所趋,大家也不必失望啦,我以后的文章的例程都会用C#去写,呵呵,如果你钟情于VB,你也可以看看本站一篇关于VB与C#语法比较的文章,很容易上手的。对于C#,大家可能比较陌生,不过我们看看上面的程序,发现他还是有很多地方是我们容易上手的。我个人认为它是C++与VB与Java的结合体,也可能是M$宣战Java的第一步,大家用多了就会觉得他好处多:)
写ASP+程序,你会觉得是在写VB或者是VC,很多的思想全都来自于VB,VC,可能是M$.NET的原因吧。所以我们写程序的思维需要改变,要让你自已感觉这是在写软件,不是在写传统的asp程序。
至于ASP+还有的一些功能,我们站点以前的文章也介绍了,呵呵,大家查查,我们以后也会通过程序去了解,只可惜,我们服务商的服务器不能使用asp+,否则我们会更多了解的asp+的特性。
另外一个大家关心的问题就是,装有NGWS的Windows 2000是否还支持asp,担心我们有了aspx,就没有了asp,以前的程序就全玩完了。这个问题大家根本不用担心,NGWS设计时M$就考虑过,NGWS同样可以解析asp,文件的扩展名是.asp,那就使用asp的方法解析,如果是.aspx就使用asp+来解析,所以您以前的asp是不会报销的。哈哈,大家可以放心啦。飞刀的机器上就是这样的咯。aspx,asp都可以用:) [NextPage]
《 亲密接触ASP.Net(2) 》
上一节 ,我们简单介绍了ASP+的配制环境,我们这一节来谈谈ASP+的语法.其实当你装好NGWS后,他所带的文档是最好的学习ASP+的教程,要你E文足够好,以及很好的耐性,学习ASP+不是难事啦.我们这些家伙也是从这里学了很多的,这篇关于ASP+语法的文章,大多数也来自于M$的原文,最可惜的就是我们的服务器不能装上NGWS,有些例子,大家不能看到执行结果,不太好。不过有些地方,我会把执行结果显示出来的。我们开始这一节吧:)
一个ASP+页面的后缀名是".ASPX".它能够包含八种不同的语法标置元素.我们将在这篇文章中介绍这几种不同的语法,并且举出一个例子来显示它的用法。
< % %> 与 < %= %>
用过asp吗,用过,那么大家就不会对这个标签陌生了。呵呵,下面是一个简单的例子。他执行后的结果我想我不写不出来,大家也都知道啦。这个就不多谈了,呵呵.
< % for (int i=0; i<8; i++)
{
%>
Hello World!
< % } %>
上面的例子中< % %>之间的程序将会被执行,并显示出的结果,< %="Hello World" %>就等于< % Response.Write ("Hello World") %>
注意:在C#中,是以分号(;)做为分隔符,但是我们要注意一些事情。
C# code
< % Response.Write("Hello World"); %> 这里的分号是必须的
< %="Hello World"; %> 这样写会有一些小问题就是,显示的结果是 "Response.Write("Hello World";);"
正确
声明代码的语法: < % ... number = subtract(number, 1); ... %>
重要问题:ASP+不像ASP,在ASP中所能的函数得在区域中声明,但是在ASP+中所有函数和变量都必须在区域中声明。否则,aspx编译时会出现错误.
ASP+ 服务器端控件语法
服务器上的控件使用开发者能够动态产生HTML页面,并发送给客户(如Netscape和IE所产生的JavaScript是不同的。还有普通浏览器和WAP浏览所收到的页面也是不同的).他们对象的声明也是运用了标签。但是他们和其它的标签是不同的。因为他们包含有一个"runat=server"属性。(呵呵,这个属性我们在ASP中也用过,不过功能就...)。下面的例子演示了控件的使用方法。
< html>
< script language="C#" runat=server>
void Page_Load(Object sender, EventArgs e) {
Message.Text = "Welcome to ASP+";
}
< /script>
< body>
< asp:label id="Message" font-size=24 runat=server/>
< /body>
< /html>
上面的源代码中我们加入ID为 "Message":
< asp:label id="Message" font-size=24 runat="server"/>
看了上面的代码,是不是发现我们在写VB程序,呵呵,先搭好骨架,然后再一个个的去编写他们事件处理。这就是M$给我们的新概念.
ASP+ Html 服务器控件语法
HTML服务器控件,使开发者程序化的操作HTML元素。一个HTML服务器控件只是比普通HTML元素多了一个"runat=server"属性。下面的例子具体演示了HTML服务控件的用法。
< script language="C#" runat=server>
void Page_Load(Object sender, EventArgs e) {
Message.InnerHtml = "Welcome to ASP+";
}
< /script>
...
< span id="Message" style="font-size:24" runat=server/>
他执行的结果和第一个程序的结果是一样的
数据捆绑(Databinding)语法 < %# %>
数据捆绑技术使得ASP+开发者能够很形像地把控件的属性与数据容器的值联系起来.在 < %#%>这个区域内的代码只有在"DataBind"方法调用后才会被执行。下面的例子就演示了它的用法。
Here is a value:
通过这种方法使得名为"MyList"的控件程序化,这时就该调用DataBind()方法了。
void Page_Load(Object sender, EventArgs e)
{ ArrayList items = new ArrayList();
items.Add("One");
items.Add("Two");
items.Add("Three");
MyList.DataSource = items;
MyList.DataBind();
}
Object标签语法: < object runat="server" />
Object标签语法使得开发者能够使用就基本的标签就能声明和示例一个对象。如下:
< object id="items" class="System.Collections.ArrayList" runat="server"/>
这个对象会在运行时自动建立,而且名字为items
void Page_Load(Object sender, EventArgs e) {
items.Add("One");
items.Add("Two");
items.Add("Three");
...
}
注释语法:
注释能使开发者阻止代码(包括控件)的执行或引用。下面的例子演示了这个语法的应用.
< %--
< asp:calendar id="MyCal" runat=server/>
< % for (int i=0; i<45; i++) { %>
Hello World
< % } %>
--%>
SSI 语法: <-- #Include File="Locaton.inc" -->
写过最基本的HTML的兄弟对他不会陌生,所以也不想多讲啦:)
< !-- #Include File="Header.inc" -->
...
< !-- #Include File="Footer.inc" -->
下面的一节,我们将来具体看看HTML控件和用户控件 [NextPage]
亲密接触ASP.NET(3) 》
最近有朋友问我,哪里可以学好ASP+,我早就说过NGWS中带的文档是最好的学习手册,不过由于NGWS的要求太高,还有它的大小(110M)的问题,有一部分兄弟,不能装上它,我给你们一个站点http://www.aspnextgen.com/quickstart/aspplus/ ,上面的文档就是NGWS直接带的,而且这个站点全是由asp+构建的,大家可以直接看到aspx的执行情况,我现在对我们的站点唯一不满的地方就是不能执行aspx,不能给大家看到例程的执行结果。
好了不说多话了,我们这一节要来看看如何使用asp+中的控件吧。
ASP+中的控件分为两种,一种是HTML控件(HtmlControls ),一种是WEB控件(WEBControls) ,我们这一节先来讲讲比较简单的HTML控件。另一种控件留到下一节再去讲:)
HTML控件,如果只是看外观,发现和普通的HTML标签没有什么两样,不过就是
上面的select不过是一个普通的HTML标签而已,但是如果在select后加上RunAt="server",那么一切都变了。
那么这个就是一个asp+程序,我们就可以写ASPX程序了。如:
<% @ import NameSpace="System.Data" %>
请选择:
上面是一个很简单的aspx例子,主要目的是演示select HTML控件的用法. 上面的例子中,首先显示如下: 上面是一个很简单的aspx例子,主要目的是演示select HTML控件的用法.上面的例子中,首先显示如下:
请选择: ASP JSP PHP ASP+ COM
您的选取的Select列表是:暂无
当你点击"提交"键后,你就会后到:(假设我们 选取的是PHP)
请选择: ASP JSP PHP ASP+ COM
您的选取的Select列表是:PHP
从上面的例子中我们可以看到,我们主要操作的是aspcn_onclick子程序,而这个程序是由名为sub的控件激发的。(这里的Button和Label均属于WEB控件,我们下一节再讲),我们在aspcn_onclick中对于名为aspcn的select控件的操作,我们也很熟悉,呵呵,是不是很像 客户端的JavaScript?!相信用过javascript的兄弟,一定能看懂程序,呵呵,我们写服务器程序是不是像是在写客户端的程序,M$推出.Net也就是为了达到这个效果,不过这个对初学者来说是个不太好的事情,因为初学者本来就搞不清什么是客户端什么是服务器,现在又把他们写在一起,相信很多人要搞糊啦,所以我一开始就建议初学者还是先看看一些基础的东东为好。
我们使用aspcn.SelectedItem.Value来获取aspcn列表的值,然后通过SelectItem.Text=selectValue再把这个值传给名为selectItem的控件。就成为了我们看到的情形。程序是很简单的,我们在这里只是让大家有一个初步的了解。
几乎每一种HTML标签加上个RunAt="server"就可以成为HTML控件了。具体的有:
HtmlAnchor HtmlButton HtmlForm HtmlGenericControl
HtmlImage HtmlInputButton (Button) HtmlInputButton (Reset) HtmlInputButton (Submit)
HtmlInputCheckBox HtmlInputFile HtmlInputHidden HtmlInputImage
HtmlInputRadioButton HtmlInputText (Password) HtmlInputText (Text) HtmlSelect
HtmlTable HtmlTableCell HtmlTableRow HtmlTextArea
我一时也无法把他们的用法一个个的说明,请大家到我上面说的那个站点自已去看,我们以后写程序就要熟练使用HTML控件和 Web控件了。只要E文好,相信没有什么问题,呵呵,不要指望飞刀我翻译啊,我头都大了,大家饶我一命。
另外我们要提醒大家的就是,因为我们写ASP+一般都用c#,所以在命名控件时注意大小写,不然编译时会出错的。再有就是如果程序编译时请仔细看好出错信息,不要一出错就马上想到去问,自已动脑筋去想想,收获会更大。呵呵,这一章就到这里了,下一节就要讲WEB控件。
《 亲密接触ASP.NET(4) 》
WEB控件
按照计划我们这一节要谈Web控件,我想了半天也不知道如何定义这个web控件,它比html控件难于理解,毕竟HTML太像原来我们熟悉的东东了。而web控件确与我们平常见到的有很大的出入,不知道大家还记不记得我说过的一句话,那就是ASP.net的程序就像是写VBVC中的窗口,先再这些窗口中加入我们的需要的控件,然后再对这些控件进行操作。如果你学过一点点VBVC的编程,那么理解这个就不难了,ASP.net中的web控件就像是VBVC中的控件一样。我们先在页面中摆好这些控件,然后再通过Page_Load以及其它一些自定义事件来对他们进行控制。我们还是通过看一个实例来了解一下吧。我们先举简单的Label控件吧.
源代码如下:
<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<Script Language="C#" Runat="Server">
public void Page_Load(Object src,EventArgs e)
{
if(!Page.IsPostBack)
{
label3.Text="这是黑体字,并且带下划线";
}
}
</script>
<html>
<head>
<title>测试Label控件</title>
</head>
<body>
<bold>测试Label控件:<br></bold>
<asp:Label id="label1" font-size="9pt" font-bold="true" forecolor="red" runat="server">这是红色粗体的文字</asp:Label><br>
<asp:Label id="label2" font-size="10pt" font-italic="true" forecolor="blue" runat="server" text="这是蓝色斜体的文字" /><br>
<asp:Label id="label3" font-size="11pt" font-underline="true" runat="server" />
</body>
</html>
这段程序执行后的结果是
测试Label控件:
这是红色粗体的文字
这是蓝色斜体的文字
这是黑体字,并且带下划线
看看源代码,再看看程序执行的结果是不是发现Label控件和VB中的Label控件很相近:)
(注:你在你的机器上看到的中文可能是乱码,那么请您打开x:\winnt\microsoft\framework\v1.0.224目录,找到其中的config.web文件,打开它,找到下面的文字:
<globalization
requestencoding="iso-8859-1"
responseencoding="iso-8859-1"
/>
把其中的iso-8859-1改为gb2312,OK,再执行一下程序,中文是不是出来了:)
这里我们用了三种方法来操作Label控件,第一种是类似HTML的闭合标签,将要写的字写在<asp:Label></asp:Label>之间;第二种是用到了Label控件Text属性;第三种,是通过执行Page_Load事件而把文字写进Label控件的。这三种方法都很有用,看你自已的喜欢了,第三种是最常用的啦,以后我们会经常用到.Label控件不光有Text属性来控制它的文字,而且还有font-size等属性来控制字体大小,颜色等属性,这里的例子我都用到了,大家好好看看,相信没有什么问题
我们见过了Label控件的操作,那么我们对web控件有了一个感性的认识,在ASP.net中,一共有28个WEB控件,它们是:
AdRotator Button Calendar CheckBox
CheckBoxList CompareValidator CustomValidator DataGrid
DataList DropDownList HyperLink Image
ImageButton Label LinkButton ListBox
Panel RadioButton RadioButtonList RangeValidator
RegularExpressionValidator Repeater RequiredFieldValidator Table
TableCell TableRow TextBox ValidationSummary
大家可以到我上一节讲的那个站点去具体看一下他们各自的用法,这里我本来想主要讲一下DataGrid,DataLit,ListBox但是他们其中都需要用到Binding知识(这个我们在下一节讲),所以我们主要来看看DropDownList的用法(因为我们上一节是用的select来讲解HTML控件的)
先看一个例子:
<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<Script Language="C#" Runat="Server">
public void Page_Load(Object src,EventArgs e)
{
}
public void sub_click(Object sender,EventArgs e)
{
string chioce;
chioce=ddl.SelectedItem.Text;
show.Text="您选择的是本工作室的<font color=red>"+chioce+"</font>成员";
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<form runat="server">
请选择ASPCN.Com工作室程员:<br>
<asp:DropDownList id="ddl" RunAt="server">
<asp:ListItem>飞刀</asp:ListItem>
<asp:ListItem>大风</asp:ListItem>
<asp:ListItem>Zsir</asp:ListItem>
<asp:ListItem>布丁</asp:ListItem>
<asp:ListItem>亚豪</asp:ListItem>
</asp:DropDownList>
<br>
<asp:Button id="sub" Text="提交" RunAt="Server" OnClick="sub_click" /><br>
<asp:Label id="show" runat="server"/>
</form>
</body>
</html>
它执行显示为:
请选择ASPCN.Com工作室程员:
飞刀 大风 Zsir 布丁 亚豪
如果我选中了其中的飞刀,然后再按下"提交"键,那么显示就是:
请选择ASPCN.Com工作室程员:
飞刀 大风 Zsir 布丁 亚豪
您选择的是本工作室的飞刀成员
DropDownList控件,其实和select差不多,功能也就多那么一点点,但是这个多一点点的功能就是很有用的,这就是我们下一节要学习的Bind,呵呵,是不是想学了:)不急,我们先分析一下这里的程序。
我们用DropDownList控件建立起一个List列表,然后我们选择其中的一个选项,最后按提交键提交。这里我们可以看到处理程序的是sub_click这个事件,这里由名为sub的button控件激发,所用的事件是Onclick,这里和HTML控件所使用的OnServerClick事件是不同的,大家要分清楚。其它的好像没有什么可以说了。呵呵
我们下一节要讲bind,这个是很重要的。
《亲密接触ASP.NET(5) 》
我们这一节主要是要讲DataBind,这个在ASP.net中是很重要的东东,几乎所有的控件都需要它来控制数据的操作。也可以说是ASP.net的数据核心。
我们先来看一个简单的例子:
<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<Script Language="C#" Runat="Server">
public void Page_Load(Object src,EventArgs e)
{
//首先建立一个数组
ArrayList arr=new ArrayList();
arr.Add("飞刀");
arr.Add("Zsir");
arr.Add("大风");
arr.Add("布丁");
arr.Add("亚豪");
//将数组捆绑到DropDownList控件上去
DDL.DataSource = arr;
DDL.DataBind();
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<asp:DropDownList id="DDL" runat="server" />
</body>
</html>
最后的显示为:
飞刀 Zsir 大风 布丁 亚豪
我们在代码中可以看到我们建立了一个DropDownList,但是他没有<asp:ListItem>属性,而我们从最后的显示中依然可以看到我们所列出的选项。
这里就是我们用DataBind的结果,在Page_Load方法中我们建立了一个数组(ArrayList),并通过DataBind方法将这个数组捆绑到了DropDownList控件中,使得DropDownList最后有数据显示:),怎么样对Bind有一定感性认识了吧。下面我们开始正式讲解
其实DataBind(),不仅能对控件进行捆绑,而且还能够对页面中属性,方法进行捆绑,甚至整个页面都可以捆绑。比如,调用Page.DataBind()方法或者直接使用DataBind(),那么整个页面都将被捆绑,所有的数据全在监视之下。下面的例子,我们将使用DataBind方法来捆绑DropDownList,并获得其中的数据
<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<Script Language="C#" Runat="Server">
public void sub_Click(Object sender,EventArgs e)
{
Page.DataBind();
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<form runat=server>
<asp:DropDownList id="DDL" runat="server" >
<asp:ListItem>ASP技术</asp:ListItem>
<asp:ListItem selected>ASP.Net技术</asp:ListItem>
<asp:ListItem>JSP技术</asp:ListItem>
<asp:ListItem>PHP技术</asp:ListItem>
<asp:ListItem>组件技术</asp:ListItem>
</asp:DropDownList>
<br>
你现在选择的是:<font color=red><%# DDL.SelectedItem.Text %></font>区
<br>
<asp:Button id="sub" Text="提交" Type="submit" runat=server OnClick="sub_Click" />
</form>
</body>
</html>
执行后,我们选择JSP技术我们点击"提交"按钮,看到情况是:
ASP技术 ASP.Net技术 JSP技术 PHP技术 组件技术
你现在选择的是:JSP技术区
我们看到,那个红色的[JSP技术],我们并没有使用什么控件,但是他却能正确的显示我们的选择结果,这个是就捆绑的结果,注意<%# DDL.SelectedItem.Text %>这句话,正是它让我们取得了捆绑的数据。它看上去是不是像我们熟悉的<%=...%>这个语句,它们的使用方法相差不多,只是<%=...%>是在程序执行时调用,<%#... %>是在DataBind()方法之后被调用。以后我们还能经常看到他的身影,呵呵。
接收Bind的控件,一般有DropDownList,DataList,DataGrid,ListBox这些集合性质的控件,而被捆绑的主要是ArrayList(数组),Hashtable(哈稀表),DataView(数据视图),DataReader这四个,以后我们就可以对号入座,不会出现DataTable被捆绑的错误了:)
讲到Bind,就不能说一下DataBinder.Eval()方法.
我们在使用DataBind,获得的数据,系统会将其默认为String(字符串),这对我们平时的输出显示提供了极大的方便,但是我们并不是每次都需要string类型,有时我们就需要Boolean,Int32这些类型。此时我们就需要转化类型了。可能大家最先想到的是String.Format方法,这是最好的,但是用法过于烦。所以最好不要这样啦。我们可以用DataBinder.Eval()方法,他的格式是:
DataBinder.Eval(Container.DataItem,"转换的类型","格式")
最后一个"格式"是可选的,一般不用去管他,Container.DataItem是捆绑的数据项,"转换类型"指的是Integer,String,Boolean这一类东西.
有了它,我们处理数据就更加方便
最后我们来看一个例子,关于DataView的捆绑,呵呵,老是用DropDownList烦了,这次用DataGrid,在这个例子中我们可以看到"表是怎样炼成的"
<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<Script Language="C#" Runat="Server">
public void Page_Load(Object src,EventArgs e)
{
int i;
//建立表数据
DataTable dt=new DataTable();
DataRow dr;
//建立Column例,可以指明例的类型,这里用的是默认的string
dt.Columns.Add(new DataColumn("编号"));
dt.Columns.Add(new DataColumn("用户名"));
for(i=1;i<8;i++)
{
dr=dt.NewRow();
dr[0]=Int32.ToString(i);
dr[1]="aspcn"+Int32.ToString(i);
dt.Rows.Add(dr);
}
//捆绑
DG1.DataSource = new DataView(dt);
DG1.DataBind();
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<asp:DataGrid id="DG1" runat=server align=center HeaderStyle-BackColor="#aaaadd" />
</body>
</html>
我们见到的情况是:编号 用户名
1 aspcn1
2 aspcn2
3 aspcn3
4 aspcn4
5 aspcn5
6 aspcn6
7 aspcn7
关于这个程序我就不多说了,程序中有说明,只是要注意我们这里bind的是DataView,不是DataTable,这是一个常犯的错误:)
到这里我们的基础讲完了,大家要多多去熟悉一下Web控件,不然以后不知所云的:)
后面,我们将花几个节来谈一下,数据库的调用.
《 亲密接触ASP.Net(6) 》
关于Namespace(命名空间)的使用
在前面的程序中我们看到,我常用<% @ Import Namespace="System.Data" %>,这是在引用M$为我们提供的Namespace,这和ASP不同的,我们在ASP.net必须先引用与我们操作有关的Namespace后才能使用相应的功能。其实说白了,一个Namespace; 就是一个组件。这个是关于ASP.net的高级应用,我会在后面的章节讲。(不过要写到那里,时间......)
我下面简单的列举一些常用的Namespace
<% @ Import Namespace="System.Data" %> 处理数据时用到
<% @ Import Namespace="System.Data.ADO" % > 使用ADO.net ; 时用到
<% @ Import Namespace="System.Data.SQL" %> SQL Server 数据库专用
<% @ Import Namespace="System.Data.XML" %> 不用看处理XML用到
<% @ Import Namespace="System.IO" %> 处理文件时用到
<% @ Import Namespace="System.Web.Util" %> 发邮件时大家会用到
<% @ Import Namespace="System.Text" %> 文本编码时用到
操作数据库需要的东东
讲解了Namespace,我们可以正式来讨论数据库的应用了。从上面的可以看出,我们操作数据库,我们需要引用下面两个Namespace
<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.SQL" %>
其实System.Data.SQL 可以用System.Data.ADO来代替,SQL是SQL Server专用,ADO可以支持任何数据库(只要在主机上存在相应的驱动就行了,如Access,Mysql,Oracle之类的),这里由于飞刀的数据库是SQL Server,本来可以用ADO,但是想想M$单独把SQL独立出来,为何不用呢。至于它能带来多少好处,飞刀没有测试过,对SQL Server肯定要比ADO好一点啦。
无论是ADO还是SQL ,他们都有几个基本的对象用于操作
Connections 连结到一个数据库,以便于后面的应用(类似ADO中的Connections)
Commands 执行SQL语句的地方
DataReader 读取执行后返回的数据内容
DataSet 储存数据,功能强大,我们会具体讲解
DataSetCommand 执行SQL语句,并把数据存入DataSet
这里面可能最难理解的就是DataSet,我们先不去管他,先拿软的开刀Connections(SQLConection 或者 ADOConnection)
它的主要任务就是建立一个与数据库服务器的联结
<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.SQL" %>
<Script Language= "C#" Runat= "Server">
public void Page_Load(Object src,EventArgs e)
{
stringstrProvider="server=localhost;uid=sa;pwd=;database=aspcn";
SQLConnection MyConnection=new SQLConnection(strProvider);
}
</script>
上面我们建立了一个名为MyConnection的联结,就好像我们在ASP中用ADODB.Connection打开了一个联结.这个联结我们在Command或者DataSetCommand中将会使用.
它的一些有用的属性和方法有
ConnectionString 取得或设置连结数据库的语句
ConnectionTimeout 取得或设置连结数据库的最长时间,也是就超时时间
DataBase 取得或设置在数据库服务器上要打开的数据库名
DataSource 取得或设置DSN,大家不会陌生吧:)
Password 取得或设置密码
UserID 取得或设置登陆名
State 取得目前联结的状态
Open() 打开联结
Close() 关闭联结
Clone() 克隆一个联结。(呵呵,绵羊可以Connection我也可以)
我们也通过一个小例子来看看他们的用法:
SQLConnection myConnection = new SQLConnection();
myConnection.DataSource = "mySQLServer";
myConnection.Password = "";
myConnection.UserID = "sa";
myConnection.ConnectionTimeout = 30;
myConnection.Open();
myConnection.Database = "northwind";
myConnection.IsolationLevel = IsolationLevel.ReadCommitted
Commands(SQLCommand 或者 ADOCommand)
上面的程序中我们打开了一个联结,这里我们就需要来使用这个,看例子比较好:
<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.SQL" %>
<Script Language="C#" Runat="Server">
public void Page_Load(Object src,EventArgs e)
{
stringstrProvider="server=localhost;uid=sa;pwd=;database=aspcn";
string strIndex="select * from aspcn where purview=’webmaster’";
SQLConnection MyConnection=new SQLConnection(strProvider);
SQLCommand MyCommand = new SQLCommand(strIndex,MyConnection);
MyConnection.Open(); //打开联结
MyCommand.ExecuteNonQuery(); //执行SQL,但不返回任何记录
MyConnection.Close();
}
</script>
在上面的例子中我们建立SQLCommand对象时引用了两个参数(strIndex,MyConnection),从源程序中我们也可以看出来strIndex代表的是执行的SQL语句,MyConnection是我们先前建立的联结.然后我们就要先打开MyConnnection,然后再执行这个SQL语句。我们在这里执行用的是ExecuteNonQuery()方法,这样不返回记录集,只是返回受影响的记录个数。
这里我们打开和关闭数据库也可以这样做。
stringstrProvider="server=localhost;uid=sa;pwd=;database=aspcn";
string strIndex="select * from aspcn where purview=’webmaster’";
SQLConnection MyConnection=new SQLConnection(strProvider);
SQLCommand MyCommand = new SQLCommand(strIndex,MyConnection);
MyCommand.ActiveConnection.Open();
MyCommand.ExecuteNonQuery();
MyCommand.ActiveConnection.Close();
所得结果和先前的一样。所以执行一条SQL语句有很多种方法。而且还不只两种,我们后面学了DataSetCommand,那打开方法就是N种了:)这就需要看你的习惯和程序的要求了;)
我们先来看看Command常用的方法和属性
ActiveConnection 取得或设置联结Connections
CommandText 执行的SQL语句或储存过程(StoredProcedure)名
CommandTimeout 执行的最长时间
CommandType Command操作的类型(StoredProcedure,Text,TableDirect)三种,默认Text
Parameters 操作储存过程时使用
Execute() 执行SQL语句或储存过程
ExecuteNonQuery() 同上,区别在于不返回记录集
Clone() 克隆Command
同样看一个例子:
string mySelectQuery = "SELECT * FROM Categories ORDER BY CategoryID";
stringmyConnectString="userid=sa;password=;database=northwind;server=mySQLServer";
SQLCommand myCommand = new SQLCommand(mySelectQuery);
myCommand.ActiveConnection = new SQLConnection(myConnectString);
myCommand.CommandTimeout = 15;
myCommand.CommandType = CommandType.Text;< /FONT >
《 亲密接触ASP.Net(7) 》
上一节,我们简单的讲了一下数据库的应用,而我们没有具体说明执行语句如何用于显示。呵呵,是留在这一章节中讲的。这里我们必须得了解一下DataReader,DataSet和DataGrid控件,DataGrid是显示控件,大家自已去看它相关的应用,我们在这里不哆嗦,DataReader和DataSet都可以用来储存数据内容,不过DataReader只能储存查询的结果,DataSet就相对来说复杂多了,他的功能很强大,我们一步步来讲,这一节还讲不完,我们这一节只讲其关于储存数据库的功能,呵呵,为了和DataReader的讲解嘛.
讲数据库,首先得有用的数据才行,我这里随便搞了一个数据库,名为Company,再加了几条数据进去
DataReader
DataReader看名字就知道了,就是读取数据,我们可以通过Command的Execute方法,将取得的数据存入DataReader,DataReader有很多方法和属性,常用的是Read,这里我也不想多讲.我们还是先看看它的具体应用吧。
<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.SQL" %>
<Script Language="C#" Runat="Server">
public void Page_Load(Object src,EventArgs e)
{
//定义语句
string mySelectQuery = "SELECT * from Company";
string myConnString="server=localhost;uid=sa;pwd=123456;database=aspcn";
//联结
SQLConnection myConnection = new SQLConnection(myConnString);
SQLCommand myCommand = new SQLCommand(mySelectQuery,myConnection);
myConnection.Open();
//定义DataReader
SQLDataReader myDataReader;
//赋与DataReader以结果
myCommand.Execute(out myDataReader);
//将DataReader与DataGrid进行捆绑
show.DataSource=myDataReader;
show.DataBind();
//关闭
myDataReader.Close();
myConnection.Close();
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<asp:DataGrid id="show" runat=server HeaderStyle-BackColor="#aaaadd" />
</body>
</html>
在其中我们看到DataReader的定义
SQLDataReader myDataReader;
以及他的赋值
myCommand.Execute(out myDataReader);
完成这两步后,我们就将执行后的结果储存到DataReader中了。
最后我们就将其捆绑(Bind)到DataGrid控件上去,如果不明白捆绑是什么,看本系例的文章吧
id Name Age Sex Wage
1 飞刀 20 男 1400
2 张三 23 男 5000
3 李四 47 男 7786
4 王五 20 男 6788
5 苗翠花 30 女 45676
6 方世玉 20 男 4656
另外告诉大家,如果我们需要取得DataReader储存特定字段的值可以使用myDataReader["fieldname"]类似的方法取得下面是个简单的例子
.......
while (myDataReader.Read())
{
Response.Write("<tr>");
Response.Write("<td>"+myDataReader["Name"].ToString+"</td>");
Response.Write("</tr>");
}
.......
DataSet
哇,这对于初学者来说,是个很难理解的东东啊。怎么说才好呢?我们可以把DataSet看成一个无联结的RecordSet(这个大家应当熟悉吧).DataSet中储存有数据,而且这个就像是一个数据库,里面存在表(Tables),列(Columns),关联(relationships),限制(constrains)以及数据。这一些和数据库没有什么两样,但是他不是数据库(怎么越说越糊涂),我们可以先在DataSet中操作数据(添加,删除,更新),最后再一并提交到数据库去操作。而且DataSet中的数据不光可以来自于数据库,还可以是XML以及其它的数据,甚至用户的输入也能直接存入DataSet
我们这里只谈DataSet对于数据的作用,呵呵,而且还只是数据的显示。其它的应用,下节再说,我们还是先看看一段例子吧。
<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.SQL" %>
<Script Language="C#" Runat="Server">
public void Page_Load(Object src,EventArgs e)
{
//定义语句
string mySelectQuery = "SELECT * from Company";
string myConnString="server=localhost;uid=sa;pwd=123456;database=aspcn";
//联结
SQLConnection myConnection = new SQLConnection(myConnString);
SQLDataSetCommand myDataSetCommand = new SQLDataSetCommand(mySelectQuery,myConnection);
DataSet myDataSet = new DataSet();
//将结果储存入DataSet
myDataSetCommand.FillDataSet(myDataSet,"Company");
show.DataSource=myDataSet.Tables["Company"].DefaultView;
show.DataBind();
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<asp:DataGrid id="show" runat=server HeaderStyle-BackColor="#aaaadd" />
</body>
</html>
上面的显示的结果和前面的一样,我们来解释一下代码
此处我们使用了DataSetCommand,我们就是需要通过它的FillDataSet方法,将查询表Company的结果存入DataSet,具体的操作方法就是:
myDataSetCommand.FillDataSet(myDataSet,"Company");
以后的就是捆绑,也没有什么好说的了。只是要注意一下,DataSet是它的DataView与DataGrid进行Bind,这一原因我在前面的文章中已经说了。不懂的大家可以翻到前面看看,多多看看源程序。
另外我们可以向一个DataSet中加入多个表的查询结果,这些结果的Connection都可以不同,这个实现起来很简单,大家可以自已动手去做。
《 亲密接触ASP.Net(8) 》
我们这里还是来讲讲DataSet吧,这是一个功能强大的东东,我们在上一节对它有了一个初步的了解,这里我们要讲其如果用来操作数据。也是很简单的东东,但是功能强大,要讲全,不太可能,因为DataSet和DataGrid控件的讲解就占了.Net 帮助的50%以上,而这个总共有23M...
这里我们建立一个test.mdb数据库,做为测试的数据库,其中有一个名为aspcn的表,数据结构。
不需DataSet的数库操作
在讲DataSet的应用之前,我们来看看在ASP.net不使用DataSet如何对数据库进行插入,更新,删除.
要对数据进行插入,更新,删除而又不能用DataSet,没有办法,只有用SQL直接来啦:),我这里只讲一下怎样去插入,因为其它的操作只是改一下SQL语句,我想大家没有问题吧。这里由于使用的是mdb数据库,那么这次就要用ADO.net来操作了。
我们先看看整个源代码再说
<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.ADO" %>
<Script Language="C#" Runat="Server">
public string myConnstring="Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:/test/test.mdb;";
ADOConnection MyConnection;
public void Page_Load(Object src,EventArgs e)
{
//用户提交数据
}
public void submit_Click(Object src,EventArgs e)
{
string username1 = Request.Form["username"];
string address1 = Request.Form["address"];
string school1 = Request.Form["shool"];
string strInsert="insert into aspcn(username,address,school)
values('"+username1+"','"+address1+"','"+school1+"')";
//开始联结
try
{
MyConnection = new ADOConnection(myConnstring);
ADOCommand MyCommand = new ADOCommand(strInsert,MyConnection);
MyConnection.Open();
MyCommand.ExecuteNonQuery();
MyConnection.Close();
Info.Text="数据已经保存";
}
catch(Exception ee)
{
Info.Text="发生错误:"+ee.Message;
}
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<asp:Label id="Info" runat=server /><br>
<form runat="server">
用户名:<input type="text" name="username" size="20" ><br>
住址:<input type="text" name="address" size="20" ><br>
学校:<input type="text" name="school" size="20" ><br>
<input type="button" value="提交" runat="server" OnServerClick="submit_Click" >
<p>1</p>
</form>
</body>
</html>
因为我们是用的Access,所以首先就要申明一下啦
<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.ADO" %>
表明我们这里使用的是ADO.net.
我们提交入数据库的数据,来自于用户的输入,这里使用的是一个我们常见到的<form>表单,初一看和普通的没有什么区别,但是我们仔细看看它的<form>中的属性是什么,runat="server",呵呵,就是这么一个小小的标签,这个程序的性质就变啦。这表明他是一个Web Form了。这里我用了HTML控件,目的就是为了让大家看看ASP.net和ASP到底有哪些区别。
<form runat="server">
用户名:<input type="text" name="username" ><br>
住址:<input type="text" name="address" ><br>
学校:<input type="text" name="school" ><br>
<input type="button" value="提交" runat="server" OnServerClick="submit_Click" >
</form>
在上面的代码,有一点需要注意就是,触发button控件提交事件处理的是OnServerClick,这里大家很少有注意,因为大家使用WEB控件已成习惯,很容易就用了OnClick事件,呵呵,这种错误很难发现,错了都不知道怎么错的:)
下面我们就该在Submit_Click中处理提交事件了,首先是收集信息,这里我们又看到了久违的Request对象和Form方法。这个和ASP几乎是一模一样的,我也不想多说了。
string username1 = Request.Form["username"];
string address1 = Request.Form["address"];
string school1 = Request.Form["shool"];
接下来就是将收集来的数据写入数据库,关于数据库的打开和执行,我们上一节也讲过了。这里也就不罗嗦了。注意一下SQL语句的正确性就行。
string strInsert="insert into aspcn(username,address,school) values('"+username1+"','"+address1+"','"+school1+"')";
大家也要注意一下我的联结语句(因为很多人来问我,如何连结mdb数据库,其实和asp是一样,最主要是大家有些人不愿意自已动手去实践,问人已经成为了习惯)
public string myConnstring="Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:/test/test.mdb;";
这里联结Access最实用的语句(个人认为),其实还有好多种写法。比如:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/test/test.mdb
Data Source=aspcn
呵呵,本来这一节是要讲DataSet的,没有想到其它的文字一下子写了这么多,只好留到下一节去讲DataSet了。
《 亲密接触ASP.Net(9) 》
在一个DataSet中储存多个数据表 我们在ASP中很多人习惯于使用RecordSet对象来操作数据库,但是RecordSet有一个的缺点就是一个RecordSet只能储存一个数据表,当我们需要操作多个表时,不得不在多个RecordSet中来回操作,虽然这些在使用习惯后也没有什么,但是对一个新手来说,这也是一个很麻烦人的事情。光是那些变量名就可以搞浑你,现在好了,在ASP.Net中,只需要一个DataSet就可以搞定一切。大大的方便了我们的程序。我们还是老样子,先看一段程序,再来细细讲解。
<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.ADO" %>
<Script Language="C#" Runat="Server">
public void Page_Load(Object src,EventArgs e)
{
//联结语句
string MyConnString = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:/test/test.mdb;";
string strComm1 = "select * from UserList";
string strComm2 = "select * from BookList";
//打开一个联结
ADOConnection MyConnection = new ADOConnection(MyConnString);
//打开两个DataSetCommand
ADODataSetCommand MyComm1 = new ADODataSetCommand(strComm1,MyConnection);
ADODataSetCommand MyComm2 = new ADODataSetCommand(strComm2,MyConnection);
DataSet MyDataSet = new DataSet();
//把UserList,BookList表存入DataSet
MyComm1.FillDataSet(MyDataSet,"UserList");
MyComm2.FillDataSet(MyDataSet,"BookList");
DataGrid1.DataSource = MyDataSet.Tables["UserList"].DefaultView;
DataGrid2.DataSource = MyDataSet.Tables["BookList"].DefaultView;
DataGrid1.DataBind();
DataGrid2.DataBind();
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<table>
<tr>
<td>
<ASP:DataGrid id="DataGrid1" runat="server"
BorderColor="black"
BorderWidth="1"
GridLines="Both"
CellPadding="3"
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
AlternatingItemStyle-BackColor="#eeeeee"
/>
</td>
<td>
<ASP:DataGrid id="DataGrid2" runat="server"
BorderColor="black"
BorderWidth="1"
GridLines="Both"
CellPadding="3"
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
AlternatingItemStyle-BackColor="#eeeeee"
/>
</td>
</tr>
</table>
</body>
</html>
在上面的例子中,我们打开了一个名为test.mdb的Access数据库,然后把他其中的两个表"UserList"和"BookList"使用两个DataGrid控件显示出来。显示的图片如下:
我们现在来分析一下代码:
string MyConnString = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:/test/test.mdb;";
string strComm1 = "select * from UserList";
string strComm2 = "select * from BookList";
ADOConnection MyConnection = new ADOConnection(MyConnString);
ADODataSetCommand MyComm1 = new ADODataSetCommand(strComm1,MyConnection);
ADODataSetCommand MyComm2 = new ADODataSetCommand(strComm2,MyConnection);
这些都只是在作一些准备工作,打开一个联结,并且打开两个DataSetCommand取得两个表的数据。
DataSet MyDataSet = new DataSet();
这是我们程序的关键之地,这里打开了我们要操作的DataSet对象。下面我们就需要将数据表的内容填入DataSet了。
MyComm1.FillDataSet(MyDataSet,"UserList");
MyComm2.FillDataSet(MyDataSet,"BookList");
这里是我们今天的主要内容。前面的几章曾经说过,在一个DataSet中可以包含多种数据,这里我们是往这个名为MyDataSet的DataSet中存放了两个数据库表,其实只要愿意,我们还可以在里面插入XML数据,而且他们是不会出现冲突的。大家可以放心使用,呵呵。
再下面的代码,就是把MyDataSet的数据传送给DataGrid控件显示。这里就不多说了。
这里我们只是简单的说了一下DataSet能存放多个数据表的功能,大家看看好像没有什么特别的。这里看起来确实好像没有什么特别的功能,但是如果配上DataSet中的修改、添加、删除功能,我们操作数据库就变得很简单。我们可以先将数据库读入DataSet,然后在DataSet中修改数据,如果改得觉得不满意,我们还可以使用RejectChanges方法全面恢复,最后一并交给去数据库去更新。
下一节,我们再来讲解,如何使用DataSet来添加,修改,删除数据。
《 亲密接触ASP.Net(10) 》
接上一节,我们这一节主要计论如何使用DataSet,在数据库中增加、修改、删除一个数据。
首先我们需要打开一个联结,我们的数据库还是用上一节的吧:)
string MyConnString = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:/test/test.mdb;";
string strComm = "select * from UserList";
ADOConnection MyConnection = new ADOConnection(MyConnString);
ADODataSetCommand MyComm = new ADODataSetCommand(strComm,MyConnection);
这里我们为了讲解方便,只在DataSet存入一个表的内容:
DataSet MyDataSet = new DataSet();
MyComm.FillDataSet(MyDataSet,"UserList");
此时我们就获得了一个拥有UserList表数据的DataSet。在讲解DataSet之前,我们还需要了解DataSet的结构下面是DataSet的结构树
DataSet
RelationsCollection
ExtendedProperties
TablesCollection
DataTables
Rows
Columns
其它
由于我们研究的是DataTable,其它的我们暂时不管他们。一个DataSet中包含多个DataTable,一个DataTable又包含有多个Row,这就是我们操作DataSet的基础啦:)
添加数据
添加一数据,从上面的列表中我们可以看出,其实就是添加一行Row,这里我们也来演示一下如何添加一行数据,我们程序一切以DataSet为顶点,呵呵,如果TablesCollection,RowsCollection下去的话,还有一些烦人的dt.AcceptChanges这些方法的调用,很烦人,还是一次搞定吧。
DataRow dr=MyDataSet.Tables["UserList"].NewRow();
dr["UserName"] = "周讯";
dr["ReMark"] = "100";
dr["Comment"] = "漂亮MM";
MyDataSet.Tables.Rows.Add(dr);
第一行,我们建立一个新的数据行,它用来储存我们新加入的数据。然后我们在这个数据行中加入我们需要的数据。dr["UserName"]表明是对UserName字段进行添加,你可以使用dr[1]来添加信息,但是这需要我们事先知道字段在数据表的位置,而且在不知道数据表结构的情况很难知道我们添加的数据的对应情况,所以还是用字段名为好。
最后我们使用RowsCollection的Add方法,将我们新建这一行加入到数据表中。
修改数据
知道如何添加数据后,修改数据也是很简单的事情了.
MyDataSet.Tables["UserList"].Rows[0]["UserName"]="飞刀大哥";
这样我们就修改了第一行数据中的UserName字段。
删除数据
删除数据,主要是使用RowsCollection提供的Delete方法,看下面的程序也是很简单的事情啦:)
MyDataSet.Tables["UserList"],Rows[0].Delete();
这一行数据就已经被删除了。
恢复数据
有时候我们添加/修改数据会出现错误,这时候,就需要恢复原来的数据。下面的程序,显示如何判断是否有错误发生:
if(MyDataSet.HasErrors)
{
MyDataSet.RejectChanges();
}
首先我们检查DataSet中是否有错误发生,如果有就使用RejectChanges()方法,恢复DataSet中的数据。注意这里恢复是在DataSet中所有表以及表中DataRow中的数据,也就是在此交次操作的数据全部恢复。如果我们只需要恢复部分内容,我们可以使用DataTable或DataRow的RejectChanges(),这里就不详细讲解了,使用方法和DataSet一样,只是操作的对像不同而已。
探测DataSet是否有改动
我们在将DataSet送交给数据库去保存去,我们需要看看这个DataSet是否已经被改动了。如果没有改动,我们也就没有必要去修改数据库了。
if(MyDataSet.HasChanges)
{
//保存
}else{
//不进行任何操作
}
更新数据库
我们上面的操作,都只是针对DataSet的,没有操作数据库,但是我们的目的还是要将数据保存到数据中去,所以我们这里就需要调用DataSetCommand的Update方法。下面的程序显示如何将DataSet的数据交给数据库。
MyComm.Update(MyDataSet);
很简单的一句,呵呵。这里要注意,如果一个DataSet中包含有多个表,而我们只更新一个,那我们就必须写明更新的数据表名:
MyComm.Update(MyDataSet,"UserList");
当Update方法被调用后,DataSetCommand会将数据库中的数据与DataSet中的数据相比较,对不相同的地方进行更新。
对于DataSet的操作,我们这里只讲这么多,其实DataSet的方法和属性有很多,功能也很全,我想现在这里的所讲的功能,对一般的操作已经足够了。
《 亲密接触ASP.Net(11) 》
在ASP.Net内中,如何做到分页
我不只一次地被别人问起,如何在ASP.Net实现分页功能。我实在不愿意回答这个问题。因为在ASP.Net中实现分页,实在是太简单了,简单到你一看到程序就会去气得跳楼,呵呵要发表感叹,为什么这个东东不早出来。
在以住的WEB技术中,我们要做到分页,经常是一长串代码才能搞定它,而且每用一个页面,就要重写一次,烦的要命。但是在ASP.Net中借助DataGrid控件,我们分页程序可以轻松搞定,需要的只是对DataGrid控件做一些设定。我们还是借助一个程序来看:)
<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.ADO" %>
<Script Language="C#" Runat="Server">
public void Page_Load(Objectsrc,EventArgs e)
{
//联结语句
string MyConnString = "Driver={Microsoft Access Driver (*.mdb)};DBQ=c:/test/test.mdb;";
string strComm = "select * from UserList order by id";
//打开一个联结
ADOConnectionMyConnection = new ADOConnection(MyConnString);
//打开两个DataSetCommand
ADODataSetCommandMyComm = new ADODataSetCommand(strComm,MyConnection);
DataSetMyDataSet = new DataSet();
//把UserList,BookList表存入DataSet
MyComm.FillDataSet(MyDataSet,"UserList");
DataGrid1.DataSource = MyDataSet.Tables["UserList"].DefaultView;
DataGrid1.DataBind();
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<form runat="server">
<ASP:DataGrid id="DataGrid1" runat="server"
BorderColor="black"
BorderWidth="1"
GridLines="Both"
CellPadding="3"
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
AlternatingItemStyle-BackColor="#eeeeee"
/>
</form>
</body>
</html>
它的显示结果为:
大家可以看到在这个UserList表中的11条数据全都出来了,没有分页。
《 亲密接触ASP.Net(12) 》
DataGrid的分页(2)
这里我紧接上一节,讲DataGrid的分页。在上例中,我们可以看到对于分页控制,本来已经足够了,呵呵,但是只是一个普通的分页,多没有意思,还是给它变些花样好。先讲讲上一节DataGrid控件所用的属性
<ASP:DataGrid id="DataGrid1" runat="server"
AllowPaging="True"
PageSize="5"
PagerStyle-HorizontalAlign="Right"
BorderColor="black"
BorderWidth="1"
GridLines="Both"
CellPadding="3"
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
AlternatingItemStyle-BackColor="#eeeeee"
/>
关于它的属性,有些就不讲了一看就知道。这里讲几个新鲜的:)
HeaderStyle-BackColor是指Column栏的颜色
AlternatingItemStyle-BackColor是指隔行交替出现的颜色
这些我们在上一节中已经看到了。下面我再讲一些属性。
我们看着那个"<"与">"不顺眼,我们想把他们换成"上一页"与"下一页",很好办,加入两条属性
PagerStyle-NextPageText="下一页"
PagerStyle-PrevPageText="上一页"
怎么样,变了吧:)
我们还是看不惯,要是用123这些数字标记多好。也行。再加属性。
PagerStyle-Mode="NumericPages"
搞定。
要是能显示一共有多少页,而且还可报告当前为第几页,那又多好:),也行,不过就不是改属性能做到了。我们加上下面的代码
当前页是:<font color=red><%=DataGrid1.CurrentPageIndex+1%></font><br>
总页数是:<font color=red><%=DataGrid1.PageCount%></font><br>
是不是又可以了。呵呵,有的朋友还需要加入"末页"和"首页"的链接,这也是可以的,不过要复杂的多。
我们下次再讲吧。主要是使用OnPageIndexChanged事件。呵呵,有兴趣的朋友可以先做出来.)
《 亲密接触ASP.Net(13) 》
个性化的分页实现
我们前面讲的分页,只不过是通过修改DataGrid的属性来实现分页,这样有这样的好处,最大的就是简单,呵呵,根本不用操心,分页是如何产生的。
但是它同样有缺点,不能按照我们想像的产生各种我们需要的样式。
没有办法,想个性化功能,只有自已动手来做了,呵呵。
我们一步步的来,首先是导入需要的命名空间。下面的例子,其实也是我从国外找来的,再加上点个人的东东,再汉化,呵呵。今天心情很好,我连标签色彩都给大家显示出来了。呵呵,更利于大家看程序。
<%@ Page Language="C#"%>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SQL"%>
我们先看看,我们的web控件是哪些,再看看代码是怎么写的,这样比较好:)
<body>
<h3><font face="Verdana">个性化的分页实例^&^</font></h3>
<form runat=server>
<ASP:DataGrid id="MyDataGrid" runat="server"
AllowPaging="True"
PageSize="10"
PagerStyle-Mode="NumericPages"
PagerStyle-HorizontalAlign="Right"
OnPageIndexChanged="MyDataGrid_Page"
BorderColor="black"
BorderWidth="1"
GridLines="Both"
CellPadding="3"
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
AlternatingItemStyle-BackColor="#eeeeee"
AutoGenerateColumns="false"
>
<property name="Columns">
<asp:BoundColumn HeaderText="工作室成员" DataField="Enter_ID" />
<asp:BoundColumn HeaderText="登陆时间" DataField="Enter_Time" />
</property>
</ASP:DataGrid>
<p>
<asp:LinkButton id="btnFirst" runat="server"
Text="首页"
CommandArgument="0"
ForeColor="navy"
Font-Name="verdana" Font-size="8pt"
OnClick="PagerButtonClick"
/>
<asp:LinkButton id="btnPrev" runat="server"
Text="前页"
CommandArgument="prev"
ForeColor="navy"
Font-Name="verdana" Font-size="8pt"
OnClick="PagerButtonClick"
/>
<asp:LinkButton id="btnNext"runat="server"
Text="后页"
CommandArgument="next"
ForeColor="navy"
Font-Name="verdana" Font-size="8pt"
OnClick="PagerButtonClick"
/>
<asp:LinkButton id="btnLast" runat="server"
Text="末页"
CommandArgument="last"
ForeColor="navy"
Font-Name="verdana" Font-size="8pt"
OnClick="PagerButtonClick"
/>
<p>
<asp:Checkbox id="chk1" runat="server"
Text="显示内置的页数"
Font-Name="Verdana"
Font-Size="8pt"
AutoPostBack="true"
/>
<p>
<table bgcolor="#eeeeee" cellpadding="6"><tr><td nowrap><font face="Verdana" size="-2">
<asp:Label id="lblCurrentIndex" runat="server" /><br>
<asp:Label id="lblPageCount" runat="server" /><br>
</font></td></tr></table>
</form>
</body>
从上面的例子我们可以看出点击LinkButton控件OnClick触发的是PageButtonClick事件,DataGrid页面OnPageIndexChanged改变触发的是MyDataGrid_Page事件,我们以后就是就是要编写这两件事件的代码
下面是先要查询的数据库的信息,用一个函数表示,因为经常用到:),我打开的表,呵呵,是我们工作室管理区的登陆记录表(哈又卖了点我们工作室的秘密给大家)
ICollection CreateDataSource()
{
/*
读取数据库的信息,获得DataView
*/
SQLConnection MyConnection = new SQLConnection("server=localhost;uid=sa;pwd=123456;database=aspcn");
SQLDataSetCommand MyDataSetCommand = new SQLDataSetCommand("select * from admin_enter order by Enter_Time desc",MyConnection);
DataSet ds= new DataSet();
MyDataSetCommand.FillDataSet(ds,"admin_enter");
return ds.Tables["admin_enter"].DefaultView;
}
然后中是Page_Load函数,在这里主要是判断一下是否显示DataGrid自带的那些分页数字,使用的是PageStyle的Visible属性:
void Page_Load(Object sender, EventArgs e)
{
//判断是否隐藏PagerStyle-Mode
if (chk1.Checked)
{
MyDataGrid.PagerStyle.Visible=true;
}
else
{
MyDataGrid.PagerStyle.Visible=false;
}
BindGrid();
}
下面是处理点击事件的PagerButtonClick,这是我们的核心部分,其实我们操作的也只是DataGrid的CurrentPageIndex属性。如果CurrentPageIndex小于PageCount则有下一页,如果CurrentPageIndex大于0则表示有前一页。
void PagerButtonClick(Object sender, EventArgs e)
{
//获得LinkButton的参数值
String arg = ((LinkButton)sender).CommandArgument;
switch(arg)
{
case ("next"):
if (MyDataGrid.CurrentPageIndex < (MyDataGrid.PageCount - 1))
MyDataGrid.CurrentPageIndex ++;
break;
case ("prev"):
if (MyDataGrid.CurrentPageIndex > 0)
MyDataGrid.CurrentPageIndex --;
break;
case ("last"):
MyDataGrid.CurrentPageIndex = (MyDataGrid.PageCount - 1);
break;
default:
//本页值
MyDataGrid.CurrentPageIndex = arg.ToInt32();
break;
}
BindGrid();
}
下面是MyDataGrid_Page,主要操作是调用BindGrid函数,以将数据交给DataGrid显示:
void MyDataGrid_Page(Object sender, DataGridPageChangedEventArgs e)
{
//处理按下数字的方法
BindGrid();
}
最后是两个函数,他们的作用,我都注释了:)
void BindGrid()
{
//将DataView绑定到DataGrid上去
MyDataGrid.DataSource = CreateDataSource();
MyDataGrid.DataBind();
ShowStats();
}
void ShowStats()
{
//显示页面信息
lblCurrentIndex.Text = "当前页数为: " + ((int)MyDataGrid.CurrentPageIndex+1);
lblPageCount.Text = "总页数是: " + MyDataGrid.PageCount;
}
到此为止,我们的个性化页面已经完成了(全部代码和显示看一下节),我们总的思想就是使用LinkButton控件做为翻页的标帜,通过判断LinkButton的CommandArgument值,操作DataGrid的CurrentPageIndex属性,以达到翻页的效果。
如果大家在本节中看不懂结构,请参看下一节的全部代码以及示例。
《 亲密接触ASP.Net(14) 》
个性化分页(2)
上一节大家没有看到总的结构,这一节,我把代码全部贴出来,大家好好看看。
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>
<html>
<script language="C#" runat="server">
void Page_Load(Object sender, EventArgs e)
{
//判断是否隐藏PagerStyle-Mode
if (chk1.Checked)
{
MyDataGrid.PagerStyle.Visible=true;
}
else
{
MyDataGrid.PagerStyle.Visible=false;
}
BindGrid();
}
ICollection CreateDataSource()
{
/*
读取数据库的信息,获得DataView
*/
SQLConnection MyConnection = new SQLConnection("server=localhost;uid=sa;pwd=123456;database=aspcn");
SQLDataSetCommand MyDataSetCommand = new SQLDataSetCommand("select * from admin_enter order by Enter_Time desc",MyConnection);
DataSet ds= new DataSet();
MyDataSetCommand.FillDataSet(ds,"admin_enter");
return ds.Tables["admin_enter"].DefaultView;
}
void PagerButtonClick(Object sender, EventArgs e)
{
//获得LinkButton的参数值
String arg = ((LinkButton)sender).CommandArgument;
switch(arg)
{
case ("next"):
if (MyDataGrid.CurrentPageIndex < (MyDataGrid.PageCount - 1))
MyDataGrid.CurrentPageIndex ++;
break;
case ("prev"):
if (MyDataGrid.CurrentPageIndex > 0)
MyDataGrid.CurrentPageIndex --;
break;
case ("last"):
MyDataGrid.CurrentPageIndex = (MyDataGrid.PageCount - 1);
break;
default:
//本页值
MyDataGrid.CurrentPageIndex = arg.ToInt32();
break;
}
BindGrid();
}
void MyDataGrid_Page(Object sender, DataGridPageChangedEventArgs e)
{
//处理按下数字的方法
BindGrid();
}
void BindGrid()
{
//将DataView绑定到DataGrid上去
MyDataGrid.DataSource = CreateDataSource();
MyDataGrid.DataBind();
ShowStats();
}
void ShowStats()
{
//显示页面信息
lblCurrentIndex.Text = "当前页数为: " + ((int)MyDataGrid.CurrentPageIndex+1);
lblPageCount.Text = "总页数是: " + MyDataGrid.PageCount;
}
</script>
<body>
<h3><font face="Verdana">个性化的分页实例^&^</font></h3>
<form runat=server>
<ASP:DataGrid id="MyDataGrid" runat="server"
AllowPaging="True"
PageSize="10"
PagerStyle-Mode="NumericPages"
PagerStyle-HorizontalAlign="Right"
OnPageIndexChanged="MyDataGrid_Page"
BorderColor="black"
BorderWidth="1"
GridLines="Both"
CellPadding="3"
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
AlternatingItemStyle-BackColor="#eeeeee"
AutoGenerateColumns="false"
>
<property name="Columns">
<asp:BoundColumn HeaderText="工作室成员" DataField="Enter_ID" />
<asp:BoundColumn HeaderText="登陆时间" DataField="Enter_Time" />
</property>
</ASP:DataGrid>
<p>
<asp:LinkButton id="btnFirst" runat="server"
Text="首页"
CommandArgument="0"
ForeColor="navy"
Font-Name="verdana" Font-size="8pt"
OnClick="PagerButtonClick"
/>
<asp:LinkButton id="btnPrev" runat="server"
Text="前页"
CommandArgument="prev"
ForeColor="navy"
Font-Name="verdana" Font-size="8pt"
OnClick="PagerButtonClick"
/>
<asp:LinkButton id="btnNext" runat="server"
Text="后页"
CommandArgument="next"
ForeColor="navy"
Font-Name="verdana" Font-size="8pt"
OnClick="PagerButtonClick"
/>
<asp:LinkButton id="btnLast" runat="server"
Text="末页"
CommandArgument="last"
ForeColor="navy"
Font-Name="verdana" Font-size="8pt"
OnClick="PagerButtonClick"
/>
<p>
<asp:Checkbox id="chk1" runat="server"
Text="显示内置的页数"
Font-Name="Verdana"
Font-Size="8pt"
AutoPostBack="true"
/>
<p>
<table bgcolor="#eeeeee" cellpadding="6"><tr><td nowrap><font face="Verdana" size="-2">
<asp:Label id="lblCurrentIndex" runat="server" /><br>
<asp:Label id="lblPageCount" runat="server" /><br>
</font></td></tr></table>
</form>
</body>
</html>
上面是全部的源代码,执行后的显示.
按下随便一个键,比如"末页"
看,我们的程序就直接到了最后一页,即第5页,我们在下面的"当前页数"可以看到:)
我们再来点击"显示内置的页数"这个复选框,看看:
看,我们前两节看到的那些小数字也出来了:)