《ASP NET程序設(shè)計(jì)案例教程》課件第4章_第1頁
《ASP NET程序設(shè)計(jì)案例教程》課件第4章_第2頁
《ASP NET程序設(shè)計(jì)案例教程》課件第4章_第3頁
《ASP NET程序設(shè)計(jì)案例教程》課件第4章_第4頁
《ASP NET程序設(shè)計(jì)案例教程》課件第4章_第5頁
已閱讀5頁,還剩143頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第4章模塊3——會員注冊管理4.1【任務(wù)7】會員注冊UI設(shè)計(jì)4.2【任務(wù)8】會員信息驗(yàn)證4.3【任務(wù)9】會員注冊信息存儲

【本章提要】

本章圍繞校園在線超市系統(tǒng)中會員注冊管理模塊的實(shí)現(xiàn),首先通過會員注冊UI設(shè)計(jì)任務(wù)的實(shí)現(xiàn)過程,介紹了ASP.NET2.0中選擇類控件的使用;然后通過對會員信息的驗(yàn)證敘述了服務(wù)器驗(yàn)證控件的使用;最后以注冊信息存儲到數(shù)據(jù)庫中為要求,介紹了ADO.NET數(shù)據(jù)訪問模型的概念,并介紹了數(shù)據(jù)訪問對象Connection、Command和DataReader的使用。

【學(xué)習(xí)目標(biāo)】

·掌握選擇類控件的使用。

·掌握驗(yàn)證控件。

·理解數(shù)據(jù)訪問模型的概念。

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

任務(wù)描述

在校園在線超市系統(tǒng)中,要實(shí)現(xiàn)會員注冊功能,首先應(yīng)該有一個注冊頁面,能夠輸入會員的相關(guān)信息,如用戶名、密碼、性別、職業(yè)、愛好、電話、電子郵件等。那么,這些信息的錄入需要哪些控件呢?這些控件又該如何訪問呢?4.1【任務(wù)7】會員注冊UI設(shè)計(jì)必備知識

知識1選擇類控件的使用

選擇類控件主要包括單選按鈕、復(fù)選按鈕、下拉式列表和列表框。這類控件的屬性中均有一個項(xiàng)目集合屬性,單擊后可出現(xiàn)添加項(xiàng)目窗口,并可設(shè)置項(xiàng)目的顯示文本和相應(yīng)的值,如圖4-1所示。同時,也可以通過編程的方式添加和移除項(xiàng)目。這類控件還支持?jǐn)?shù)據(jù)源的數(shù)據(jù)綁定。

1.RadioButton控件和RadioButtonList控件

RadioButton控件是單個的單選按鈕控件,RadioButtonList控件是作為單選按鈕列表項(xiàng)集合的父控件,它們都可以實(shí)現(xiàn)單一選擇。

RadioButton控件的HTML標(biāo)簽:

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

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

RadioButtonList控件的HTML標(biāo)簽

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

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

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

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

</asp:RadioButtonList>讀取按鈕組中的值 :

stringsex=RadioButtonList1.SelectedItem.Value;

設(shè)置單選按鈕組的方向:

RadioButtonList1.RepeatDirection=RepeatDirection.Horizontal;

圖4-1選擇類控件添加項(xiàng)目

2.CheckBoxList控件

作為復(fù)選框控件列表集合的父控件,CheckBoxList控件可以實(shí)現(xiàn)多項(xiàng)選擇。

CheckBoxList控件的HTML標(biāo)簽:

<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>上網(wǎng)</asp:ListItem>

</asp:CheckBoxList>

統(tǒng)計(jì)復(fù)選框組中的項(xiàng)數(shù):

intnumber=CheckBoxList1.Items.Count;

判斷復(fù)選框組中的項(xiàng)是否被選中:

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

獲取復(fù)選框組中項(xiàng)的值:

stringstr=CheckBoxList1.Items[i].Value;獲取復(fù)選框組中每一項(xiàng)的值:

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

stringstrList="";

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

{

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

}

}

3.DropDownList控件

DropDownList控件可以創(chuàng)建單一選擇的下拉列表控件。

DropDownList控件的HTML標(biāo)簽:

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

OnSelectedIndexChanged="ContrGrade_SelectedIndexChanged">

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

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

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

</asp:DropDownList>

改變選項(xiàng)后立即提交服務(wù)器:

ContrGrade.AutoPostBack="true";

獲取下拉列表中選中項(xiàng)的值:

stringstrList=DropDownList.SelectedItem.Value;

事件選項(xiàng)改變觸發(fā)的事件處理程序:

protectedvoidContrGrade_SelectedIndexChanged(objectsender,

EventArgse){

stringstrList=DropDownList1.SelectedItem.Value;

Label1.Text=strList;

}

任務(wù)實(shí)現(xiàn)

步驟1打開校園在線超市網(wǎng)站,在“解決方案資源管理器”的“User文件夾”中選擇“增加新項(xiàng)”,設(shè)置名稱為“Register.aspx”,語言為“VistualC#”,勾選“選擇母版頁”,并點(diǎn)擊“添加”按鈕,如圖4-2所示。

圖4-2添加新項(xiàng)步驟2在出現(xiàn)的“選擇母版頁”對話框中,選擇站點(diǎn)根目錄下的母版“MasterPage.master”,并點(diǎn)擊“確定”按鈕,如圖4-3所示。

圖4-3選擇母版頁步驟3從新建的內(nèi)容頁“user/Register.aspx”中切換到設(shè)計(jì)視圖,將Label控件、TextBox控件、RadioButtonList控件、CheckBoxList控件、DropDownList控件、Button控件從工具箱拖放到頁面,設(shè)置其屬性,并采用表格布局,如圖4-4所示。

圖4-4Register.aspx內(nèi)容頁步驟4為“性別”欄中所拖入的RadioButtonList控件添加兩個選項(xiàng),分別為“男”、“女”,其Text屬性與Value屬性相同,默認(rèn)值為“男”,并設(shè)置其RepeatDirection屬性為Horizontal。

步驟5瀏覽“Register.aspx”頁面,查看其顯示效果。

任務(wù)描述

在校園在線超市系統(tǒng)中,當(dāng)會員進(jìn)行信息填寫時,有必要對用戶輸入的信息進(jìn)行驗(yàn)證,以保證輸入數(shù)據(jù)的完整性和安全性。4.2【任務(wù)8】會員信息驗(yàn)證

