《ASP NET程序设计案例教程》课件第4章_第1页
《ASP NET程序设计案例教程》课件第4章_第2页
《ASP NET程序设计案例教程》课件第4章_第3页
《ASP NET程序设计案例教程》课件第4章_第4页
《ASP NET程序设计案例教程》课件第4章_第5页
已阅读5页,还剩143页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章模块3——会员注册管理4.1【任务7】会员注册UI设计4.2【任务8】会员信息验证4.3【任务9】会员注册信息存储

【本章提要】

本章围绕校园在线超市系统中会员注册管理模块的实现,首先通过会员注册UI设计任务的实现过程,介绍了ASP.NET2.0中选择类控件的使用;然后通过对会员信息的验证叙述了服务器验证控件的使用;最后以注册信息存储到数据库中为要求,介绍了ADO.NET数据访问模型的概念,并介绍了数据访问对象Connection、Command和DataReader的使用。

【学习目标】

·掌握选择类控件的使用。

·掌握验证控件。

·理解数据访问模型的概念。

·掌握Connection、Command、DataReader对象的使用。

任务描述

在校园在线超市系统中,要实现会员注册功能,首先应该有一个注册页面,能够输入会员的相关信息,如用户名、密码、性别、职业、爱好、电话、电子邮件等。那么,这些信息的录入需要哪些控件呢?这些控件又该如何访问呢?4.1【任务7】会员注册UI设计必备知识

知识1选择类控件的使用

选择类控件主要包括单选按钮、复选按钮、下拉式列表和列表框。这类控件的属性中均有一个项目集合属性,单击后可出现添加项目窗口,并可设置项目的显示文本和相应的值,如图4-1所示。同时,也可以通过编程的方式添加和移除项目。这类控件还支持数据源的数据绑定。

1.RadioButton控件和RadioButtonList控件

RadioButton控件是单个的单选按钮控件,RadioButtonList控件是作为单选按钮列表项集合的父控件,它们都可以实现单一选择。

RadioButton控件的HTML标签:

<asp:RadioButtonID="RadioButton1"runat="server"Text="男"/>

<asp:RadioButtonID="RadioButton2"runat="server"Text="女"/>

RadioButtonList控件的HTML标签

<asp:RadioButtonListID="RadioButtonList1"runat="server"

Width="396px"RepeatDirection="Horizontal">

<asp:ListItem>男</asp:ListItem>

<asp:ListItem>女</asp:ListItem>

</asp:RadioButtonList>读取按钮组中的值 :

stringsex=RadioButtonList1.SelectedItem.Value;

设置单选按钮组的方向:

RadioButtonList1.RepeatDirection=RepeatDirection.Horizontal;

图4-1选择类控件添加项目

2.CheckBoxList控件

作为复选框控件列表集合的父控件,CheckBoxList控件可以实现多项选择。

CheckBoxList控件的HTML标签:

<asp:CheckBoxListID="CheckBoxList1"runat="server"Width="396px"

RepeatDirection="Horizontal">

<asp:ListItem>体育</asp:ListItem>

<asp:ListItem>音乐</asp:ListItem>

<asp:ListItem>旅游</asp:ListItem>

<asp:ListItem>看书</asp:ListItem>

<asp:ListItem>上网</asp:ListItem>

</asp:CheckBoxList>

统计复选框组中的项数:

intnumber=CheckBoxList1.Items.Count;

判断复选框组中的项是否被选中:

if(CheckBoxList1.Items[i].Selected==true);

获取复选框组中项的值:

stringstr=CheckBoxList1.Items[i].Value;获取复选框组中每一项的值:

for(inti=0;i<CheckBoxList1.Items.Count;i++){

stringstrList="";

if(CheckBoxList1.Items[i].Selected==true)

{

strList+=""+CheckBoxList1.Items[i].Value;

}

}

3.DropDownList控件

DropDownList控件可以创建单一选择的下拉列表控件。

DropDownList控件的HTML标签:

<asp:DropDownListID="ContrGrade"runat="server"

OnSelectedIndexChanged="ContrGrade_SelectedIndexChanged">

<asp:ListItem>大一</asp:ListItem>

<asp:ListItem>大二</asp:ListItem>

<asp:ListItem>大三</asp:ListItem>

</asp:DropDownList>

改变选项后立即提交服务器:

ContrGrade.AutoPostBack="true";

获取下拉列表中选中项的值:

stringstrList=DropDownList.SelectedItem.Value;

事件选项改变触发的事件处理程序:

protectedvoidContrGrade_SelectedIndexChanged(objectsender,

EventArgse){

stringstrList=DropDownList1.SelectedItem.Value;

Label1.Text=strList;

}

任务实现

步骤1打开校园在线超市网站,在“解决方案资源管理器”的“User文件夹”中选择“增加新项”,设置名称为“Register.aspx”,语言为“VistualC#”,勾选“选择母版页”,并点击“添加”按钮,如图4-2所示。

图4-2添加新项步骤2在出现的“选择母版页”对话框中,选择站点根目录下的母版“MasterPage.master”,并点击“确定”按钮,如图4-3所示。

图4-3选择母版页步骤3从新建的内容页“user/Register.aspx”中切换到设计视图,将Label控件、TextBox控件、RadioButtonList控件、CheckBoxList控件、DropDownList控件、Button控件从工具箱拖放到页面,设置其属性,并采用表格布局,如图4-4所示。

图4-4Register.aspx内容页步骤4为“性别”栏中所拖入的RadioButtonList控件添加两个选项,分别为“男”、“女”,其Text属性与Value属性相同,默认值为“男”,并设置其RepeatDirection属性为Horizontal。

