ado.net數據庫編程比較復雜,名目繁多的類、對象、屬性、方法讓每一個編程者都感覺惱火。本文旨在介紹asp.net beta2數據庫編程的主要內容,幫助編程者最快的了解ado.net數據庫編程的精髓。
  一、 managed providers
  如果你是初學者,可能你會問,什么是"managed providers"?
  managed providers提供簡單的方法連接和訪問數據庫,有點類似于數據庫連接,當然又比它強的多。managed providers提供oledb和sql server兩種編程接口。因為sql server是微軟自己的產品,因此,專門提供了一個針對sql server的接口,使用這個接口訪問sql server的效率應該比使用oledb強。
  namespaces
  本文所有的例子程序都需要使用以下namespaces:
| <%@ import namespace="system.data" %> <%@ import namespace="system.data.oledb" %> | 
| dim objconn as new oledbconnection ("provider=microsoft.jet.oledb.4.0; data source=e:/sff/site/db/users.mdb") | 
| objconn.open() | 
| objconn.close() objconn=nothing | 
| dim objcmd as new oledbcommand("select * from users", objconn) | 
| dim objcmd as new oledbcommand() objcmd.connection = objconn objcmd.commandtext = "select * from users" | 
| dim objcmd as new oledbcommand(sql string, connection string) | 
  仔細觀察上面的語句,我們發現在定義oledbcommand時,可以同時使用數據庫連接oledbconnection和數據庫連接語句。以上代碼并沒有執行sql語句,現在我們來看到底怎樣執行:
  executenonquery
  當執行沒有返回數據的操作的時候,我們可以使用以上方法,比如插入數據、更新數據等操作,具體這樣執行:
| objcmd.executenoquery | 
| dim objrd as oledbdatareader objrd = objcmd.exeutereader | 
| dim objreader as oledbdatareader objreader = objcmd.executereader while objreader.read response.write(objreader.getstring(0) & "<br>") end while | 
| dim objadapter as new oledbdataadapter("select * from users", objconn) | 
| dim ds as dataset = new dataset() objadapter.fill(ds, "users") | 
mappings
mappings可以實現對dataset的列取別名:
objadapter.tablemappings.add("adbtable", "users")
with objadapter.tablemappings(0).columnmappings
.add("pid", "id")
.add("lastname", "lname")
.add("streetaddress", "addy")
end with
objadapter.fill(ds) 
當使用了以上代碼以后,就可以用ds.tables("users")來代替ds.tables("adbtable")了。
command builder
在下一章我們可以看到command builder的具體使用和強大功能。
練習:
如果你能理解以下代碼,你就可以看下一章的內容了:
<%@ import namespace="system.data" %>
<%@ import namespace="system.data.oledb" %>
<script language="vb" runat="server">
sub page_load(sender as object, e as eventargs)
dim objconn as new oledbconnection("provider=microsoft.jet.oledb.4.0; data source=e:/sff/site/db/users.mdb")
objconn.open()
dim ds as dataset = new dataset()
dim objadapter as new oledbdataadapter("select * from users", objconn)
dim objcmdbld as new oledbcommandbuilder(objadapter)
objadapter.fill(ds, "users")
end sub
</script> 
  二、 data set
  本章將介紹dataset對象,dataset對象包含內容很多,我們基本上都將涉及,包括datatables、datarows等。
  什么是dataset
  回頭看看asp,我們知道當查詢數據的時候,返回的數據是放在recordset中的,recordset只能保存返回的一個表的數據,而且它很不靈活。
  dataset在recordset上增加了很多功能,并且,它可以保存多個返回的數據表結果。
  dataset被分解為很多部分比如datatables和datarows,可以使用它們創建一個dataset而不一定要連接到一個具體的數據庫。當然,dataset本身就是離線數據,所有的數據都可以離線使用而不必一直連接到數據庫,只有需要對數據庫進行編輯的時候才需要連接到數據庫。
  實踐
| dim ds1 as new dataset() dim dtable as new datatable("people") with dtable.columns .add("fname", system.type.gettype("system.string")) .add("lname", system.type.gettype("system.string")) .add("uid", system.type.gettype("system.int32")) end with dtable.columns("uid").autoincrement = true ds1.tables.add(dtable) dim pkey() as datacolumn = {ds1.tables("people").columns("uid")} ds1.tables("people").primarykey = pkey | 
  datatables
  datatable就是一個數據表,我們可以對這個表進行如:增加數據、修改數據等操作。我們也可以通過dataset建立一個datatable:
| dim dtable as datatable = ds1.tables("people") | 
| dim row as datarow = dtable.newrow() row(0) = "philip" row(1) = "quinn" dtable.rows.add(row) dtable.acceptchanges | 
| <%@ import namespace="system.data" %> <script language="vb" runat="server"> sub page_load(sender as object, e as eventargs) dim ds1 as new dataset() dim dtable as new datatable("people") with dtable.columns .add("fname", system.type.gettype("system.string")) .add("lname", system.type.gettype("system.string")) .add("uid", system.type.gettype("system.int32")) end with dtable.columns("uid").autoincrement = true ds1.tables.add(dtable) dim dtable2 as datatable = ds1.tables("people") dim row as datarow = dtable2.newrow() row(0) = "philip" row(1) = "quinn" dtable2.rows.add(row) dtable2.acceptchanges response.write(ds1.tables("people").rows(0)("fname").tostring) end sub </script> | 
| ds1.tables("people").rows(0)("fname") = "phil" | 
| dim drow as datarowcollection = ds1.tables("people").rows | 
| dim drow2 as datarow = drow.item(0) | 
| drow2(0) = "philip" drow2.acceptchanges | 
  三、 dataset的使用
  在第一章我們介紹了數據連接、執行查詢等內容,第二章我們介紹了dataset的方方面面,這一章我們將具體使用dataset。
| dataset <-> data source | 
| field name | type | fname | lname | id | 
| fname | text | philip | quinn | 1 | 
| lname | text | joesph | payne | 2 | 
| id | autonumber | douglas | adams | 3 | 
| michael | okuda | 4 | 
| <%@ page language="vb" %> <%@ import namespace="system.data" %> <%@ import namespace="system.data.oledb" %> <script language="vb" runat="server"> sub page_load(sender as object, e as eventargs) | 
| dim objconn as new oledbconnection("provider=microsoft.jet.oledb.4.0; data source=e:/sff/site/db/test.mdb") objconn.open() dim ds as dataset = new dataset() dim objadapter as new oledbdataadapter("select * from users", objconn) dim objcmdbld as new oledbcommandbuilder(objadapter) objadapter.fill(ds, "users") | 
| dim drow as datarow | 
| drow = ds.tables("users").newrow() drow(0) = "gene" drow(1) = "rodenberry" ds.tables("users").rows.add(drow) drow = ds.tables("users").newrow() drow(0) = "maxwell" drow(1) = "stewart" ds.tables("users").rows.add(drow) | 
| objadapter.update(ds, "users") | 
| end sub </script> | 
| <%@ page language="vb" debug="true" %> <%@ import namespace="system.data" %> <%@ import namespace="system.data.oledb" %> <script language="vb" runat="server"> sub page_load(sender as object, e as eventargs) dim objconn as new oledbconnection("provider=microsoft.jet.oledb.4.0; data source=e:/sff/site/db/test.mdb") objconn.open() dim ds as dataset = new dataset() dim objadapter as new oledbdataadapter("select * from users", objconn) dim objcmdbld as new oledbcommandbuilder(objadapter) objadapter.fill(ds, "users") dim drow as datarow drow = ds.tables("users").rows(1) drow(0) = "joseph" ds.tables("users").rows(0).acceptchanges objadapter.update(ds, "users") end sub </script> | 
  四、數據顯示和修改
  這一章我們將學習怎樣顯示數據,喜歡偷懶的你可以從拷貝以下代碼開始:
| <%@ page language="vb" debug="true" %> <%@ import namespace="system.data" %> <%@ import namespace="system.data.oledb" %> <script language="vb" runat="server"> sub page_load(sender as object, e as eventargs) dim objconn as new oledbconnection("provider=microsoft.jet.oledb.4.0; data source=e:/sff/site/db/test.mdb") objconn.open() dim ds as dataset = new dataset() dim objadapter as new oledbdataadapter("select * from users", objconn) dim objcmdbld as new oledbcommandbuilder(objadapter) objadapter.fill(ds, "users") | 
| repeater1.datasource = ds.tables("users").defaultview databind() | 
| rpt.datasource = ds.tables("users").defaultview databind() end sub </script> <html><body><font face="arial" size="2"> <asp:repeater id="rpt" runat="server"> <headertemplate> <table border="0" cellspacing="1" cellpadding="3"> <tr> <td bgcolor="#6699ff" width="25%">last name</td> <td bgcolor="#6699ff" width="25%">first name</td> </tr> </headertemplate> <itemtemplate> <tr> <td> <%# container.dataitem("lname") %> </td><td> <%# container.dataitem("fname") %> </td> </tr> </itemtemplate> <footertemplate> </table> </footertemplate> </asp:repeater> </font></body></html> | 
  datalist
  datalist和repeater有點相似,和repeater不同的是,datalist可以編輯數據。可以和repeater一樣使用template,但是它具有兩點不同:
   selecteditemtemplate:顯示選擇的列;
   edititemtemplate:顯示要編輯的列;
  以下是一個使用datalist的簡單舉例:
| dl.datasource = ds.tables("users").defaultview databind() end sub sub dl_itemcommand(sender as object, e as datalistcommandeventargs) dl.selectedindex = e.item.itemindex dl.databind() end sub </script> <html><body><font face="arial" size="2"><form runat="server"> <asp:datalist id="dl" runat="server" headerstyle-backcolor="#6699ff" selecteditemstyle-backcolor="#6666ff" selecteditemstyle-forecolor="#ffffff" repeatlayout = "table" repeatdirection = "vertical" datakeyfield = "id" onitemcommand="dl_itemcommand"> <headertemplate> last name, click for full name. </headertemplate> <itemtemplate> <asp:linkbutton id="b1" runat="server" text='<%# container.dataitem("lname") %>' commandname = "select" /> <br> </itemtemplate> <selecteditemtemplate> <%# container.dataitem("lname") & ", " & container.dataitem("fname") %> <br> </selecteditemtemplate> </asp:datalist> </form></font> </body> </html> | 
| dg.datasource = ds.tables("users").defaultview databind() end sub </script> <asp:datagrid id="dg" runat="server" /> 以上代碼很簡單,就是綁定數據。 dg.datasource = ds.tables("users").defaultview databind() end sub </script> <asp:datagrid id="dg" runat="server" bordercolor="black" gridlines="vertical" cellpadding="3" cellspacing="1" width="50%" font-names="arial" font-size="10pt" headerstyle-backcolor="#6699ff" alternatingitemstyle-backcolor="#6666ff" autogeneratecolumns="false"> <columns> <asp:boundcolumn headertext="id" datafield="id" /> <asp:templatecolumn headertext="name"> <itemtemplate> <asp:label id="name" runat="server" text='<%# container.dataitem("fname") & " " & container.dataitem("lname") %>' /> </itemtemplate> </asp:templatecolumn> </columns> </asp:datagrid> | 
  五、理解datagrid
  數據放入datagrid以后,除了一般的顯示以外,我們還需要對這些數據進行編輯、修改。看了前幾個章節你可能認為datagrid比較簡單,數據處理也比較方便。其實,如果需要真正做一個應用,我們會發現前面的知識還遠遠不夠。以下所用的數據庫和前面的章節完全相同,一些設置我們可以參考前面章節。我們先來看代碼:
| <%@ page language="vb" debug="true" %> <%@ import namespace="system.data" %> <%@ import namespace="system.data.oledb" %> <script language="vb" runat="server"> dim objconn as new oledbconnection("provider=microsoft.jet.oledb.4.0; data source=e:/sff/site/db/test.mdb") dim ds as dataset = new dataset() dim objadapter as new oledbdataadapter("select * from users", objconn) sub page_load(sender as object, e as eventargs) objconn.open() objadapter.fill(ds, "users") dg.datasource = ds dg.datamember = "users" if not page.ispostback then dg.databind() end if end sub sub dg_edit(sender as object, e as datagridcommandeventargs) dg.edititemindex = -1 dg.databind() end sub sub dg_cancel(sender as object, e as datagridcommandeventargs) dg.edititemindex = -1 dg.databind() end sub </script> | 
  自定義datagrid
  以下代碼演示了自定義datagrid的實現,在實際應用中,我們基本都是這樣使用datagrid,以下代碼很有典型性,可以作為一個好的參考。