知識1驗(yàn)證概述

1.數(shù)據(jù)驗(yàn)證的必要性

輸入驗(yàn)證是檢驗(yàn)Web窗體中用戶的輸入是否和期望的數(shù)據(jù)值、范圍或格式相匹配的過程。通過數(shù)據(jù)驗(yàn)證可以有效減少等待錯誤信息的時間,降低發(fā)生錯誤的可能性,從而改善用戶訪問Web站點(diǎn)的體驗(yàn)。必備知識

1)驗(yàn)證控件的值

在很多情況下,我們期望用戶輸入的值應(yīng)該符合某種類型、在一定范圍內(nèi)或符合一定的格式等,對于這些要求,通過使用驗(yàn)證控件將能很容易地實(shí)現(xiàn)。

2)錯誤阻塞處理

當(dāng)頁面驗(yàn)證沒有通過時,頁面將不會被提交或不會被處理,直到驗(yàn)證通過,頁面才可能被提交處理。

3)對欺騙和惡意代碼的處理

驗(yàn)證還會保護(hù)Web頁面避免兩種威脅:欺騙和惡意代碼。當(dāng)惡意用戶修改收到的HTML頁面,并返回一個看起來輸入有效或已通過授權(quán)檢查的值時,就發(fā)生了惡意欺騙。由此可以看出,欺騙往往是通過繞過客戶端驗(yàn)證來達(dá)到目的的。因此,運(yùn)行ASP.NET服務(wù)器端驗(yàn)證將能有效地阻止欺騙。

當(dāng)惡意用戶向Web頁的無輸入驗(yàn)證的控件添加無限制的文本時,就有可能輸入了惡意代碼。當(dāng)這個用戶向服務(wù)器發(fā)送下個請求時,已添加的代碼可能對Web服務(wù)器或任何與之連接的應(yīng)用程序造成破壞。

2.?dāng)?shù)據(jù)驗(yàn)證過程

數(shù)據(jù)發(fā)送到服務(wù)器端之前,驗(yàn)證控件會在瀏覽器內(nèi)執(zhí)行錯誤檢查,并立即給出錯誤提示,如果發(fā)生錯誤,則不能提交網(wǎng)頁。出于安全考慮,任何在客戶端進(jìn)行的輸入驗(yàn)證都會在服務(wù)器再次進(jìn)行驗(yàn)證。

在服務(wù)器處理請求之前,驗(yàn)證控件會對該請求中輸入控件的數(shù)據(jù)合法性進(jìn)行驗(yàn)證,行使一個類似數(shù)據(jù)過濾器的角色,即在處理Web頁或服務(wù)器邏輯之前對數(shù)據(jù)進(jìn)行驗(yàn)證。如果有不符合驗(yàn)證邏輯的數(shù)據(jù),則中斷執(zhí)行并返回錯誤信息。驗(yàn)證過程如圖4-5所示。

圖4-5數(shù)據(jù)驗(yàn)證過程知識2驗(yàn)證的對象模型

驗(yàn)證控件在客戶端上呈現(xiàn)的對象模型與在服務(wù)器上呈現(xiàn)的對象模型幾乎完全相同,但是在公開驗(yàn)證信息的方式上有所不同。服務(wù)器端通過對控件的屬性設(shè)置來實(shí)現(xiàn),而客戶端則使用全局變量來實(shí)現(xiàn)。表4-1列出了客戶端和服務(wù)器端對象模型。表4-1客戶端和服務(wù)器端對象模型在服務(wù)器端,通過使用由各個驗(yàn)證控件和頁面公開的對象模型,可以與驗(yàn)證控件進(jìn)行交互。每個驗(yàn)證控件都有自己的IsValid屬性,該屬性用來確定該控件是否通過驗(yàn)證測試。而每一個Web頁面也公開一個IsValid屬性,它匯總頁面上所有驗(yàn)證控件的IsValid狀態(tài),該屬性允許執(zhí)行單個測試,以確定是否應(yīng)該繼續(xù)執(zhí)行。頁面還公開一個包含頁面上所有驗(yàn)證控件的列表的Validators集合,利用這一集合可依次檢查單個驗(yàn)證控件的狀態(tài)。在客戶端,網(wǎng)頁將包含對執(zhí)行客戶端驗(yàn)證所用的腳本庫的引用,此外還包含客戶端方法,以便在網(wǎng)頁提交前截獲并處理Click事件。

知識3ASP.NET的驗(yàn)證類型

在ASP.NET中,輸入驗(yàn)證是通過向ASP.NET網(wǎng)頁添加驗(yàn)證控件來完成的。驗(yàn)證控件為所有常用的標(biāo)準(zhǔn)驗(yàn)證類型提供了一種易于使用的機(jī)制以及自定義驗(yàn)證的方法。此外,驗(yàn)證控件還允許自定義向用戶顯示錯誤信息的方法。驗(yàn)證控件可與ASP.NET網(wǎng)頁上的任何控件一起使用。常規(guī)的驗(yàn)證類型如表4-2所示。表4-2驗(yàn)證類型

知識4服務(wù)器驗(yàn)證控件

1.錯誤信息的布局與顯示

當(dāng)錯誤信息出現(xiàn)在頁面上時,它成為頁布局的一部分。因此,需要在進(jìn)行頁的布局設(shè)計(jì)時考慮這一因素,以放置可能出現(xiàn)的任何錯誤信息。一般通過設(shè)置驗(yàn)證控件的Display屬性來控制布局,該屬性的選項(xiàng)如表4-3所示。表4-3驗(yàn)證控件的Display屬性值

2.使用驗(yàn)證控件

1)RequiredFieldValidator控件

該控件可以強(qiáng)制用戶在輸入控件中輸入內(nèi)容。當(dāng)驗(yàn)證執(zhí)行時,如果輸入控件包含的值為空,則驗(yàn)證失敗。在頁中添加RequiredFieldValidator控件并將其鏈接到相關(guān)的控件,可以指定用戶在ASP.NET網(wǎng)頁上的相關(guān)控件中必須輸入信息。

如果驗(yàn)證在客戶端執(zhí)行,則用戶可以在使用該頁時將必填字段設(shè)為空白(或保留默認(rèn)值),但必須在提交頁之前提供非默認(rèn)值。但是,在字段中輸入值之后,用戶便無法清除該字段(或?qū)⑵浠謴?fù)為默認(rèn)值)。如果清除該字段,用戶在試圖離開該字段時會立即見到錯誤信息。在服務(wù)器驗(yàn)證中,頁提交之前不進(jìn)行檢查,用戶在提交頁后才會看到錯誤信息。