步骤5浏览“Register.aspx”页面,查看其显示效果。

任务描述

在校园在线超市系统中,当会员进行信息填写时,有必要对用户输入的信息进行验证,以保证输入数据的完整性和安全性。4.2【任务8】会员信息验证

知识1验证概述

1.数据验证的必要性

输入验证是检验Web窗体中用户的输入是否和期望的数据值、范围或格式相匹配的过程。通过数据验证可以有效减少等待错误信息的时间,降低发生错误的可能性,从而改善用户访问Web站点的体验。必备知识

1)验证控件的值

在很多情况下,我们期望用户输入的值应该符合某种类型、在一定范围内或符合一定的格式等,对于这些要求,通过使用验证控件将能很容易地实现。

2)错误阻塞处理

当页面验证没有通过时,页面将不会被提交或不会被处理,直到验证通过,页面才可能被提交处理。

3)对欺骗和恶意代码的处理

验证还会保护Web页面避免两种威胁:欺骗和恶意代码。当恶意用户修改收到的HTML页面,并返回一个看起来输入有效或已通过授权检查的值时,就发生了恶意欺骗。由此可以看出,欺骗往往是通过绕过客户端验证来达到目的的。因此,运行ASP.NET服务器端验证将能有效地阻止欺骗。

当恶意用户向Web页的无输入验证的控件添加无限制的文本时,就有可能输入了恶意代码。当这个用户向服务器发送下个请求时,已添加的代码可能对Web服务器或任何与之连接的应用程序造成破坏。

2.数据验证过程

数据发送到服务器端之前,验证控件会在浏览器内执行错误检查,并立即给出错误提示,如果发生错误,则不能提交网页。出于安全考虑,任何在客户端进行的输入验证都会在服务器再次进行验证。

在服务器处理请求之前,验证控件会对该请求中输入控件的数据合法性进行验证,行使一个类似数据过滤器的角色,即在处理Web页或服务器逻辑之前对数据进行验证。如果有不符合验证逻辑的数据,则中断执行并返回错误信息。验证过程如图4-5所示。

图4-5数据验证过程知识2验证的对象模型

验证控件在客户端上呈现的对象模型与在服务器上呈现的对象模型几乎完全相同,但是在公开验证信息的方式上有所不同。服务器端通过对控件的属性设置来实现,而客户端则使用全局变量来实现。表4-1列出了客户端和服务器端对象模型。表4-1客户端和服务器端对象模型在服务器端,通过使用由各个验证控件和页面公开的对象模型,可以与验证控件进行交互。每个验证控件都有自己的IsValid属性,该属性用来确定该控件是否通过验证测试。而每一个Web页面也公开一个IsValid属性,它汇总页面上所有验证控件的IsValid状态,该属性允许执行单个测试,以确定是否应该继续执行。页面还公开一个包含页面上所有验证控件的列表的Validators集合,利用这一集合可依次检查单个验证控件的状态。在客户端,网页将包含对执行客户端验证所用的脚本库的引用,此外还包含客户端方法,以便在网页提交前截获并处理Click事件。

知识3ASP.NET的验证类型

在ASP.NET中,输入验证是通过向ASP.NET网页添加验证控件来完成的。验证控件为所有常用的标准验证类型提供了一种易于使用的机制以及自定义验证的方法。此外,验证控件还允许自定义向用户显示错误信息的方法。验证控件可与ASP.NET网页上的任何控件一起使用。常规的验证类型如表4-2所示。表4-2验证类型

知识4服务器验证控件

1.错误信息的布局与显示

当错误信息出现在页面上时,它成为页布局的一部分。因此,需要在进行页的布局设计时考虑这一因素,以放置可能出现的任何错误信息。一般通过设置验证控件的Display属性来控制布局,该属性的选项如表4-3所示。表4-3验证控件的Display属性值

2.使用验证控件

1)RequiredFieldValidator控件

该控件可以强制用户在输入控件中输入内容。当验证执行时,如果输入控件包含的值为空,则验证失败。在页中添加RequiredFieldValidator控件并将其链接到相关的控件,可以指定用户在ASP.NET网页上的相关控件中必须输入信息。

如果验证在客户端执行,则用户可以在使用该页时将必填字段设为空白(或保留默认值),但必须在提交页之前提供非默认值。但是,在字段中输入值之后,用户便无法清除该字段(或将其恢复为默认值)。如果清除该字段,用户在试图离开该字段时会立即见到错误信息。在服务器验证中,页提交之前不进行检查,用户在提交页后才会看到错误信息。

在下面的示例中,RequiredFieldValidator控件验证TextBox控件“txtName”是否为空。

<asp:TextBoxID="txtName"runat="server">Enteryourname

</asp:TextBox>

<asp:RequiredFieldValidatorID="txtNameValidator"runat="server" Display="Dynamic"

ControlToValidate="txtName"

ErrorMessage="RequiredFieldValidator">

</asp:RequiredFieldValidator>

RequiredFieldValidator验证控件的属性:

·ControlToValidate,表示要验证的控件ID。

·ErrorMessage,表示当检查不合法时,出现的错误提示信息。

·Text,控件中显示的字符串。

2)CompareValidator控件

使用CompareValidator控件来测试用户的输入是否符合指定的值或者符合另一个输入控件的值。CompareValidator控件常常用在容易发生输入错误的地方,例如不显示用户实际输入的密码字段。

在下面的示例中,一个CompareValidator控件验证两个TextBox控件txtPassword1和txtPassword2的值是否相同。

