四十七:用SqlDataSource控件插入、更新、刪除數(shù)據(jù)_第1頁(yè)
四十七:用SqlDataSource控件插入、更新、刪除數(shù)據(jù)_第2頁(yè)
四十七:用SqlDataSource控件插入、更新、刪除數(shù)據(jù)_第3頁(yè)
四十七:用SqlDataSource控件插入、更新、刪除數(shù)據(jù)_第4頁(yè)
四十七:用SqlDataSource控件插入、更新、刪除數(shù)據(jù)_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、在ASP.NET 2.0中操作數(shù)據(jù)之四十七:用SqlDataSource控件插入、更新、刪除數(shù)據(jù)作者:heker2007 字體:增加 減小 類型:轉(zhuǎn)載 時(shí)間:2016-05-14 我要評(píng)論本文主要介紹使用SqlDataSource控件完成插入、更新、刪除數(shù)據(jù)等操作,通過(guò)設(shè)置向?qū)?,SqlDataSource控件的InsertCommand, UpdateCommand和DeleteCommand屬性都會(huì)被賦以相應(yīng)的 INSERT, UPDATE和DELETE SQL語(yǔ)句,從而實(shí)現(xiàn)相應(yīng)的操作。導(dǎo)言:正如在教程概述插入、更新和刪除數(shù)據(jù)里討論的那樣,GridView控件內(nèi)置更新和刪

2、除功能,而DetailsView和FormView控件不僅具有編輯和刪除功能,還有插入功能。我們不要寫一行代碼就可一將這些功能直接應(yīng)用于一個(gè)數(shù)據(jù)源控件。在這篇教程里,我們指出ObjectDataSource控件最好與GridView, DetailsView和FormView控件一起使用,才更好的實(shí)現(xiàn)插入、更新和刪除功能。對(duì)SqlDataSource控件來(lái)說(shuō),同樣如此!對(duì)ObjectDataSource控件來(lái)說(shuō),為了實(shí)現(xiàn)插入、更新和刪除,我們需要指定調(diào)用那個(gè)方法來(lái)實(shí)現(xiàn)插入、更新和刪除功能。對(duì)SqlDataSource來(lái)說(shuō),我們需要指定INSERT, UPDATE和DELETE三種SQL語(yǔ)句(或

3、存儲(chǔ)過(guò)程)。就像接下來(lái)在本章探討的那樣,我們可以手寫代碼或SqlDataSource的設(shè)置數(shù)據(jù)源向?qū)ё詣?dòng)的生成。注意:由于我們已經(jīng)探討過(guò)了GridView, DetailsView和FormView控件的插入、編輯和刪除功能,在本章我們主要關(guān)注怎樣設(shè)置SqlDataSource以支持這些功能。倘若你想重溫如何實(shí)現(xiàn)GridView, DetailsView和FormView的這些功能,參考教程概述插入、更新和刪除數(shù)據(jù)第一步:指定INSERT, UPDATE和DELETE命令就像在前2章教程探討的那樣,從SqlDataSource控件檢索數(shù)據(jù),需要設(shè)置2個(gè)屬性:1. ConnectionStrin

4、g,指定要查詢的數(shù)據(jù)庫(kù)。2. SelectCommand,指定用來(lái)返回結(jié)果的ad-hoc SQL語(yǔ)句或存儲(chǔ)過(guò)程的名稱。對(duì)SelectCommand里的參數(shù)來(lái)說(shuō),其值在SqlDataSource控件的SelectParameters部分指定,可以為“硬編碼”值,普通的參數(shù)源值(比如來(lái)自于查詢字符串、 session變量、Web控件等)、或通過(guò)編程設(shè)置。當(dāng)一個(gè)數(shù)據(jù)Web控件調(diào)用SqlDataSource的Select() 方法時(shí)不管是自動(dòng)的還是通過(guò)編程調(diào)用的,發(fā)生這些事件:連接指定數(shù)據(jù)庫(kù),對(duì)參數(shù)賦值并執(zhí)行查詢,檢索并返回結(jié)果。返回的結(jié)果是DataSet還是DataReader,取決于SqlData