在下面的示例中,RequiredFieldValidator控件驗(yàn)證TextBox控件“txtName”是否為空。

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

</asp:TextBox>

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

ControlToValidate="txtName"

ErrorMessage="RequiredFieldValidator">

</asp:RequiredFieldValidator>

RequiredFieldValidator驗(yàn)證控件的屬性:

·ControlToValidate,表示要驗(yàn)證的控件ID。

·ErrorMessage,表示當(dāng)檢查不合法時,出現(xiàn)的錯誤提示信息。

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

2)CompareValidator控件

使用CompareValidator控件來測試用戶的輸入是否符合指定的值或者符合另一個輸入控件的值。CompareValidator控件常常用在容易發(fā)生輸入錯誤的地方,例如不顯示用戶實(shí)際輸入的密碼字段。

在下面的示例中,一個CompareValidator控件驗(yàn)證兩個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驗(yàn)證控件的屬性:

·ControlToValidate,表示要驗(yàn)證的控件ID。

·ControlToCompare,用來比較控件的ID。如果需要將一個輸入控件的值同某個常數(shù)值相比較,則可以通過設(shè)置ValueToCompare屬性指定要比較的常數(shù)值。

ValueToCompare,用來確定要比較的某個常數(shù)值,使用管道字符“|”來分隔多個值。這個屬性最好用來驗(yàn)證常量值(如一個最小年齡限制),而對于很可能變化的值,需要使用CustomValidator控件來比較。

·Type,表示要比較的控件的數(shù)據(jù)類型。如果希望輸入控件中的值與某個數(shù)據(jù)類型匹配,可以使用這個屬性。

·

Operator,指定要使用的比較運(yùn)算符。使用比較運(yùn)算符的名稱來指定運(yùn)算符,如Equal、NotEqual、GreaterThan和GreaterThanEqual等。

·ErrorMessage,表示當(dāng)檢查不合格時,出現(xiàn)的錯誤提示信息。

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

3)

RangeValidator控件

RangeValidator控件用來測試輸入值是否在給定的范圍內(nèi)。輸入的值介于最小值和最大值之間(包括最小值和最大值)是有效的。RangeValidator控件通常被用來驗(yàn)證輸入值(如年齡、身高、薪水和孩子個數(shù))是否匹配預(yù)期的范圍。RangeValidator控件可以把空輸入控件作為有效控件進(jìn)行驗(yàn)證。在下面的例子中,RangeValidator控件驗(yàn)證命名為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驗(yàn)證控件的屬性:

·ControlToValidate,表示要驗(yàn)證的控件ID。

·Type,表示要比較的控件的數(shù)據(jù)類型。在任何比較執(zhí)行之前,比較的值會被轉(zhuǎn)換成這種數(shù)據(jù)類型。

·MaximumValue,表示有效范圍的最大值(對數(shù)字變量),或字符串的最大字符長度(對字符串變量)。

·MinimumValue,表示有效范圍的最小值(對數(shù)字變量),或字符串的最小字符長度(對字符串變量)。

·ErrorMessage,表示當(dāng)檢查不合格時,出現(xiàn)的錯誤提示信息。

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

4)

RegularExpressionValidator控件

當(dāng)驗(yàn)證一個用戶的輸入是否匹配預(yù)定義的模式時(比如一個電話號碼、郵政編碼或者電子郵件地址),必須使用RegularExpressionValidator控件。這個驗(yàn)證控件把用戶輸入的字符、數(shù)字和符號的模式與控件中的一個或多個模式相比較。當(dāng)在屬性窗口單擊ValidationExpression時,.NET提供一套預(yù)置的正則表達(dá)式模式。這些模式包括電子郵件、網(wǎng)站地址、電話號碼和郵政編碼。如要創(chuàng)建一種新的模式,可選擇Custom(自定義)模板,此時可編輯最后一次選中的模式,并以此模式為基礎(chǔ)創(chuàng)建自定義模式。

正則表達(dá)式的控制字符集如表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,表示要驗(yàn)證的控件ID。

·RegularExpressionValidator,指定用于輸入控件的正則表達(dá)式。

·ErrorMessage,表示當(dāng)檢查不合格時,出現(xiàn)的錯誤提示信息。

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

5)

CustomValidator控件

當(dāng)使用自己定制的驗(yàn)證邏輯,針對變量、公式或其他來源的輸入,檢查用戶輸入時,就要用CustomValidator控件。CustomValidator控件通常用于類似密碼驗(yàn)證的情形,將用戶輸入的密碼和一個存儲在用戶數(shù)據(jù)庫中的密碼相比較。

CustomValidator控件既可以實(shí)現(xiàn)服務(wù)器端的驗(yàn)證,也可以實(shí)現(xiàn)客戶端的驗(yàn)證。與其他的驗(yàn)證控件不同,必須為CustomValidator控件編寫驗(yàn)證腳本,通過使用屬性args.IsValid來設(shè)置CustomValidator控件有效或者無效。下面的例子中,顯示一個CustomValidator控件的服務(wù)器端和客戶端程序,檢查輸入控件中輸入的數(shù)字是否為偶數(shù)。

(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)服務(wù)器端程序

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能夠在控件執(zhí)行操作之前驗(yàn)證頁面上所有的控件是否有效。有效性驗(yàn)證可以在客戶端進(jìn)行,也可以在服務(wù)器端進(jìn)行,這取決于正在使用的瀏覽器??蛻舳耸褂肰alidationSummary控件進(jìn)行驗(yàn)證,而服務(wù)器端使用Page.IsValid屬性進(jìn)行驗(yàn)證。

(1)

Page.IsValid屬性為了確定頁面上所有的驗(yàn)證控件是否都是有效的,可以在運(yùn)行時檢查頁面的IsValid屬性。IsValid屬性對頁面上所有驗(yàn)證控件的值進(jìn)行邏輯“與”運(yùn)算,如果任意一個驗(yàn)證控件是無效的,那么這個IsValid屬性就返回False。這個屬性提供一個簡單的方法來確定Web窗體上的輸入控件是否都有效,以及Web窗體是否已經(jīng)準(zhǔn)備繼續(xù)處理業(yè)務(wù)邏輯。