<asp:TextBoxID="txtPassord1"runat="server">Enteryourpassword</asp:TextBox>

<asp:TextBoxID="txtPassword2"runat="server"> Enteryourpasswordagain

</asp:TextBox>

<asp:CompareValidatorID="CompareValidator1"runat="server"

ControlToCompare="txtPassword1"

ControlToValidate="txtPassword2"

ErrorMessage="Thesefieldsdonotmatch">

</asp:CompareValidator>

CompareValidator验证控件的属性:

·ControlToValidate,表示要验证的控件ID。

·ControlToCompare,用来比较控件的ID。如果需要将一个输入控件的值同某个常数值相比较,则可以通过设置ValueToCompare属性指定要比较的常数值。

ValueToCompare,用来确定要比较的某个常数值,使用管道字符“|”来分隔多个值。这个属性最好用来验证常量值(如一个最小年龄限制),而对于很可能变化的值,需要使用CustomValidator控件来比较。

·Type,表示要比较的控件的数据类型。如果希望输入控件中的值与某个数据类型匹配,可以使用这个属性。

·

Operator,指定要使用的比较运算符。使用比较运算符的名称来指定运算符,如Equal、NotEqual、GreaterThan和GreaterThanEqual等。

·ErrorMessage,表示当检查不合格时,出现的错误提示信息。

·Text,控件中显示的字符串。

3)

RangeValidator控件

RangeValidator控件用来测试输入值是否在给定的范围内。输入的值介于最小值和最大值之间(包括最小值和最大值)是有效的。RangeValidator控件通常被用来验证输入值(如年龄、身高、薪水和孩子个数)是否匹配预期的范围。RangeValidator控件可以把空输入控件作为有效控件进行验证。在下面的例子中,RangeValidator控件验证命名为txtAge的TextBox控件是否有一个介于18~50之间的值:

<asp:TextBoxID="txtAge"runat="server">Enteryourage

</asp:TextBox>

<asp:RangeValidatorID="txtAgeValidator"Display="Dynamic"runat="server"

ControlToValidate="txtAge"

ErrorMessage="Applicantsmustbebetween18and50"

MaximumValue="50"

MinimumValue="18"

Type="Integer">*

</asp:RangeValidator>

RangeValidator验证控件的属性:

·ControlToValidate,表示要验证的控件ID。

·Type,表示要比较的控件的数据类型。在任何比较执行之前,比较的值会被转换成这种数据类型。

·MaximumValue,表示有效范围的最大值(对数字变量),或字符串的最大字符长度(对字符串变量)。

·MinimumValue,表示有效范围的最小值(对数字变量),或字符串的最小字符长度(对字符串变量)。

·ErrorMessage,表示当检查不合格时,出现的错误提示信息。

·Text,控件中显示的字符串。

4)

RegularExpressionValidator控件

当验证一个用户的输入是否匹配预定义的模式时(比如一个电话号码、邮政编码或者电子邮件地址),必须使用RegularExpressionValidator控件。这个验证控件把用户输入的字符、数字和符号的模式与控件中的一个或多个模式相比较。当在属性窗口单击ValidationExpression时,.NET提供一套预置的正则表达式模式。这些模式包括电子邮件、网站地址、电话号码和邮政编码。如要创建一种新的模式,可选择Custom(自定义)模板,此时可编辑最后一次选中的模式,并以此模式为基础创建自定义模式。

正则表达式的控制字符集如表4-4所示。表4-4正则表示式的控制字符集下面的代码显示了如何使用RegularExpressionValidator控件来检查用户是否输入了一个有效的电子邮件地址:

<asp:TextBoxID="ContrEmail"runat="server"></asp:TextBox>

<asp:RegularExpressionValidatorID="RegularExpressionValidator1" runat="server"

ControlToValidate="ContrEmail"

ErrorMessage="E_mail格式不正确"

ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">

</asp:RegularExpressionValidator>

说明:

·ControlToValidate,表示要验证的控件ID。

·RegularExpressionValidator,指定用于输入控件的正则表达式。

·ErrorMessage,表示当检查不合格时,出现的错误提示信息。

·Text,控件中显示的字符串。

5)

CustomValidator控件

当使用自己定制的验证逻辑,针对变量、公式或其他来源的输入,检查用户输入时,就要用CustomValidator控件。CustomValidator控件通常用于类似密码验证的情形,将用户输入的密码和一个存储在用户数据库中的密码相比较。

CustomValidator控件既可以实现服务器端的验证,也可以实现客户端的验证。与其他的验证控件不同,必须为CustomValidator控件编写验证脚本,通过使用属性args.IsValid来设置CustomValidator控件有效或者无效。下面的例子中,显示一个CustomValidator控件的服务器端和客户端程序,检查输入控件中输入的数字是否为偶数。

(1)客户端程序

<scripttype="text/javascript"language="javascript">

functionMyClientFunction(source,arguments){

alert("Iamrunningontheclient!");

varintValue=arguments.Value;

if(intValue%2==0){

arguments.IsValid=true;

}

else{

arguments.IsValid=false;

}

}

</script>

<asp:CustomValidatorID="CustomValidator1"runat="server"

ClientValidationFunction="MyClientFunction"

ErrorMessage="CustomValidator"

OnServerValidate="MyServerFunction">

</asp:CustomValidator>

(2)服务器端程序

protectedvoidMyServerFunction(objectsource,

ServerValidateEventArgsargs){

intintValue=Convert.ToInt16(args.Value);

if(intValue%2==0){

args.IsValid=true;

}

else{

args.IsValid=false;

}

}