5、Source的DataSourceMode屬性是設(shè)置為DataSet還是DataReader。和選擇數(shù)據(jù)一樣,要實(shí)現(xiàn)插入、更新和刪除數(shù)據(jù),我們只要提供相應(yīng)的INSERT, UPDATE和DELETE SQL語(yǔ)句就夠了。方法是對(duì)InsertCommand, UpdateCommand和DeleteCommand屬性賦以相應(yīng)的 INSERT, UPDATE和DELETE SQL語(yǔ)句。如果這些SQL語(yǔ)句包含參數(shù)(現(xiàn)實(shí)中經(jīng)常碰到),將這些參數(shù)放在相應(yīng)的InsertParameters, UpdateParameters和DeleteParameters部分。一旦指定了SqlDataSource控件的I

6、nsertCommand, UpdateCommand和DeleteCommand三種命令,就可以在相應(yīng)的數(shù)據(jù)Web控件啟用插入、編輯和刪除功能。為驗(yàn)證起見(jiàn),我們拓展Querying.aspx頁(yè)面的刪除功能。打開(kāi)SqlDataSource文件夾的InsertUpdateDelete.aspx和Querying.aspx頁(yè)面,首先選擇Querying.aspx頁(yè)面,進(jìn)入設(shè)計(jì)模式,選中SqlDataSource控件和GridView控件(ID分別為ProductsDataSource和GridView1),點(diǎn)“編輯”菜單,選“復(fù)制”(或直接按Ctrl+C),然后將這2個(gè)控件粘貼在InsertUpd

7、ateDelete.aspx頁(yè)面。在瀏覽器里測(cè)試該頁(yè)面,你將會(huì)看到表Products里所有產(chǎn)品的ProductID, ProductName和UnitPrice顯示出來(lái)。圖1:所有產(chǎn)品按ProductID排序并顯示出來(lái)添加SqlDataSource控件的eleteCommand命令和DeleteParameters屬性到目前為止,我們的SqlDataSource只是從表Products返回記錄,然后在GridView控件里顯示出來(lái)。我們的目標(biāo)是擴(kuò)展其功能,允許用戶在GridView控件刪除數(shù)據(jù)。為此,我們需要為SqlDataSource控件的DeleteCommand和DeleteParame

8、ters屬性賦值,然后啟用GridView的刪除功能??梢杂孟旅娴姆椒镾qlDataSource控件的DeleteCommand和DeleteParameters屬性賦值:1. 聲明代碼2. 在屬性窗口指定屬性值3. 在設(shè)置數(shù)據(jù)源向?qū)У摹爸付ㄗ远xSQL語(yǔ)句或存儲(chǔ)過(guò)程”界面里指定4. 在設(shè)置數(shù)據(jù)源向?qū)У摹皝?lái)自表或視圖的指定列”界面里點(diǎn)“高級(jí)”按鈕,這樣做會(huì)自動(dòng)生成DeleteCommand和DeleteParameters屬性里要用到的DELETE SQL語(yǔ)句和參數(shù)。我們將在接下來(lái)的第2步探討如何自動(dòng)得生成DELETE語(yǔ)句?,F(xiàn)在我們嘗試在屬性窗口里設(shè)置DeleteCommand和Delete

9、Parameters。當(dāng)然直接聲明代碼和使用設(shè)置數(shù)據(jù)源向?qū)б部梢赞k到。打開(kāi)InsertUpdateDelete.aspx頁(yè)面,進(jìn)入設(shè)計(jì)模式,選中ID為ProductsDataSource的SqlDataSource控件,打開(kāi)其屬性窗口(從視圖菜單中選屬性窗口,或直接按F4按鈕)選擇DeleteQuery屬性,在方框右邊會(huì)出現(xiàn)一個(gè)橢圓型區(qū)域。圖2:在屬性窗口里選擇DeleteQuery屬性。注意:SqlDataSource控件其實(shí)并沒(méi)有DeleteQuery屬性?;蛘吒鼫?zhǔn)確的說(shuō),它是由DeleteCommand和DeleteParameters兩個(gè)屬性構(gòu)成的。雖然我們?cè)谠O(shè)計(jì)模式里可以看到屬性窗口

10、列出了DeleteQuery屬性,但切換到源碼模式的時(shí)候,我們會(huì)看到代碼里只有 DeleteCommand屬性而沒(méi)有DeleteQuery屬性。點(diǎn)擊該橢圓型區(qū)域,將轉(zhuǎn)換到“編輯命令和屬性”對(duì)話框(見(jiàn)圖3)。在該對(duì)話框,你可以指定DELETE SQL語(yǔ)句及要用的參數(shù)。在DELETE: command文本框里鍵入如下查詢:(手工輸入或者借助查詢生成器,悉聽(tīng)尊便):?12DELETE FROM ProductsWHERE ProductID = ProductID然后,點(diǎn)Refresh Parameters按鈕,將參數(shù)ProductID添加到下面的參數(shù)列表。圖3:在屬性窗口里選擇DeleteQuer