驗(yàn)證控件測試用戶的輸入,設(shè)置錯誤狀態(tài),并產(chǎn)生錯誤信息。然而,驗(yàn)證控件不改變頁面的處理流程。例如,如果發(fā)現(xiàn)用戶輸入錯誤,則驗(yàn)證控件不會繞過代碼。相反,在執(zhí)行應(yīng)用程序指定的邏輯之前,應(yīng)該在代碼里測試所有控件的狀態(tài)。如果發(fā)現(xiàn)錯誤,應(yīng)該終止自己代碼的運(yùn)行,頁面繼續(xù)處理,并將錯誤信息返回給用戶。

下面的示例顯示了一個按鈕事件處理程序,其功能是測試整個頁面的IsValid屬性。

protectedvoidButton1_Click(objectsender,EventArgse){

if(Page.IsValid){

Message.Text="Pageisvalid!";

}

}

(2)ValidationSummary控件

當(dāng)Page.IsValid屬性返回False時,ValidationSummary控件將顯示錯誤信息。ValidationSummary控件輪詢頁面上的每個驗(yàn)證控件,并集中顯示每個驗(yàn)證控件的ErrorMessage消息。

ValidationSummary控件顯示一個消息框或文本區(qū)域,包括一個標(biāo)題和一個錯誤列表。根據(jù)DisplayMode的值,以項(xiàng)目符號列表或者單一段落的方式顯示錯誤列表。ValidationSu-mmary控件一般放在提交按鈕的附近,這樣,當(dāng)觸發(fā)驗(yàn)證控件時,用戶可以很容易地看到所有的錯誤信息,如圖4-6所示。

圖4-6帶有驗(yàn)證控件的用戶注冊頁面下面的HTML顯示一個典型的ValidationSummary控件:

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

HeaderText="Theseerrorswerefound."/>

ValidationSummary控件的屬性如下:

·HeaderText,可以在此控件的標(biāo)題部分指定一個自定義標(biāo)題。

·ShowSummany,設(shè)置在消息中是否顯示錯誤信息摘要。

·DisplayMode,指明可顯示為列表或其他格式。

·ShowMessageBox,設(shè)置錯誤消息顯示在彈出對話框中。

當(dāng)使用ValidationSummary控件時,在這個控件上顯示ErrorMessage屬性的同時,在驗(yàn)證控件的位置上也顯示Text屬性(如果被使用)。帶有紅色星號“*”的Text屬性通常顯示在輸入控件的右邊,以警告用戶沒有正確填充輸入控件。帶有輸入錯誤描述的ErrorMessage屬性顯示在ValidationSummary控件中,這個控件通常放置在觸發(fā)事件的控件附近。

任務(wù)實(shí)現(xiàn)

步驟1打開校園在線超市網(wǎng)站,在“解決方案資源管理器”的“User”文件夾中打開“Register.aspx”。

步驟2添加驗(yàn)證控件,并設(shè)置其屬性,如圖4-7所示。要求:必須填寫“用戶名”、“密碼”和“確認(rèn)密碼”,使用RequiredFieldValidator控件;“密碼”和“確認(rèn)密碼”必須一致,使用CompareValidator控件;“手機(jī)號碼”必須是1開頭的數(shù)字,使用CustomValidator控件;“Email”必須符合格式要求,使用RegularExpressionValidator控件,“QQ”必須是數(shù)字,使用RegularExpressionValidator控件;將錯誤信息以對話框的形式顯示在窗體上彈出,使用ValidationSummary控件。

圖4-7添加驗(yàn)證控件步驟3為CustomValidator控件添加客戶端程序和服務(wù)器端程序。

客戶端程序如下所示:

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;

}

}

}

服務(wù)器端程序如下所示:

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雙擊“注冊”按鈕,給其添加事件處理過程,并在其事件處理過程中添加以下代碼,提示用戶驗(yàn)證成功:

if(Page.IsValid){

Response.Write("<script>alert('驗(yàn)證成功!')</script>");

}

步驟5瀏覽“Register.aspx”頁面并查看其效果。

任務(wù)描述

在校園在線超市系統(tǒng)中,會員注冊信息驗(yàn)證成功后,應(yīng)能保存會員注冊的信息到數(shù)據(jù)庫中。

4.3【任務(wù)9】會員注冊信息存儲

必備知識

知識1數(shù)據(jù)訪問模型

1.?dāng)?shù)據(jù)訪問原理

在ASP.NET中,數(shù)據(jù)訪問必須依賴于.NETFramework所提供的功能。ASP.NET通過對ADO.NET的引用,實(shí)現(xiàn)獲取數(shù)據(jù)和操作數(shù)據(jù)的目的。具體地說,數(shù)據(jù)訪問涉及四個主要的組件:Web應(yīng)用程序(ASP.NET)、數(shù)據(jù)層(ADO.NET)、數(shù)據(jù)提供程序和數(shù)據(jù)源。這些組件構(gòu)成了所有數(shù)據(jù)訪問Web應(yīng)用程序的基礎(chǔ)結(jié)構(gòu),如圖4-8所示。

圖4-8數(shù)據(jù)訪問的主要組件

1)數(shù)據(jù)存儲(DataStore)

數(shù)據(jù)存儲是數(shù)據(jù)存放的源頭,通過ADO.NET2.0和ASP.NET2.0的新增控件,Web應(yīng)用程序能夠訪問多種數(shù)據(jù)存儲中的數(shù)據(jù),包括關(guān)系數(shù)據(jù)庫、XML文件、Web服務(wù)、平面文件,或諸如MicrosoftExcel電子數(shù)據(jù)表程序中的數(shù)據(jù)。

2)數(shù)據(jù)提供程序(Provider)

為什么可以通過ADO.NET來訪問許多不同的數(shù)據(jù)源呢?這是因?yàn)锳SP.NET能提供程序模型,這些Provider相當(dāng)于一個適配器,它將對不同的數(shù)據(jù)源的數(shù)據(jù)操作細(xì)節(jié)隱藏起來,這種模型的靈活性使開發(fā)人員只需編寫一組數(shù)據(jù)訪問代碼就能訪問各種類型的數(shù)據(jù)。

3)數(shù)據(jù)操作層(DataLayer)

在ADO.NET中,通過ADO.NETAPI定義的抽象層,使所有的數(shù)據(jù)源看起來都是相同的。不論何種數(shù)據(jù)源,提取信息的過程都具有相同的關(guān)鍵類和步驟。