6)Page.IsValid属性和ValidationSummary控件

VisualStudio.NET能够在控件执行操作之前验证页面上所有的控件是否有效。有效性验证可以在客户端进行,也可以在服务器端进行,这取决于正在使用的浏览器。客户端使用ValidationSummary控件进行验证,而服务器端使用Page.IsValid属性进行验证。

(1)

Page.IsValid属性为了确定页面上所有的验证控件是否都是有效的,可以在运行时检查页面的IsValid属性。IsValid属性对页面上所有验证控件的值进行逻辑“与”运算,如果任意一个验证控件是无效的,那么这个IsValid属性就返回False。这个属性提供一个简单的方法来确定Web窗体上的输入控件是否都有效,以及Web窗体是否已经准备继续处理业务逻辑。

验证控件测试用户的输入,设置错误状态,并产生错误信息。然而,验证控件不改变页面的处理流程。例如,如果发现用户输入错误,则验证控件不会绕过代码。相反,在执行应用程序指定的逻辑之前,应该在代码里测试所有控件的状态。如果发现错误,应该终止自己代码的运行,页面继续处理,并将错误信息返回给用户。

下面的示例显示了一个按钮事件处理程序,其功能是测试整个页面的IsValid属性。

protectedvoidButton1_Click(objectsender,EventArgse){

if(Page.IsValid){

Message.Text="Pageisvalid!";

}

}

(2)ValidationSummary控件

当Page.IsValid属性返回False时,ValidationSummary控件将显示错误信息。ValidationSummary控件轮询页面上的每个验证控件,并集中显示每个验证控件的ErrorMessage消息。

ValidationSummary控件显示一个消息框或文本区域,包括一个标题和一个错误列表。根据DisplayMode的值,以项目符号列表或者单一段落的方式显示错误列表。ValidationSu-mmary控件一般放在提交按钮的附近,这样,当触发验证控件时,用户可以很容易地看到所有的错误信息,如图4-6所示。

图4-6带有验证控件的用户注册页面下面的HTML显示一个典型的ValidationSummary控件:

<asp:ValidationSummaryID="ValidationSummary1"runat="server" DisplayMode="List"

HeaderText="Theseerrorswerefound."/>

ValidationSummary控件的属性如下:

·HeaderText,可以在此控件的标题部分指定一个自定义标题。

·ShowSummany,设置在消息中是否显示错误信息摘要。

·DisplayMode,指明可显示为列表或其他格式。

·ShowMessageBox,设置错误消息显示在弹出对话框中。

当使用ValidationSummary控件时,在这个控件上显示ErrorMessage属性的同时,在验证控件的位置上也显示Text属性(如果被使用)。带有红色星号“*”的Text属性通常显示在输入控件的右边,以警告用户没有正确填充输入控件。带有输入错误描述的ErrorMessage属性显示在ValidationSummary控件中,这个控件通常放置在触发事件的控件附近。

任务实现

步骤1打开校园在线超市网站,在“解决方案资源管理器”的“User”文件夹中打开“Register.aspx”。

步骤2添加验证控件,并设置其属性,如图4-7所示。要求:必须填写“用户名”、“密码”和“确认密码”,使用RequiredFieldValidator控件;“密码”和“确认密码”必须一致,使用CompareValidator控件;“手机号码”必须是1开头的数字,使用CustomValidator控件;“Email”必须符合格式要求,使用RegularExpressionValidator控件,“QQ”必须是数字,使用RegularExpressionValidator控件;将错误信息以对话框的形式显示在窗体上弹出,使用ValidationSummary控件。

图4-7添加验证控件步骤3为CustomValidator控件添加客户端程序和服务器端程序。

客户端程序如下所示:

functionClientValidationPhone(source,arguments){

varphone=arguments.Value.toString();

vari;

if(phone.charAt(0)!='1'){

arguments.IsValid=false;

}

else{

for(i=1;i<phone.length;i++){

if(phone.charAt(i)<"0"||phone.charAt(i)>"9"){

arguments.IsValid=false;

}

}

if(i==phone.length){

arguments.IsValid=true;

}

}

}

服务器端程序如下所示:

protectedvoidCustomValidator1_ServerValidate(objectsource,

ServerValidateEventArgsargs){

stringphone=args.Value;

if(phone[0]!='1'){

args.IsValid=false;

}

else{

for(inti=1;i<phone.Length;i++){

if(phone[i]<'0'||phone[i]>'9'){

args.IsValid=false;

}

}

if(i==phone.Length){

args.IsValid=true;

}

}

}

步骤4双击“注册”按钮,给其添加事件处理过程,并在其事件处理过程中添加以下代码,提示用户验证成功:

if(Page.IsValid){

Response.Write("<script>alert('验证成功!')</script>");

}

步骤5浏览“Register.aspx”页面并查看其效果。

任务描述

在校园在线超市系统中,会员注册信息验证成功后,应能保存会员注册的信息到数据库中。

4.3【任务9】会员注册信息存储

必备知识

知识1数据访问模型

1.数据访问原理

在ASP.NET中,数据访问必须依赖于.NETFramework所提供的功能。ASP.NET通过对ADO.NET的引用,实现获取数据和操作数据的目的。具体地说,数据访问涉及四个主要的组件:Web应用程序(ASP.NET)、数据层(ADO.NET)、数据提供程序和数据源。这些组件构成了所有数据访问Web应用程序的基础结构,如图4-8所示。

图4-8数据访问的主要组件

1)数据存储(DataStore)