11、y屬性(譯注:圖片說(shuō)明有誤)暫時(shí)不要為該參數(shù)賦值(在參數(shù)源下列列表選“None”)。當(dāng)我們?yōu)镚ridView控件啟用刪除功能后,GridView將自動(dòng)為該參數(shù)傳遞值,傳遞的值為被選擇刪除的那行記錄的DataKeys值。注意:在DELETE查詢語(yǔ)句中使用的參數(shù)名必須與GridView, DetailsView或FormView控件的DataKeyNames值一樣。比如:因?yàn)楸鞵roducts的主鍵是ProductID,自然地,GridView控件的DataKeyNames值也是ProductID,相應(yīng)地,DELETE語(yǔ)句中的參數(shù)應(yīng)設(shè)置為ProductID(當(dāng)然,你也可以任意地設(shè)置為其它名字,比如

12、ID)。當(dāng)參數(shù)名與DataKeyNames不匹配時(shí)(比如你將參數(shù)設(shè)置為ID),GridView控件無(wú)法將DataKeys值傳給SQL語(yǔ)句中的參數(shù)。在“編輯命令和參數(shù)”對(duì)話框里鍵入相關(guān)刪除信息后,點(diǎn)“OK”按鈕。進(jìn)代碼模式查看代碼:?123456789<asp:SqlDataSource ID="ProductsDataSource" runat="server"ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"SelectComma

13、nd= "SELECT ProductID, ProductName, UnitPrice FROM Products"DeleteCommand="DELETE FROM Products WHERE ProductID = ProductID"><DeleteParameters> <asp:Parameter Name="ProductID" /></DeleteParameters></asp:SqlDataSource>設(shè)置GridView控件以支持刪

14、除功能設(shè)置了DeleteCommand屬性后,GridView控件的智能標(biāo)簽里便可包含刪除選項(xiàng)。就像在教程概述插入、更新和刪除數(shù)據(jù)里探討的一樣,點(diǎn)擊該按鈕將促使GridView控件增加一個(gè)CommandField列,同時(shí)將ShowDeleteButton屬性設(shè)置為true。就像在圖4展示的那樣,當(dāng)通過(guò)瀏覽器訪問(wèn)該頁(yè)面時(shí),GridView控件將包含一個(gè)刪除按鈕。圖4:在GridView控件中,每一行記錄都包含一個(gè)刪除按鈕點(diǎn)擊刪除按鈕后,將發(fā)生postback事件,GridView控件將該行記錄的DataKeys值賦值給參數(shù)ProductID,并調(diào)用SqlDataSource控件的Delete()

15、方法。SqlDataSource控件隨即連接到數(shù)據(jù)庫(kù)并執(zhí)行DELETE命令。最后GridView控件再次綁定SqlDataSource控件,獲取并展示當(dāng)前的產(chǎn)品(因?yàn)閳?zhí)行了刪除命令,剛被刪除的那個(gè)產(chǎn)品也就顯示不出來(lái)了)。注意:因?yàn)镚ridView控件是將它的DataKeys值傳給SqlDataSource控件的參數(shù),所以尤為重要的是將GridView的DataKeyNames屬性設(shè)置為主鍵列,而且SqlDataSource控件的SelectCommand要返回這些列。具體到本例,最好將SqlDataSource控件的DeleteCommand里的參數(shù)設(shè)置為ProductsID。如果DataKe

16、yNames 屬性沒(méi)有設(shè)置,或參數(shù)名不是ProductsID,點(diǎn)擊刪除按鈕時(shí)也會(huì)發(fā)生postback事件,但不會(huì)成功地刪除記錄。圖5形象地顯示了該原理。圖5:點(diǎn)擊GridView控件的刪除按鈕將會(huì)調(diào)用SqlDataSource的Delete()方法第2步:自動(dòng)的創(chuàng)建INSERT、UPDATE和DELETE語(yǔ)句就像在第1步中提到的那樣,INSERT、UPDATE和DELETE SQL語(yǔ)句可以在屬性窗口設(shè)置,也可以通過(guò)控件聲明來(lái)構(gòu)造。然而這樣需要我們手寫代碼,單調(diào)且容易出錯(cuò)。幸運(yùn)的是,我們可以通過(guò)數(shù)據(jù)源設(shè)置向?qū)?lái)自動(dòng)的生產(chǎn)INSERT、UPDATE和 DELETE語(yǔ)句。方法是使用它的“指定來(lái)自表或