4)Web應(yīng)用程序?qū)?/p>

ASP.NET提供一系列控件,這些控件的設(shè)計(jì)意圖是為了減少數(shù)據(jù)訪問的代碼量。例如,開發(fā)人員能夠使用數(shù)據(jù)源向?qū)ё詣觿?chuàng)建和配置一個數(shù)據(jù)源,使用這個數(shù)據(jù)源發(fā)布查詢和檢索結(jié)果。此外,不同的控件能夠綁定到一個數(shù)據(jù)源,因此,控件能夠依據(jù)從數(shù)據(jù)源檢索到的信息,自動設(shè)置控件的外觀和內(nèi)容。

在數(shù)據(jù)訪問的四個組件中,其中最主要的就是數(shù)據(jù)操作層(DataLayer)。通過ADO.NET,開發(fā)人員既可以通過編寫代碼來訪問各種數(shù)據(jù),也可以通過ASP.NET2.0新增控件實(shí)現(xiàn)無代碼訪問各種數(shù)據(jù)。

2.ADO.NET訪問技術(shù)

ADO.NET是一種把基于Microsoft.NET的Web應(yīng)用程序以及MicrosoftWindows應(yīng)用程序連接到諸如SQLServer數(shù)據(jù)庫或XML文件等數(shù)據(jù)源的技術(shù)。ADO.NET專門為諸如Internet這樣的無連接的工作環(huán)境而設(shè)計(jì),它提供了一種簡單而靈活的方法,便于開發(fā)人員把數(shù)據(jù)訪問和數(shù)據(jù)處理集成到Web應(yīng)用程序中。

1)

ADO.NET組成

ADO.NET包括兩個核心組件,分別是.NETFramework數(shù)據(jù)提供程序和DataSet數(shù)據(jù)集。

(1)數(shù)據(jù)提供程序

數(shù)據(jù)提供程序用于連接到數(shù)據(jù)庫,執(zhí)行命令和檢索結(jié)果。數(shù)據(jù)提供程序中包含的核心對象如表4-5所示。表4-5ADO.NET的核心對象為了滿足不同數(shù)據(jù)庫和不同開發(fā)的要求,.NETFramework提供了四個數(shù)據(jù)提供程序:

·SQLServer.NETFramework數(shù)據(jù)提供程序

·OLEDB.NETFramework數(shù)據(jù)提供程序

·ODBC.NETFramework數(shù)據(jù)提供程序

·Oracle.NETFramework數(shù)據(jù)提供程序

SQLServer.NETFramework數(shù)據(jù)提供程序和OLEDB.NETFramework數(shù)據(jù)提供程序使用的對象名稱不同,前者通過SqlConnection、SqlCommand、SqlDataRea-der、SqlDataAdapter對象來訪問,后者通過OleDBConnection、OleDBCommand、OleDBDataReader、OleDBDataAdapter對象來訪問。

組成ADO.NET的各個對象被包含在不同的命名空間中。如果要處理SQLServer2005數(shù)據(jù)庫中的數(shù)據(jù),需要導(dǎo)入System.Data和System.Data.SqlClient;如果要處理Access、SQLServer7.0以下版本、dBase和Oracle數(shù)據(jù)庫中的數(shù)據(jù),需要導(dǎo)入System.Data和System.Data.OleDb。

(2)

DataSet對象

在Web應(yīng)用程序中,DataSet對象用于存儲從數(shù)據(jù)源中收集的數(shù)據(jù)。處理存儲在DataSet中的數(shù)據(jù)并不需要ASP.NETWeb窗體與數(shù)據(jù)源保持連接。并且,使用DataSet對象不僅能獲取數(shù)據(jù)源中心的數(shù)據(jù),而且還能獲得數(shù)據(jù)源的類型信息,它無需知道從中接受數(shù)據(jù)的數(shù)據(jù)源的其他任何信息。僅當(dāng)數(shù)據(jù)源中的數(shù)據(jù)隨著改變而被更新的時候,才會重新建立連接。

DataSet對象把數(shù)據(jù)存儲在一個或多個DataTable中。每個DataTable可由來自唯一數(shù)據(jù)源中的數(shù)據(jù)組成。與DataSet相關(guān)的對象見表4-6所示。表4-6與DataSet相關(guān)的對象

2)使用ADO.NET訪問數(shù)據(jù)

ADO.NET提供了一套豐富的對象,用于對幾乎任何種類的數(shù)據(jù)存儲的連接式或斷開式訪問,當(dāng)然包括關(guān)系型數(shù)據(jù)庫。在此模式下,連接會在程序的整個生存周期中保持打開,而不需要對狀態(tài)進(jìn)行特殊處理。隨著應(yīng)用程序開發(fā)的發(fā)展演變,數(shù)據(jù)處理越來越多地使用多層結(jié)構(gòu),斷開方式的處理模式可以為應(yīng)用程序提供更好的性能和伸縮性。ADO.NET技術(shù)滿足了這一需求。圖4-9顯示了如何使用ADO.NET訪問數(shù)據(jù)。

圖4-9使用ADO.NET訪問數(shù)據(jù)

(1)斷開式數(shù)據(jù)訪問模式

斷開式數(shù)據(jù)訪問模式指的是客戶不直接對數(shù)據(jù)庫操作。在.NET平臺上,使用各種開發(fā)語言開發(fā)的數(shù)據(jù)庫應(yīng)用程序一般并不直接對數(shù)據(jù)庫操作,而是先連接數(shù)據(jù)庫和通過數(shù)據(jù)適配器填充DataSet對象,然后客戶端再通過讀取DataSet來需要的數(shù)據(jù)。同樣,在更新數(shù)據(jù)庫中的數(shù)據(jù)時,也需要首先更新DataSet,然后再通過數(shù)據(jù)適配器來更新數(shù)據(jù)庫中對應(yīng)的數(shù)據(jù)。使用斷開式數(shù)據(jù)訪問模式的基本過程如下:

·使用連接對象Connection連接并打開數(shù)據(jù)庫。

·使用數(shù)據(jù)適配器DataAdapter填充數(shù)據(jù)集DataSet。

·關(guān)閉連接,對DataSet進(jìn)行操作。

·操作完成后打開連接。

·使用數(shù)據(jù)適配器DataAdapter更新數(shù)據(jù)庫。