数据存储是数据存放的源头,通过ADO.NET2.0和ASP.NET2.0的新增控件,Web应用程序能够访问多种数据存储中的数据,包括关系数据库、XML文件、Web服务、平面文件,或诸如MicrosoftExcel电子数据表程序中的数据。

2)数据提供程序(Provider)

为什么可以通过ADO.NET来访问许多不同的数据源呢?这是因为ASP.NET能提供程序模型,这些Provider相当于一个适配器,它将对不同的数据源的数据操作细节隐藏起来,这种模型的灵活性使开发人员只需编写一组数据访问代码就能访问各种类型的数据。

3)数据操作层(DataLayer)

在ADO.NET中,通过ADO.NETAPI定义的抽象层,使所有的数据源看起来都是相同的。不论何种数据源,提取信息的过程都具有相同的关键类和步骤。

4)Web应用程序层

ASP.NET提供一系列控件,这些控件的设计意图是为了减少数据访问的代码量。例如,开发人员能够使用数据源向导自动创建和配置一个数据源,使用这个数据源发布查询和检索结果。此外,不同的控件能够绑定到一个数据源,因此,控件能够依据从数据源检索到的信息,自动设置控件的外观和内容。

在数据访问的四个组件中,其中最主要的就是数据操作层(DataLayer)。通过ADO.NET,开发人员既可以通过编写代码来访问各种数据,也可以通过ASP.NET2.0新增控件实现无代码访问各种数据。

2.ADO.NET访问技术

ADO.NET是一种把基于Microsoft.NET的Web应用程序以及MicrosoftWindows应用程序连接到诸如SQLServer数据库或XML文件等数据源的技术。ADO.NET专门为诸如Internet这样的无连接的工作环境而设计,它提供了一种简单而灵活的方法,便于开发人员把数据访问和数据处理集成到Web应用程序中。

1)

ADO.NET组成

ADO.NET包括两个核心组件,分别是.NETFramework数据提供程序和DataSet数据集。

(1)数据提供程序

数据提供程序用于连接到数据库,执行命令和检索结果。数据提供程序中包含的核心对象如表4-5所示。表4-5ADO.NET的核心对象为了满足不同数据库和不同开发的要求,.NETFramework提供了四个数据提供程序:

·SQLServer.NETFramework数据提供程序

·OLEDB.NETFramework数据提供程序

·ODBC.NETFramework数据提供程序

·Oracle.NETFramework数据提供程序

SQLServer.NETFramework数据提供程序和OLEDB.NETFramework数据提供程序使用的对象名称不同,前者通过SqlConnection、SqlCommand、SqlDataRea-der、SqlDataAdapter对象来访问,后者通过OleDBConnection、OleDBCommand、OleDBDataReader、OleDBDataAdapter对象来访问。

组成ADO.NET的各个对象被包含在不同的命名空间中。如果要处理SQLServer2005数据库中的数据,需要导入System.Data和System.Data.SqlClient;如果要处理Access、SQLServer7.0以下版本、dBase和Oracle数据库中的数据,需要导入System.Data和System.Data.OleDb。

(2)

DataSet对象

在Web应用程序中,DataSet对象用于存储从数据源中收集的数据。处理存储在DataSet中的数据并不需要ASP.NETWeb窗体与数据源保持连接。并且,使用DataSet对象不仅能获取数据源中心的数据,而且还能获得数据源的类型信息,它无需知道从中接受数据的数据源的其他任何信息。仅当数据源中的数据随着改变而被更新的时候,才会重新建立连接。

DataSet对象把数据存储在一个或多个DataTable中。每个DataTable可由来自唯一数据源中的数据组成。与DataSet相关的对象见表4-6所示。表4-6与DataSet相关的对象

2)使用ADO.NET访问数据

ADO.NET提供了一套丰富的对象,用于对几乎任何种类的数据存储的连接式或断开式访问,当然包括关系型数据库。在此模式下,连接会在程序的整个生存周期中保持打开,而不需要对状态进行特殊处理。随着应用程序开发的发展演变,数据处理越来越多地使用多层结构,断开方式的处理模式可以为应用程序提供更好的性能和伸缩性。ADO.NET技术满足了这一需求。图4-9显示了如何使用ADO.NET访问数据。

图4-9使用ADO.NET访问数据

(1)断开式数据访问模式

断开式数据访问模式指的是客户不直接对数据库操作。在.NET平台上,使用各种开发语言开发的数据库应用程序一般并不直接对数据库操作,而是先连接数据库和通过数据适配器填充DataSet对象,然后客户端再通过读取DataSet来需要的数据。同样,在更新数据库中的数据时,也需要首先更新DataSet,然后再通过数据适配器来更新数据库中对应的数据。使用断开式数据访问模式的基本过程如下:

·使用连接对象Connection连接并打开数据库。

·使用数据适配器DataAdapter填充数据集DataSet。

·关闭连接,对DataSet进行操作。

·操作完成后打开连接。

·使用数据适配器DataAdapter更新数据库。

断开式数据访问模式适用于远程数据处理、本地缓存数据及执行大量数据的处理,不需要与数据源保持连接,从而将连接资源释放给其他客户端使用。

(2)连接式数据访问模式

连接式数据访问模式是指用户在操作过程中,与数据库的连接一直保持。如果不需要DataSet所提供的功能,则打开连接后,可以直接使用命令对象Command进行数据库相关操作。使用DataReader对象可以只进只读方式返回数据并显示,从而提供应用程序的性能。在实际应用中,选择数据访问模式的基本原则是首先满足需求,而后考虑性能优化。

知识2使用Connection对象连接数据库