| <form runat="server"> <asp:datagrid id="dg" runat="server" bordercolor="black" gridlines="vertical" font-names="arial" font-size="10pt" headerstyle-backcolor="#ffcc00" '表格頭信息 itemstyle-backcolor="#ffcc66" '每行背景色 alternatingitemstyle-backcolor="#ffffff" '交替背景色 autogeneratecolumns="false" '自定義每行 oneditcommand="dg_edit" '以下三個事件處理 oncancelcommand="dg_cancel" onupdatecommand="dg_update"> '自定義每行顯示 <columns> <asp:boundcolumn readonly="true" headertext="id" datafield="auto" /> <asp:boundcolumn headertext="first name" datafield="number1" /> <asp:boundcolumn headertext="last name" datafield="number2" /> <asp:editcommandcolumn edittext="edit" canceltext="cancel" updatetext="save" headertext="" /> </columns> </asp:datagrid> </form> | 
| sub dg_edit(sender as object, e as datagridcommandeventargs) dg.edititemindex = e.item.itemindex dg.databind() end sub | 
| sub dg_update(sender as object, e as datagridcommandeventargs) dim fname as textbox = e.item.cells(1).controls(0) dim lname as textbox = e.item.cells(2).controls(0) dim sqlstr as string sqlstr = "update users set " & _ "number1 = '" & fname.text & "', " & _ "number2 = '" & lname.text & "' " & _ "where auto = " & e.item.cells(0).text dim objcommand = new oledbcommand(sqlstr, objconn) objcommand.executenonquery() ds.tables.clear objadapter.fill(ds, "users") dg.edititemindex = -1 dg.databind() end sub | 
  六、datagrid數據排序
  數據排序在一些特殊的場合是必要的。下面我們將詳細介紹datagrid中的數據排序功能。在對datagrid數據實現排序功能以前,我們需要做以下準備:
  1、 將autogeneratecolumns設為打開,這樣自定義數據列功能將失去,同時也將失去直接編輯功能。其實這無關緊要的,數據顯示和編輯分開不同頁面這種模式其實是現在比較認可的方法。
  2、 必須將allowsorting設為真,這樣,在每一列數據的標題將建立一個鏈接,點擊這個鏈接將按照這個字段排序。
  3、 必須建立排序事件,也就是onsortcommand。
  現在看代碼:
| <asp:datagrid id="dg" runat="server" bordercolor="black" gridlines="vertical" font-names="arial" font-size="10pt" headerstyle-backcolor="#ffcc00" itemstyle-backcolor="#ffcc66" alternatingitemstyle-backcolor="#ffffff" autogeneratecolumns="true" oneditcommand="dg_edit" oncancelcommand="dg_cancel" onupdatecommand="dg_update" onsortcommand="dg_sort" allowsorting="true" > </asp:datagrid> | 
  排序事件處理
  排序需要用到dataview,現在我們來看排序處理:
| sub dg_sort(sender as object, e as datagridsortcommandeventargs) dim dtable as datatable = ds.tables("users") dim dview as new dataview(dtable) dview.sort = e.sortexpression.tostring & " asc" dg.datasource = dview dg.databind() end sub | 
  從以上代碼我們可以發現,數據排序功能的實現是需要依靠dataview的,排序以后,綁定數據。應用data view還可以實現其他很多功能,我們在這里只介紹它的排序應用。
  升序和降序
  我們可以給用戶選擇升序和降序來排列數據:
| <form runat="server"> <asp:datagrid id="dg" runat="server" bordercolor="black" gridlines="vertical" font-names="arial" font-size="10pt" headerstyle-backcolor="#ffcc00" itemstyle-backcolor="#ffcc66" alternatingitemstyle-backcolor="#ffffff" autogeneratecolumns="true" oneditcommand="dg_edit" oncancelcommand="dg_cancel" onupdatecommand="dg_update" onsortcommand="dg_sort" allowsorting="true" > </asp:datagrid> <p> <asp:radiobuttonlist runat="server" id="sortby" repeatdirection="horizontal" textalign="right" > <asp:listitem selected="true">ascending</asp:listitem> <asp:listitem>descending</asp:listitem> </asp:radiobuttonlist> </form> 以上大部分代碼我們都很熟悉,只是在最后加了兩個選項來選擇升序還是降序。我們來看事件處理: sub dg_sort(sender as object, e as datagridsortcommandeventargs) dim sortby = request.form("sortby") dim dtable as datatable = ds.tables("users") dim dview as new dataview(dtable) if sortby = "ascending" then dview.sort = e.sortexpression.tostring & " asc" else if sortby = "descending" then dview.sort = e.sortexpression.tostring & " desc" end if dg.datasource = dview dg.databind() end sub | 
事件先查看用戶選擇,然后根據用戶選擇來處理排序方式。
  總結:
  以上所有章節介紹了asp.net數據庫處理,雖然簡單,但是應該還是可以給讀者一些幫助的。需要注意的是,數據庫處理還有很多其他方面沒有介紹,在使用過程中需要我們不斷學習。
新聞熱點
疑難解答
圖片精選