斷開式數(shù)據(jù)訪問模式適用于遠(yuǎn)程數(shù)據(jù)處理、本地緩存數(shù)據(jù)及執(zhí)行大量數(shù)據(jù)的處理,不需要與數(shù)據(jù)源保持連接,從而將連接資源釋放給其他客戶端使用。

(2)連接式數(shù)據(jù)訪問模式

連接式數(shù)據(jù)訪問模式是指用戶在操作過程中,與數(shù)據(jù)庫的連接一直保持。如果不需要DataSet所提供的功能,則打開連接后,可以直接使用命令對象Command進(jìn)行數(shù)據(jù)庫相關(guān)操作。使用DataReader對象可以只進(jìn)只讀方式返回?cái)?shù)據(jù)并顯示,從而提供應(yīng)用程序的性能。在實(shí)際應(yīng)用中,選擇數(shù)據(jù)訪問模式的基本原則是首先滿足需求,而后考慮性能優(yōu)化。

知識2使用Connection對象連接數(shù)據(jù)庫

訪問數(shù)據(jù)庫的第一項(xiàng)工作就是和數(shù)據(jù)庫建立連接,然后通過這個連接向數(shù)據(jù)庫發(fā)送命令和讀取返回的數(shù)據(jù),在ADO.NET中,這是由Connection對象來實(shí)現(xiàn)的。

1.編寫代碼創(chuàng)建數(shù)據(jù)庫連接

對于不同的數(shù)據(jù)庫的連接,使用的連接對象有所區(qū)別,連接字符串也有不同。

1)使用SQLServer.NET數(shù)據(jù)提供程序連接SQLServer2005數(shù)據(jù)庫

如果需要訪問的是SQLServer2005數(shù)據(jù)庫,則需要使用SQLServer.NET數(shù)據(jù)提供程序,相關(guān)的類在System.Data.SqlClient命名空間中,此時需要使用SqlConnection對象來連接數(shù)據(jù)庫。

SqlConnection對象最重要的屬性就是ConnectionString屬性,該屬性將建立連接的詳細(xì)信息傳遞給SqlConnection對象,SqlConnection對象通過這個屬性所提供的連接字符串來連接數(shù)據(jù)庫。在連接字符串中至少需要包含服務(wù)器(Server)、數(shù)據(jù)庫名(Database)和身份驗(yàn)證(UserID/Password)等信息。

ConnectionString中常見的屬性如表4-7所示。表4-7ConnectionString的屬性連接字符串可以在創(chuàng)建SqlConnection對象時作為參數(shù)傳遞,也可以通過ConnectionString屬性來設(shè)置。

下面這個例子是一個非常基本的連接字符串,可以用于建立到位于運(yùn)行代碼的同一臺機(jī)器上的SQLServer的連接:

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

IntegratedSecurity=SSPI;");

下面的例子顯示一個可用于連接到“使用SQLServer身份驗(yàn)證”的遠(yuǎn)程服務(wù)器MyServer的連接字符串。設(shè)置ConnectionTimeout為60秒。

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

在創(chuàng)建SqlConnection對象并正確設(shè)置好連接字符串后,.NET并不會自動建立和數(shù)據(jù)庫的連接,還需要使用SqlConnection的Open方法打開連接,從而真正在網(wǎng)上實(shí)現(xiàn)一個數(shù)據(jù)庫的連接。連接被打開后就可以通過它訪問數(shù)據(jù)庫中的數(shù)據(jù),訪問完畢之后還需要使用Close方法關(guān)閉連接,直到下一次訪問數(shù)據(jù)庫時再打開。表4-8SqlConnection對象的主要方法

2)使用OLEDB.NET數(shù)據(jù)提供程序連接Access數(shù)據(jù)庫

如果需要訪問的是Access2000數(shù)據(jù)庫,則使用SQLOLEDB.NET數(shù)據(jù)提供程序,相關(guān)的類都在System.Data.OleDB命名空間中,此時需要使用OleDBConnection對象來連接數(shù)據(jù)庫。

OleDBConnection和SqlConnection的使用基本是一樣的,唯一的區(qū)別就是ConnectionString的取值有所不同。訪問Access數(shù)據(jù)庫的連接字符串中至少需要包含提供者(Provider)和數(shù)據(jù)庫文件名(DataSource)這兩個信息,其中的Provider用來指定數(shù)據(jù)庫類型,訪問Access時應(yīng)該為“Microsoft.Jet.OLEDB.4.0”。

下面的例子顯示了如何訪問Access數(shù)據(jù)庫StudentMS.mdb:

OleDbConnectionoledbconn;

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

DataSource="f:\SuperMarketDB.mdb";

oledbconn.Open();

oledbconn.Close();

2.使用Web.Config文件定義數(shù)據(jù)連接字符串

在Web應(yīng)用程序中,往往有多個窗體需要訪問數(shù)據(jù)庫,這些頁面中都要創(chuàng)建Connection對象,而每次創(chuàng)建Connection對象時又必須設(shè)置ConnectionString屬性為合適的連接字符串。這樣就會造成一個問題,一旦數(shù)據(jù)庫信息發(fā)生變化(如SQLServer服務(wù)器名改變或者Access數(shù)據(jù)庫文件的存儲路徑變化),就必須把每個頁面中的連接字符串都做改動,為應(yīng)用程序的維護(hù)帶來了麻煩。利用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”,其中保存了所需的數(shù)據(jù)庫連接字符串(Value的值)。這樣,在窗體中創(chuàng)建連接對象時,只需要讀取“DBConnStr”的值就行了。

stringmyconnstr=ConfigurationManager.ConnectionStrings["DBConnStr"].

ConnectionString;

SqlConnectionsqlconn=newSqlConnection(myconnstr);

sqlconn.Open();

3.有關(guān)Connection對象的更多內(nèi)容

在編寫Web應(yīng)用程序時,常常會遇到如何使用Connection對象的問題。如果每次訪問數(shù)據(jù)庫前打開連接,訪問完畢后關(guān)閉連接,就會在網(wǎng)絡(luò)上頻繁地建立和撤銷到數(shù)據(jù)庫的連接路徑,如果在網(wǎng)速較慢或網(wǎng)絡(luò)工作繁忙的情況下,就可能產(chǎn)生幾秒鐘的時間延遲。反之,如果為了要減少連接的建立和撤銷的次數(shù),而保持連接一直處于打開狀態(tài),則在規(guī)模較大的應(yīng)用中,又會使得網(wǎng)絡(luò)中同時存在過多的連接路徑,從而降低網(wǎng)絡(luò)的利用率。連接池(ConnectionPool)就是解決方法之一。