17、視圖的列”模式。打開(kāi)InsertUpdateDelete.aspx頁(yè)面,在設(shè)計(jì)模式里添加一個(gè)DetailsView控件,設(shè)置其ID為ManageProducts,接下來(lái),在其智能標(biāo)簽里選擇“創(chuàng)建新數(shù)據(jù)源”,創(chuàng)建一個(gè)名為ManageProductsDataSource的SqlDataSource,如下圖:圖6:創(chuàng)建一個(gè)名為ManageProductsDataSource的SqlDataSource控件選擇數(shù)據(jù)庫(kù)時(shí),在下拉列表中選擇NORTHWINDConnectionString連接字符串,點(diǎn)下一步,在“設(shè)置選擇命令”界面里,選中“指定來(lái)自表或視圖的列”,在下拉列表中選擇表Products,選中

18、表的ProductID、ProductName、UnitPrice和 Discontinued列。圖7:返回表Products的ProductID、ProductName,、UnitPrice和Discontinued為了自動(dòng)創(chuàng)建基于選定表和選定列的INSERT、UPDATE和DELETE命令,點(diǎn)擊“高級(jí)”按鈕,選中“生成INSERT、UPDATE和DELETE命令”選項(xiàng)。圖8:選中“生成INSERT、UPDATE和DELETE命令”選項(xiàng)當(dāng)查詢返回的那些列包含主鍵列(有時(shí)幾個(gè)列都是主鍵列)時(shí),才能啟用“生成INSERT、UPDATE和DELETE命令”選項(xiàng)。當(dāng)選擇了“生成INSERT、UPDA

19、TE和DELETE命令”選項(xiàng)后,才能選擇“使用開(kāi)放式并發(fā)”選項(xiàng)。當(dāng)選擇該選項(xiàng)后,就將在UPDATE和DELETE命令里增加WHERE字句,以提供開(kāi)放式并發(fā)控制?,F(xiàn)在先不忙選擇“使用開(kāi)放式并發(fā)”選項(xiàng),我們將在后面的教程里討論如何使SqlDataSource控件實(shí)現(xiàn)開(kāi)放式并發(fā)。當(dāng)選擇“生成INSERT、UPDATE和DELETE命令”選項(xiàng)后,點(diǎn)“OK”回到“設(shè)置選擇命令”界面,再點(diǎn)下一步,點(diǎn)完成。完成向?qū)Ш?,Visual Studio將會(huì)為DetailsView控件增加ProductID, ProductName和UnitPrice三個(gè)綁定列(BoundFields),和一個(gè)Discontinue

20、d單選框列(CheckBoxField )。在DetailsView控件的智能標(biāo)簽里選擇分頁(yè)項(xiàng),并清空DetailsView的寬、高屬性。我們注意到智能標(biāo)簽里還包括插入、編輯、刪除選項(xiàng)可用,這是因?yàn)镾qlDataSource控件的InsertCommand, UpdateCommand和DeleteCommand屬性同樣被賦值了。就像如下代碼所示:?1234567891011121314151617181920212223242526272829303132333435363738394041424344<asp:DetailsView ID="ManageProducts&q

21、uot; runat="server" AllowPaging="True"AutoGenerateRows="False" DataKeyNames="ProductID"DataSourceID="ManageProductsDataSource" EnableViewState="False"><Fields> <asp:BoundField DataField="ProductID" HeaderText=&quo

22、t;ProductID"  InsertVisible="False" ReadOnly="True" SortExpression="ProductID" /> <asp:BoundField DataField="ProductName" HeaderText="ProductName"  SortExpression="ProductName" /> <asp:BoundFie

23、ld DataField="UnitPrice" HeaderText="UnitPrice"  SortExpression="UnitPrice" /> <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"  SortExpression="Discontinued" /></Fields></asp:

24、DetailsView> <asp:SqlDataSource ID="ManageProductsDataSource" runat="server"ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"DeleteCommand= "DELETE FROM Products WHERE ProductID = ProductID"InsertCommand= "INS

