




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、在ASP.NET 2.0中操作數據之四十七:用SqlDataSource控件插入、更新、刪除數據作者:heker2007 字體:增加 減小 類型:轉載 時間:2016-05-14 我要評論本文主要介紹使用SqlDataSource控件完成插入、更新、刪除數據等操作,通過設置向導,SqlDataSource控件的InsertCommand, UpdateCommand和DeleteCommand屬性都會被賦以相應的 INSERT, UPDATE和DELETE SQL語句,從而實現相應的操作。導言:正如在教程概述插入、更新和刪除數據里討論的那樣,GridView控件內置更新和刪
2、除功能,而DetailsView和FormView控件不僅具有編輯和刪除功能,還有插入功能。我們不要寫一行代碼就可一將這些功能直接應用于一個數據源控件。在這篇教程里,我們指出ObjectDataSource控件最好與GridView, DetailsView和FormView控件一起使用,才更好的實現插入、更新和刪除功能。對SqlDataSource控件來說,同樣如此!對ObjectDataSource控件來說,為了實現插入、更新和刪除,我們需要指定調用那個方法來實現插入、更新和刪除功能。對SqlDataSource來說,我們需要指定INSERT, UPDATE和DELETE三種SQL語句(或
3、存儲過程)。就像接下來在本章探討的那樣,我們可以手寫代碼或SqlDataSource的設置數據源向導自動的生成。注意:由于我們已經探討過了GridView, DetailsView和FormView控件的插入、編輯和刪除功能,在本章我們主要關注怎樣設置SqlDataSource以支持這些功能。倘若你想重溫如何實現GridView, DetailsView和FormView的這些功能,參考教程概述插入、更新和刪除數據第一步:指定INSERT, UPDATE和DELETE命令就像在前2章教程探討的那樣,從SqlDataSource控件檢索數據,需要設置2個屬性:1. ConnectionStrin
4、g,指定要查詢的數據庫。2. SelectCommand,指定用來返回結果的ad-hoc SQL語句或存儲過程的名稱。對SelectCommand里的參數來說,其值在SqlDataSource控件的SelectParameters部分指定,可以為“硬編碼”值,普通的參數源值(比如來自于查詢字符串、 session變量、Web控件等)、或通過編程設置。當一個數據Web控件調用SqlDataSource的Select() 方法時不管是自動的還是通過編程調用的,發生這些事件:連接指定數據庫,對參數賦值并執行查詢,檢索并返回結果。返回的結果是DataSet還是DataReader,取決于SqlData
5、Source的DataSourceMode屬性是設置為DataSet還是DataReader。和選擇數據一樣,要實現插入、更新和刪除數據,我們只要提供相應的INSERT, UPDATE和DELETE SQL語句就夠了。方法是對InsertCommand, UpdateCommand和DeleteCommand屬性賦以相應的 INSERT, UPDATE和DELETE SQL語句。如果這些SQL語句包含參數(現實中經常碰到),將這些參數放在相應的InsertParameters, UpdateParameters和DeleteParameters部分。一旦指定了SqlDataSource控件的I
6、nsertCommand, UpdateCommand和DeleteCommand三種命令,就可以在相應的數據Web控件啟用插入、編輯和刪除功能。為驗證起見,我們拓展Querying.aspx頁面的刪除功能。打開SqlDataSource文件夾的InsertUpdateDelete.aspx和Querying.aspx頁面,首先選擇Querying.aspx頁面,進入設計模式,選中SqlDataSource控件和GridView控件(ID分別為ProductsDataSource和GridView1),點“編輯”菜單,選“復制”(或直接按Ctrl+C),然后將這2個控件粘貼在InsertUpd
7、ateDelete.aspx頁面。在瀏覽器里測試該頁面,你將會看到表Products里所有產品的ProductID, ProductName和UnitPrice顯示出來。圖1:所有產品按ProductID排序并顯示出來添加SqlDataSource控件的eleteCommand命令和DeleteParameters屬性到目前為止,我們的SqlDataSource只是從表Products返回記錄,然后在GridView控件里顯示出來。我們的目標是擴展其功能,允許用戶在GridView控件刪除數據。為此,我們需要為SqlDataSource控件的DeleteCommand和DeleteParame
8、ters屬性賦值,然后啟用GridView的刪除功能。可以用下面的方法為SqlDataSource控件的DeleteCommand和DeleteParameters屬性賦值:1. 聲明代碼2. 在屬性窗口指定屬性值3. 在設置數據源向導的“指定自定義SQL語句或存儲過程”界面里指定4. 在設置數據源向導的“來自表或視圖的指定列”界面里點“高級”按鈕,這樣做會自動生成DeleteCommand和DeleteParameters屬性里要用到的DELETE SQL語句和參數。我們將在接下來的第2步探討如何自動得生成DELETE語句。現在我們嘗試在屬性窗口里設置DeleteCommand和Delete
9、Parameters。當然直接聲明代碼和使用設置數據源向導也可以辦到。打開InsertUpdateDelete.aspx頁面,進入設計模式,選中ID為ProductsDataSource的SqlDataSource控件,打開其屬性窗口(從視圖菜單中選屬性窗口,或直接按F4按鈕)選擇DeleteQuery屬性,在方框右邊會出現一個橢圓型區域。圖2:在屬性窗口里選擇DeleteQuery屬性。注意:SqlDataSource控件其實并沒有DeleteQuery屬性。或者更準確的說,它是由DeleteCommand和DeleteParameters兩個屬性構成的。雖然我們在設計模式里可以看到屬性窗口
10、列出了DeleteQuery屬性,但切換到源碼模式的時候,我們會看到代碼里只有 DeleteCommand屬性而沒有DeleteQuery屬性。點擊該橢圓型區域,將轉換到“編輯命令和屬性”對話框(見圖3)。在該對話框,你可以指定DELETE SQL語句及要用的參數。在DELETE: command文本框里鍵入如下查詢:(手工輸入或者借助查詢生成器,悉聽尊便):?12DELETE FROM ProductsWHERE ProductID = ProductID然后,點Refresh Parameters按鈕,將參數ProductID添加到下面的參數列表。圖3:在屬性窗口里選擇DeleteQuer
11、y屬性(譯注:圖片說明有誤)暫時不要為該參數賦值(在參數源下列列表選“None”)。當我們為GridView控件啟用刪除功能后,GridView將自動為該參數傳遞值,傳遞的值為被選擇刪除的那行記錄的DataKeys值。注意:在DELETE查詢語句中使用的參數名必須與GridView, DetailsView或FormView控件的DataKeyNames值一樣。比如:因為表Products的主鍵是ProductID,自然地,GridView控件的DataKeyNames值也是ProductID,相應地,DELETE語句中的參數應設置為ProductID(當然,你也可以任意地設置為其它名字,比如
12、ID)。當參數名與DataKeyNames不匹配時(比如你將參數設置為ID),GridView控件無法將DataKeys值傳給SQL語句中的參數。在“編輯命令和參數”對話框里鍵入相關刪除信息后,點“OK”按鈕。進代碼模式查看代碼:?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>設置GridView控件以支持刪
14、除功能設置了DeleteCommand屬性后,GridView控件的智能標簽里便可包含刪除選項。就像在教程概述插入、更新和刪除數據里探討的一樣,點擊該按鈕將促使GridView控件增加一個CommandField列,同時將ShowDeleteButton屬性設置為true。就像在圖4展示的那樣,當通過瀏覽器訪問該頁面時,GridView控件將包含一個刪除按鈕。圖4:在GridView控件中,每一行記錄都包含一個刪除按鈕點擊刪除按鈕后,將發生postback事件,GridView控件將該行記錄的DataKeys值賦值給參數ProductID,并調用SqlDataSource控件的Delete()
15、方法。SqlDataSource控件隨即連接到數據庫并執行DELETE命令。最后GridView控件再次綁定SqlDataSource控件,獲取并展示當前的產品(因為執行了刪除命令,剛被刪除的那個產品也就顯示不出來了)。注意:因為GridView控件是將它的DataKeys值傳給SqlDataSource控件的參數,所以尤為重要的是將GridView的DataKeyNames屬性設置為主鍵列,而且SqlDataSource控件的SelectCommand要返回這些列。具體到本例,最好將SqlDataSource控件的DeleteCommand里的參數設置為ProductsID。如果DataKe
16、yNames 屬性沒有設置,或參數名不是ProductsID,點擊刪除按鈕時也會發生postback事件,但不會成功地刪除記錄。圖5形象地顯示了該原理。圖5:點擊GridView控件的刪除按鈕將會調用SqlDataSource的Delete()方法第2步:自動的創建INSERT、UPDATE和DELETE語句就像在第1步中提到的那樣,INSERT、UPDATE和DELETE SQL語句可以在屬性窗口設置,也可以通過控件聲明來構造。然而這樣需要我們手寫代碼,單調且容易出錯。幸運的是,我們可以通過數據源設置向導來自動的生產INSERT、UPDATE和 DELETE語句。方法是使用它的“指定來自表或
17、視圖的列”模式。打開InsertUpdateDelete.aspx頁面,在設計模式里添加一個DetailsView控件,設置其ID為ManageProducts,接下來,在其智能標簽里選擇“創建新數據源”,創建一個名為ManageProductsDataSource的SqlDataSource,如下圖:圖6:創建一個名為ManageProductsDataSource的SqlDataSource控件選擇數據庫時,在下拉列表中選擇NORTHWINDConnectionString連接字符串,點下一步,在“設置選擇命令”界面里,選中“指定來自表或視圖的列”,在下拉列表中選擇表Products,選中
18、表的ProductID、ProductName、UnitPrice和 Discontinued列。圖7:返回表Products的ProductID、ProductName,、UnitPrice和Discontinued為了自動創建基于選定表和選定列的INSERT、UPDATE和DELETE命令,點擊“高級”按鈕,選中“生成INSERT、UPDATE和DELETE命令”選項。圖8:選中“生成INSERT、UPDATE和DELETE命令”選項當查詢返回的那些列包含主鍵列(有時幾個列都是主鍵列)時,才能啟用“生成INSERT、UPDATE和DELETE命令”選項。當選擇了“生成INSERT、UPDA
19、TE和DELETE命令”選項后,才能選擇“使用開放式并發”選項。當選擇該選項后,就將在UPDATE和DELETE命令里增加WHERE字句,以提供開放式并發控制。現在先不忙選擇“使用開放式并發”選項,我們將在后面的教程里討論如何使SqlDataSource控件實現開放式并發。當選擇“生成INSERT、UPDATE和DELETE命令”選項后,點“OK”回到“設置選擇命令”界面,再點下一步,點完成。完成向導后,Visual Studio將會為DetailsView控件增加ProductID, ProductName和UnitPrice三個綁定列(BoundFields),和一個Discontinue
20、d單選框列(CheckBoxField )。在DetailsView控件的智能標簽里選擇分頁項,并清空DetailsView的寬、高屬性。我們注意到智能標簽里還包括插入、編輯、刪除選項可用,這是因為SqlDataSource控件的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控件是如何自動的為InsertCommand,UpdateCommand和DeleteCommand屬性賦值的。InsertCommand和UpdateCommand屬性里涉及到的列取決于SELECT命令里的列,換句話說,并不是表Products的所有列都出現在InsertCommand和UpdateCommand屬性里。在InsertCommand和UpdateCommand屬性里只能使用SelectCommand返回的那些列(列ProductID除外,因為它是一個IDENTITY列,I
30、DENTITY列的值在編輯的時候不允許改變,而且新插入一條記錄時,自動對IDENTITY列賦值)。另外在InsertCommand, UpdateCommand和 DeleteCommand屬性里出現的每個參數,在<DeleteParameters>、<UpdateParameters>、<InsertParameters>標記里都有對應的參數。再轉向DetailsView的數據修改屬性,在智能標簽里啟用插入、編輯、刪除功能。這樣會添加一個CommandField,并將ShowInsertButton、ShowEditButton和 ShowDeleteBu
31、tton屬性設置為true。在瀏覽器訪問該頁,注意到編輯、刪除、新建按鈕出現在DetailsView控件中,點“編輯”按鈕,DetailsView控件將進入編輯模式,那些ReadOnly屬性設置為false(默認)的綁定列將變成一個文本框,而CheckBoxField將變成單選框。圖9:DetailsView控件的默認編輯界面類似的,你可以將當前選定行刪除,或向系統增加新產品記錄。由于InsertCommand語句里只包含ProductName, UnitPrice和Discontinued三列,當完成新增記錄時,其它列要么為NULL要么使用數據庫默認值。和ObjectDataSource控件
32、一樣,假設數據庫表中存在這樣的列,其值不允許為NULL,且未設置默認值,如果在InsertCommand命令里未包含該列的話,當你試圖執行該INSERT語句的時候將出錯。注意:DetailsView控件的默認插入和編輯界面不能實現用戶定制和確認功能,為了能實現用戶定制及添加確認控件,我們需要將綁定列(BoundFields)轉換成模板列(TemplateFields)。獲得更多這方面的信息,請參閱前面的教程Adding Validation Controls to the Editing以及Customizing the Data Modification Interface 。同時謹記,當進行更新和刪除操作時,DetailsView控件將使用當前產品的DataKey值。如果編輯或刪除失敗話,檢查DataKeyNames屬性是否設置正確。自動生成SQL語句的局限性只有當選擇從表返回列時,才能選用“自動生成INSERT, UPDATE和DELETE命令”
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 應急與事故管理制度
- 弱電hse管理制度
- 影院使用及管理制度
- 微型消防站管理制度
- 心理功能室管理制度
- 快遞公司誰管理制度
- 念佛堂機構管理制度
- 患者自費藥管理制度
- 慢病篩查與管理制度
- 成都劇本殺管理制度
- 法院婚內財產協議書模板
- 四年級信息技術測試卷附答案
- 云計算平臺搭建與運維考核試卷
- 五年級下學期科學立體小菜園課件
- 2024年河北石家莊市市屬國企業春季面向社會公開招聘282人易考易錯模擬試題(共500題)試卷后附參考答案
- GB/T 44191-2024政務服務便民熱線知識庫建設指南
- 網課智慧樹知道《運動療法技術學(濟寧學院)》章節測試答案
- MOOC 現代科技與人類未來-大連大學 中國大學慕課答案
- MOOC 數據挖掘與python實踐-中央財經大學 中國大學慕課答案
- 國家開發大學電大《心理學》課程形成性考核冊試題及答案(1-4)
- 2024年中考語文復習考點幫考點四 標點符號(解析版)
評論
0/150
提交評論