访问数据库的第一项工作就是和数据库建立连接,然后通过这个连接向数据库发送命令和读取返回的数据,在ADO.NET中,这是由Connection对象来实现的。

1.编写代码创建数据库连接

对于不同的数据库的连接,使用的连接对象有所区别,连接字符串也有不同。

1)使用SQLServer.NET数据提供程序连接SQLServer2005数据库

如果需要访问的是SQLServer2005数据库,则需要使用SQLServer.NET数据提供程序,相关的类在System.Data.SqlClient命名空间中,此时需要使用SqlConnection对象来连接数据库。

SqlConnection对象最重要的属性就是ConnectionString属性,该属性将建立连接的详细信息传递给SqlConnection对象,SqlConnection对象通过这个属性所提供的连接字符串来连接数据库。在连接字符串中至少需要包含服务器(Server)、数据库名(Database)和身份验证(UserID/Password)等信息。

ConnectionString中常见的属性如表4-7所示。表4-7ConnectionString的属性连接字符串可以在创建SqlConnection对象时作为参数传递,也可以通过ConnectionString属性来设置。

下面这个例子是一个非常基本的连接字符串,可以用于建立到位于运行代码的同一台机器上的SQLServer的连接:

SqlConnectionsqlconn=newSqlConnection("Server=(local);Database=SuperMarketDB;

IntegratedSecurity=SSPI;");

下面的例子显示一个可用于连接到“使用SQLServer身份验证”的远程服务器MyServer的连接字符串。设置ConnectionTimeout为60秒。

SqlConnectionsqlconn2=newSqlConnection("Server=MyServer;Userid=aa; Database=SuperMarketDB;Passord=abcd; ConnectionTimeout=60;");

在创建SqlConnection对象并正确设置好连接字符串后,.NET并不会自动建立和数据库的连接,还需要使用SqlConnection的Open方法打开连接,从而真正在网上实现一个数据库的连接。连接被打开后就可以通过它访问数据库中的数据,访问完毕之后还需要使用Close方法关闭连接,直到下一次访问数据库时再打开。表4-8SqlConnection对象的主要方法

2)使用OLEDB.NET数据提供程序连接Access数据库

如果需要访问的是Access2000数据库,则使用SQLOLEDB.NET数据提供程序,相关的类都在System.Data.OleDB命名空间中,此时需要使用OleDBConnection对象来连接数据库。

OleDBConnection和SqlConnection的使用基本是一样的,唯一的区别就是ConnectionString的取值有所不同。访问Access数据库的连接字符串中至少需要包含提供者(Provider)和数据库文件名(DataSource)这两个信息,其中的Provider用来指定数据库类型,访问Access时应该为“Microsoft.Jet.OLEDB.4.0”。

下面的例子显示了如何访问Access数据库StudentMS.mdb:

OleDbConnectionoledbconn;

oledbconn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;

DataSource="f:\SuperMarketDB.mdb";

oledbconn.Open();

oledbconn.Close();

2.使用Web.Config文件定义数据连接字符串

在Web应用程序中,往往有多个窗体需要访问数据库,这些页面中都要创建Connection对象,而每次创建Connection对象时又必须设置ConnectionString属性为合适的连接字符串。这样就会造成一个问题,一旦数据库信息发生变化(如SQLServer服务器名改变或者Access数据库文件的存储路径变化),就必须把每个页面中的连接字符串都做改动,为应用程序的维护带来了麻烦。利用ASP.NET的Web.config文件就可以很好地解决这个问题。

下面的示例将连接字符串保存在Web.config文件中:

<connectionStrings>

<addname="DBConnStr"connectionString="DataSource=.;UserID=sa;

InitialCatalog=SuperMarketDB;PersistSecurityInfo=True;"

providerName="System.Data.SqlClient"/>

</connectionStrings>上例在Web.config文件中建立了一个connectionString“DBConnStr”,其中保存了所需的数据库连接字符串(Value的值)。这样,在窗体中创建连接对象时,只需要读取“DBConnStr”的值就行了。

stringmyconnstr=ConfigurationManager.ConnectionStrings["DBConnStr"].

ConnectionString;

SqlConnectionsqlconn=newSqlConnection(myconnstr);

sqlconn.Open();

3.有关Connection对象的更多内容

在编写Web应用程序时,常常会遇到如何使用Connection对象的问题。如果每次访问数据库前打开连接,访问完毕后关闭连接,就会在网络上频繁地建立和撤销到数据库的连接路径,如果在网速较慢或网络工作繁忙的情况下,就可能产生几秒钟的时间延迟。反之,如果为了要减少连接的建立和撤销的次数,而保持连接一直处于打开状态,则在规模较大的应用中,又会使得网络中同时存在过多的连接路径,从而降低网络的利用率。连接池(ConnectionPool)就是解决方法之一。

1)连接池的概念

连接池是一个简单概念。当关闭一个连接时,并不直接撤销网络中的物理数据库连接路径,而是把包括身份验证细节在内的连接详细信息保存在资源池(ResourcePool)中。如果后来又提出连接请求,则首先会检查资源池,查看身份验证信息细节都相同的地方是否有现成的连接可用,且是否正在连接相同的服务器和数据库。如果有与要求的连接标准相匹配的现成连接,就使用它而不必再创建一个新的连接。不过,如果连接池中没有合适的连接可用,那么就需要新建一个连接。

ADO.NET中默认情况下会启用连接池。如果用户要防止某一连接在关闭后被加入到连接池中,也可以将连接字符串中的Pooling属性设置为False。下面的代码设置连接池禁用:

SqlConnectionconn=newSqlConnection("Database=library;UserId=sa;

Password=;Pooling=False");物理数据库连接不能同时由多个对象共享,因此可以将连接池当作当前未使用的数据库连接的保存工具。调用SqlConnection对象的Open方法可以使连接池将现有数据库连接释放给请求连接的对象。在没有明确调用SqlConnection的Close方法前,数据库连接都不能放回到连接池中。如果将数据库连接返回到连接池中,其他SqlConnection对象就可以使用它。

为了发挥连接池的作用,需要注意以下两点:

·在结束使用SqlConnection对象时必须调用Close方法,以便连接返回到连接池中,SqlConnection对象超出范围时是不会将连接返回到连接池中的。

·使用连接池的所有连接都应有完全相同的连接字符串,它包括Connection-

String属性中的所有内容(例如Pooling)。如果这些字符串不相同,那么就会创建多个连接池,也就是说,每个不同的连接字符串都有一个连接池。

2)连接池的大小

连接池的大小是影响网络利用效率的重要因素之一。在快速网络上,可以适当加大连接池的大小,而在慢速网络中,则必须减小连接池的大小。连接字符串的MinPoolSize和MaxPoolSize属性用于设置连接池中将保留的连接数,从而确定连接池的大小。

MinPoolSize设定打开第一个连接时自动在连接池中打开多少连接,默认值是0。但是如果经常同时使用多个到特定数据源的连接,就可以增加该值。对于标准的客户/服务器应用程序,这不多见,但是在开发Web应用程序时,这也许就是恰当的。

MaxPoolSize属性指定连接池中可以保留的连接的最大数量。这样就可以限制从应用程序打开的连接数量,防止打开过多的数据库连接数量。如果一个连接对象在请求连接时连接池中没有可用的连接,该对象将等待一段时间(由ConnectionTimeout设定),如果仍然没有连接可用,则抛出InvalidOperationException异常。

在下面的例子中,首先创建了两个连接,第3个连接请求将等待超时时间,由于连接池中没有连接可用,所以最终该连接请求会超时并抛出异常(默认时间为15秒):

SqlConnectionconn1=newSqlConnection("Database=library;UserId=sa;Password=;

Pooling=True;MaxPoolSize=2;");

conn1.Open();//成功

SqlConnectionconn2=newSqlConnection("Database=library;UserId=sa;Password=;

Pooling=True;MaxPoolSize=2;");

conn2.Open();//成功

SqlConnectionconn3=newSqlConnection("Database=library;UserId=sa;Password=;

Pooling=True;MaxPoolSize=2;");

conn3.Open();//15秒后失败,因为连接池中已经没有可用的连接了知识3使用Command对象操作数据库

1.Command对象

在连接好数据源后,就可以对数据源执行一些命令操作。命令操作包括从数据存储区(数据库、数据文件等)检索或对数据存储区进行插入、更新、删除等操作。在ADO.NET中,对数据库的命令操作通过Command对象实现。常用的SQL语句命令如Select、Update、Delete、Insert等都可以在Command对象中创建。

在.NET的两个标准数据提供程序SQLServer.NET数据提供程序和OLEDB.NET数据提供程序中,Command对象分别叫做SqlCommand和OleDbCommand,两者的用法基本一致。这里围绕SqlCommand对象进行介绍。

1)

SqlCommand对象的属性

SqlCommand对象的主要属性如表4-9所示。

CommandText是SqlCommand类中最常用的属性,可以由任何有效的T-SQL命令或T-SQL命令组组成。例如,包括Select、Insert、Update和Delete语句以及存储过程,还可以指定由逗号分隔的表名或存储过程名。在调用方法执行CommandText中的命令前,还要正确设置CommandType和Connection属性。

表4-9SqlCommand对象的主要属性下面的例子显示如何使用Text的命令类型,并指定T-SQL命令作为SqlCommand对象的文本:

SqlCommandcmd;

cmd.Connection=conn;

cmd.CommandType=CommandType.Text;

cmd.CommandText="Select*fromT_Ware";

下面的例子中使用StordProcedure命令类型指明SqlCommand对象执行在CommandText属性中指定的存储过程。

SqlCommandcmd;

cmd.Connection=conn;

cmd.CommandType=CommandType.StoredProcedure;

cmd.CommandText="GetAllWares";

2)SqlCommand对象的方法

SqlCommand对象的主要方法如表4-10所示。

表4-10SqlCommand对象的主要方法

SqlCommand提供三种不同的方法在SQLServer上执行T-SQL语句,所有这些方法在内部的工作方式都非常相似。每种方法都会将在SqlCommand对象中形成的命令详细信息传递给指定的连接对象。然后,通过SqlConnection对象在SQLServer上执行T-SQL语句,最后根据语句执行结果生成一组数据,这些数据在不同的方法中有不同的表现形式。

(1)

ExecuteNonQuery

ExecuteNonQuery方法将在SQLServer上执行指定的T-SQL语句,但是它只返回受T-SQL语句影响的行数,因此,它适合执行不返回结果集的T-SQL命令。

这些命令有数据定义语句(DDL)命令,如CreateTable、CreateView、DropTable;还有数据操作语言(DML)命令,如Insert、Update和Delete;也可以用于执行不返回结果集的存储过程。

下面的例子实现创建到SQLServer的连接,使用ExecuteNonQuery运行三个T-SQL命令。第一个命令创建一个新的临时表,第二个命令将一行插入到该临时表中,并且将返回行中受影响的参数,第三个命令则删除该临时表。

stringmyconnstr=

ConfigurationManager.ConnectionStrings["DBConnStr"].ConnectionString;

SqlConnectionsqlconn=newSqlConnection(myconnstr);

SqlCommandcmd;

cmd.Connection=sqlconn;

cmd.CommandType=CommandType.Text;

sqlconn.Open();

cmd.CommandText="CreateTableTempTable(IDColInt)";

cmd.ExecuteNonQuery();

cmd.CommandText="InsertTempTable(IDCol)Values(1)";

introwsaffecred;

rowsaffecred=cmd.ExecuteNonQuery();

cmd.CommandText="DropTableTempTable";

cmd.ExecuteNonQuery();

sqlconn.Close();

(2)

ExecuteReader

ExecuteReader方法用于返回DataReader对象。DataReader对象是一种从SQLServer中检索单一结果集的高速只读方法。

下面的例子实现执行T-SQL命令并遍历结果集,将一列数据输出到页面上。

Stringstr=“selectSPMCfromT_SPXX”;

Sqlcommandscmd=newSqlcommand(str,conn);

SqlDataReadersdr=scmd.ExecuterReader();

while(sdr.Read()){

Label1.Text=sdr[“SPMC”].ToString()+”<br>”;

}

(3)

ExecuteScalar方法

ExecuteScalar方法执行后返回一个单值,多用于使用聚合函数的情况,如COUNT(*)之类的聚合函数。

下面的例子使用ExecuteScalar方法在表上执行COUNT(*),返回其结果并输出到页

面上。

Stringstr=“selectcount(*)fromT_SPXX”;

Sqlcommandscmd=newSqlcommand(str,conn);

intcount=Convert.toInt32(scmd.ExecuteScalar());

2.使用Command对象操作数据

1)使用Command对象操作数据的基本步骤