25、ERT INTO Products (ProductName, UnitPrice, Discontinued)  VALUES (ProductName, UnitPrice, Discontinued)"SelectCommand= "SELECT ProductID, ProductName, UnitPrice, Discontinued  FROM Products"UpdateCommand= "UPDATE Products SET ProductName = ProductNam

26、e,  UnitPrice = UnitPrice, Discontinued = Discontinued  WHERE ProductID = ProductID"><DeleteParameters> <asp:Parameter Name="ProductID" Type="Int32" /></DeleteParameters><UpdateParameters> <asp:Parameter Name="

27、ProductName" Type="String" /> <asp:Parameter Name="UnitPrice" Type="Decimal" /> <asp:Parameter Name="Discontinued" Type="Boolean" /> <asp:Parameter Name="ProductID" Type="Int32" /></Upda

28、teParameters><InsertParameters> <asp:Parameter Name="ProductName" Type="String" /> <asp:Parameter Name="UnitPrice" Type="Decimal" /> <asp:Parameter Name="Discontinued" Type="Boolean" /></InsertPa

29、rameters></asp:SqlDataSource>注意:SqlDataSourc控件是如何自動(dòng)的為InsertCommand,UpdateCommand和DeleteCommand屬性賦值的。InsertCommand和UpdateCommand屬性里涉及到的列取決于SELECT命令里的列,換句話說(shuō),并不是表Products的所有列都出現(xiàn)在InsertCommand和UpdateCommand屬性里。在InsertCommand和UpdateCommand屬性里只能使用SelectCommand返回的那些列(列ProductID除外,因?yàn)樗且粋€(gè)IDENTITY列,I

30、DENTITY列的值在編輯的時(shí)候不允許改變,而且新插入一條記錄時(shí),自動(dòng)對(duì)IDENTITY列賦值)。另外在InsertCommand, UpdateCommand和 DeleteCommand屬性里出現(xiàn)的每個(gè)參數(shù),在<DeleteParameters>、<UpdateParameters>、<InsertParameters>標(biāo)記里都有對(duì)應(yīng)的參數(shù)。再轉(zhuǎn)向DetailsView的數(shù)據(jù)修改屬性,在智能標(biāo)簽里啟用插入、編輯、刪除功能。這樣會(huì)添加一個(gè)CommandField,并將ShowInsertButton、ShowEditButton和 ShowDeleteBu

31、tton屬性設(shè)置為true。在瀏覽器訪問(wèn)該頁(yè),注意到編輯、刪除、新建按鈕出現(xiàn)在DetailsView控件中,點(diǎn)“編輯”按鈕,DetailsView控件將進(jìn)入編輯模式,那些ReadOnly屬性設(shè)置為false(默認(rèn))的綁定列將變成一個(gè)文本框,而CheckBoxField將變成單選框。圖9:DetailsView控件的默認(rèn)編輯界面類似的,你可以將當(dāng)前選定行刪除,或向系統(tǒng)增加新產(chǎn)品記錄。由于InsertCommand語(yǔ)句里只包含ProductName, UnitPrice和Discontinued三列,當(dāng)完成新增記錄時(shí),其它列要么為NULL要么使用數(shù)據(jù)庫(kù)默認(rèn)值。和ObjectDataSource控件

32、一樣,假設(shè)數(shù)據(jù)庫(kù)表中存在這樣的列,其值不允許為NULL,且未設(shè)置默認(rèn)值,如果在InsertCommand命令里未包含該列的話,當(dāng)你試圖執(zhí)行該INSERT語(yǔ)句的時(shí)候?qū)⒊鲥e(cuò)。注意:DetailsView控件的默認(rèn)插入和編輯界面不能實(shí)現(xiàn)用戶定制和確認(rèn)功能,為了能實(shí)現(xiàn)用戶定制及添加確認(rèn)控件,我們需要將綁定列(BoundFields)轉(zhuǎn)換成模板列(TemplateFields)。獲得更多這方面的信息,請(qǐng)參閱前面的教程Adding Validation Controls to the Editing以及Customizing the Data Modification Interface 。同時(shí)謹(jǐn)記,當(dāng)進(jìn)行更新和刪除操作時(shí),DetailsView控件將使用當(dāng)前產(chǎn)品的DataKey值。如果編輯或刪除失敗話,檢查DataKeyNames屬性是否設(shè)置正確。自動(dòng)生成SQL語(yǔ)句的局限性只有當(dāng)選擇從表返回列時(shí),才能選用“自動(dòng)生成INSERT, UPDATE和DELETE命令”

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論