1)連接池的概念

連接池是一個簡單概念。當(dāng)關(guān)閉一個連接時,并不直接撤銷網(wǎng)絡(luò)中的物理數(shù)據(jù)庫連接路徑,而是把包括身份驗(yàn)證細(xì)節(jié)在內(nèi)的連接詳細(xì)信息保存在資源池(ResourcePool)中。如果后來又提出連接請求,則首先會檢查資源池,查看身份驗(yàn)證信息細(xì)節(jié)都相同的地方是否有現(xiàn)成的連接可用,且是否正在連接相同的服務(wù)器和數(shù)據(jù)庫。如果有與要求的連接標(biāo)準(zhǔn)相匹配的現(xiàn)成連接,就使用它而不必再創(chuàng)建一個新的連接。不過,如果連接池中沒有合適的連接可用,那么就需要新建一個連接。

ADO.NET中默認(rèn)情況下會啟用連接池。如果用戶要防止某一連接在關(guān)閉后被加入到連接池中,也可以將連接字符串中的Pooling屬性設(shè)置為False。下面的代碼設(shè)置連接池禁用:

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

Password=;Pooling=False");物理數(shù)據(jù)庫連接不能同時由多個對象共享,因此可以將連接池當(dāng)作當(dāng)前未使用的數(shù)據(jù)庫連接的保存工具。調(diào)用SqlConnection對象的Open方法可以使連接池將現(xiàn)有數(shù)據(jù)庫連接釋放給請求連接的對象。在沒有明確調(diào)用SqlConnection的Close方法前,數(shù)據(jù)庫連接都不能放回到連接池中。如果將數(shù)據(jù)庫連接返回到連接池中,其他SqlConnection對象就可以使用它。

為了發(fā)揮連接池的作用,需要注意以下兩點(diǎn):

·在結(jié)束使用SqlConnection對象時必須調(diào)用Close方法,以便連接返回到連接池中,SqlConnection對象超出范圍時是不會將連接返回到連接池中的。

·使用連接池的所有連接都應(yīng)有完全相同的連接字符串,它包括Connection-

String屬性中的所有內(nèi)容(例如Pooling)。如果這些字符串不相同,那么就會創(chuàng)建多個連接池,也就是說,每個不同的連接字符串都有一個連接池。

2)連接池的大小

連接池的大小是影響網(wǎng)絡(luò)利用效率的重要因素之一。在快速網(wǎng)絡(luò)上,可以適當(dāng)加大連接池的大小,而在慢速網(wǎng)絡(luò)中,則必須減小連接池的大小。連接字符串的MinPoolSize和MaxPoolSize屬性用于設(shè)置連接池中將保留的連接數(shù),從而確定連接池的大小。

MinPoolSize設(shè)定打開第一個連接時自動在連接池中打開多少連接,默認(rèn)值是0。但是如果經(jīng)常同時使用多個到特定數(shù)據(jù)源的連接,就可以增加該值。對于標(biāo)準(zhǔn)的客戶/服務(wù)器應(yīng)用程序,這不多見,但是在開發(fā)Web應(yīng)用程序時,這也許就是恰當(dāng)?shù)摹?/p>

MaxPoolSize屬性指定連接池中可以保留的連接的最大數(shù)量。這樣就可以限制從應(yīng)用程序打開的連接數(shù)量,防止打開過多的數(shù)據(jù)庫連接數(shù)量。如果一個連接對象在請求連接時連接池中沒有可用的連接,該對象將等待一段時間(由ConnectionTimeout設(shè)定),如果仍然沒有連接可用,則拋出InvalidOperationException異常。

在下面的例子中,首先創(chuàng)建了兩個連接,第3個連接請求將等待超時時間,由于連接池中沒有連接可用,所以最終該連接請求會超時并拋出異常(默認(rèn)時間為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秒后失敗,因?yàn)檫B接池中已經(jīng)沒有可用的連接了知識3使用Command對象操作數(shù)據(jù)庫

1.Command對象

在連接好數(shù)據(jù)源后,就可以對數(shù)據(jù)源執(zhí)行一些命令操作。命令操作包括從數(shù)據(jù)存儲區(qū)(數(shù)據(jù)庫、數(shù)據(jù)文件等)檢索或?qū)?shù)據(jù)存儲區(qū)進(jìn)行插入、更新、刪除等操作。在ADO.NET中,對數(shù)據(jù)庫的命令操作通過Command對象實(shí)現(xiàn)。常用的SQL語句命令如Select、Update、Delete、Insert等都可以在Command對象中創(chuàng)建。

在.NET的兩個標(biāo)準(zhǔn)數(shù)據(jù)提供程序SQLServer.NET數(shù)據(jù)提供程序和OLEDB.NET數(shù)據(jù)提供程序中,Command對象分別叫做SqlCommand和OleDbCommand,兩者的用法基本一致。這里圍繞SqlCommand對象進(jìn)行介紹。

1)

SqlCommand對象的屬性

SqlCommand對象的主要屬性如表4-9所示。

CommandText是SqlCommand類中最常用的屬性,可以由任何有效的T-SQL命令或T-SQL命令組組成。例如,包括Select、Insert、Update和Delete語句以及存儲過程,還可以指定由逗號分隔的表名或存儲過程名。在調(diào)用方法執(zhí)行CommandText中的命令前,還要正確設(shè)置CommandType和Connection屬性。

表4-9SqlCommand對象的主要屬性下面的例子顯示如何使用Text的命令類型,并指定T-SQL命令作為SqlCommand對象的文本:

SqlCommandcmd;

cmd.Connection=conn;

cmd.CommandType=CommandType.Text;

cmd.CommandText="Select*fromT_Ware";

下面的例子中使用StordProcedure命令類型指明SqlCommand對象執(zhí)行在CommandText屬性中指定的存儲過程。

SqlCommandcmd;

cmd.Connection=conn;

cmd.CommandType=CommandType.StoredProcedure;

cmd.CommandText="GetAllWares";

2)SqlCommand對象的方法

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

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