使用Command对象实现数据库的操作,对于编写与数据库相关的应用程序来说是必须的,它是典型的ADO.NET连接式操作模式。其基本步骤包括:

·打开到数据库的连接。

·创建新的Command对象。

·定义T-SQL命令。

·执行T-SQL命令。

·关闭数据库的连接。在定义T-SQL命令时,与下面类似的T-SQL命令经常会用到。这就需要在书写T-SQL命令时注意数据类型和标点符号,同时必须在英文状态下书写,否则程序在编译时会出错。

stringSQLStr="select*fromT_Warewhereid="+vid;

stringSQLStr="deletefromT_Warewhereid="+vid;

stringSQLStr="updateT_Waresetusername='"+TextBox1.Text= "',where id="+vid;

stringSQLStr="insertintoT_Warevalues('"+strName+"','"+strSex+"','" +strPost+"','"+strCompany+"')";在下面的例子中,获取用户在文本框中输入的姓名、性别、职务、公司、联系方式等信息,实现向数据库插入一条记录。

stringstrName=TextBox1.Text;

stringstrSex=TextBox2.Text;

stringstrPost=TextBox3.Text;

stringstrCompany=TextBox4.Text;

stringstrContact=TextBox5.Text;

stringconnstr=ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;

SqlConnectionconn=newSqlConnection(connstr);

conn.Open();

stringSQLStr="insertintoT_Warevalues('"+strName+"','"+strSex+"','" +strPost+"','"+strCompany+"','"+lx+"')";

SqlCommandcmd=newSqlCommand(SQLStr,conn);

cmd.ExecuteNonQuery();

conn.Close();

2)在操作数据时使用SQL参数

在实际应用中,常常需要用户在页面上输入信息,并将这些信息插入到数据库中。只要允许用户输入数据,就会增加将错误引入数据库的危险性,并可能对Web应用程序创建和执行SQL代码产生致命的影响。为了解决这个问题,除了前面讲到的使用ASP.NET验证控件对输入控件进行检查之外,还需要在生成T-SQL命令时不使用窗体变量而使用SQL参数来构造连接字符串。SQL参数不属于SQL查询的可执行脚本部分。由于错误或恶意的用户输入不会处理成可执行脚本,因此不会影响SQL查询的执行结果。

(1)

Parameters属性和SqlParameter对象

要在ADO.NET对象模型中使用SQL参数,需要向Command对象的Parameters集合中添加Parameter对象。在使用SQLServer.NET数据提供程序时,要使用的Parameter类为SqlParameter。

创建SqlParameter对象,必须确定包括Value在内的一些属性,其主要属性如表4-11所示。表4-11SqlParameter对象的主要方法

SqlDbType是SqlParameter对象的重要属性之一,通过它来控制向SQLServer数据库传递参数信息时所使用的数据类型。此属性接受来自SqlDbType枚举中的值,如NVarChar、Int、DateTime、Bit、Money、Text、Image等。另外,Direction属性可以设置参数的方向。在查询中使用参数以向数据库传递数据,还可以使用参数从数据库获取数据。例如,通过输出参数从数据库的单一行中获取数据,而不是通过SqlDataReader来查看一个数据行。由于参数所涉及的开销少于结果集,因此通过输出参数来返回数据的速度更快一些。

(2)使用SQL参数的基本步骤

使用SQL参数的基本步骤如下:

·使用parameters构建SqlCommand命令字符串。

·声明SqlParameter对象,并赋值。

·将SqlParameter对象赋值给SqlCommand对象的Parameters属性。

对上面的例子进行修改,获取用户在文本框中输入的姓名、性别、职务、公司、联系方式等信息,向数据库插入一条记录时使用SQL参数实现。

stringstrName=TextBox1.Text;

stringstrSex=TextBox2.Text;

stringstrPost=TextBox3.Text;

stringstrCompany=TextBox4.Text;

stringstrContact=TextBox5.Text;

st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论