SqlCommand提供三種不同的方法在SQLServer上執(zhí)行T-SQL語句,所有這些方法在內(nèi)部的工作方式都非常相似。每種方法都會將在SqlCommand對象中形成的命令詳細(xì)信息傳遞給指定的連接對象。然后,通過SqlConnection對象在SQLServer上執(zhí)行T-SQL語句,最后根據(jù)語句執(zhí)行結(jié)果生成一組數(shù)據(jù),這些數(shù)據(jù)在不同的方法中有不同的表現(xiàn)形式。

(1)

ExecuteNonQuery

ExecuteNonQuery方法將在SQLServer上執(zhí)行指定的T-SQL語句,但是它只返回受T-SQL語句影響的行數(shù),因此,它適合執(zhí)行不返回結(jié)果集的T-SQL命令。

這些命令有數(shù)據(jù)定義語句(DDL)命令,如CreateTable、CreateView、DropTable;還有數(shù)據(jù)操作語言(DML)命令,如Insert、Update和Delete;也可以用于執(zhí)行不返回結(jié)果集的存儲過程。

下面的例子實(shí)現(xiàn)創(chuàng)建到SQLServer的連接,使用ExecuteNonQuery運(yùn)行三個T-SQL命令。第一個命令創(chuàng)建一個新的臨時表,第二個命令將一行插入到該臨時表中,并且將返回行中受影響的參數(shù),第三個命令則刪除該臨時表。

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中檢索單一結(jié)果集的高速只讀方法。

下面的例子實(shí)現(xiàn)執(zhí)行T-SQL命令并遍歷結(jié)果集,將一列數(shù)據(jù)輸出到頁面上。

Stringstr=“selectSPMCfromT_SPXX”;

Sqlcommandscmd=newSqlcommand(str,conn);

SqlDataReadersdr=scmd.ExecuterReader();

while(sdr.Read()){

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

}

(3)

ExecuteScalar方法

ExecuteScalar方法執(zhí)行后返回一個單值,多用于使用聚合函數(shù)的情況,如COUNT(*)之類的聚合函數(shù)。

下面的例子使用ExecuteScalar方法在表上執(zhí)行COUNT(*),返回其結(jié)果并輸出到頁

面上。

Stringstr=“selectcount(*)fromT_SPXX”;

Sqlcommandscmd=newSqlcommand(str,conn);

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

2.使用Command對象操作數(shù)據(jù)

1)使用Command對象操作數(shù)據(jù)的基本步驟

使用Command對象實(shí)現(xiàn)數(shù)據(jù)庫的操作,對于編寫與數(shù)據(jù)庫相關(guān)的應(yīng)用程序來說是必須的,它是典型的ADO.NET連接式操作模式。其基本步驟包括:

·打開到數(shù)據(jù)庫的連接。

·創(chuàng)建新的Command對象。

·定義T-SQL命令。

·執(zhí)行T-SQL命令。

·關(guān)閉數(shù)據(jù)庫的連接。在定義T-SQL命令時,與下面類似的T-SQL命令經(jīng)常會用到。這就需要在書寫T-SQL命令時注意數(shù)據(jù)類型和標(biāo)點(diǎn)符號,同時必須在英文狀態(tài)下書寫,否則程序在編譯時會出錯。

stringSQLStr="select*fromT_Warewhereid="+vid;

stringSQLStr="deletefromT_Warewhereid="+vid;

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

stringSQLStr="insertintoT_Warevalues('"+strName+"','"+strSex+"','" +strPost+"','"+strCompany+"')";在下面的例子中,獲取用戶在文本框中輸入的姓名、性別、職務(wù)、公司、聯(lián)系方式等信息,實(shí)現(xiàn)向數(shù)據(jù)庫插入一條記錄。

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)在操作數(shù)據(jù)時使用SQL參數(shù)

在實(shí)際應(yīng)用中,常常需要用戶在頁面上輸入信息,并將這些信息插入到數(shù)據(jù)庫中。只要允許用戶輸入數(shù)據(jù),就會增加將錯誤引入數(shù)據(jù)庫的危險性,并可能對Web應(yīng)用程序創(chuàng)建和執(zhí)行SQL代碼產(chǎn)生致命的影響。為了解決這個問題,除了前面講到的使用ASP.NET驗(yàn)證控件對輸入控件進(jìn)行檢查之外,還需要在生成T-SQL命令時不使用窗體變量而使用SQL參數(shù)來構(gòu)造連接字符串。SQL參數(shù)不屬于SQL查詢的可執(zhí)行腳本部分。由于錯誤或惡意的用戶輸入不會處理成可執(zhí)行腳本,因此不會影響SQL查詢的執(zhí)行結(jié)果。

(1)

Parameters屬性和SqlParameter對象

要在ADO.NET對象模型中使用SQL參數(shù),需要向Command對象的Parameters集合中添加Parameter對象。在使用SQLServer.NET數(shù)據(jù)提供程序時,要使用的Parameter類為SqlParameter。

創(chuàng)建SqlParameter對象,必須確定包括Value在內(nèi)的一些屬性,其主要屬性如表4-11所示。表4-11SqlParameter對象的主要方法

SqlDbType是SqlParameter對象的重要屬性之一,通過它來控制向SQLServer數(shù)據(jù)庫傳遞參數(shù)信息時所使用的數(shù)據(jù)類型。此屬性接受來自SqlDbType枚舉中的值,如NVarChar、Int、DateTime、Bit、Money、Text、Image等。另外,Direction屬性可以設(shè)置參數(shù)的方向。在查詢中使用參數(shù)以向數(shù)據(jù)庫傳遞數(shù)據(jù),還可以使用參數(shù)從數(shù)據(jù)庫獲取數(shù)據(jù)。例如,通過輸出參數(shù)從數(shù)據(jù)庫的單一行中獲取數(shù)據(jù),而不是通過SqlDataReader來查看一個數(shù)據(jù)行。由于參數(shù)所涉及的開銷少于結(jié)果集,因此通過輸出參數(shù)來返回?cái)?shù)據(jù)的速度更快一些。

(2)使用SQL參數(shù)的基本步驟

使用SQL參數(shù)的基本步驟如下:

·使用parameters構(gòu)建SqlCommand命令字符串。

·聲明SqlParameter對象,并賦值。

·將SqlParameter對象賦值給SqlCommand對象的Parameters屬性。

對上面的例子進(jìn)行修改,獲取用戶在文本框中輸入的姓名、性別、職務(wù)、公司、聯(lián)系方式等信息,向數(shù)據(jù)庫插入一條記錄時使用SQL參數(shù)實(shí)現(xiàn)。

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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論