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数据库处理,虽然简单,但是应该还是可以给读者一些帮助的。需要注意的是,数据库处理还有很多其他方面没有介绍,在使用过程中需要我们不断学习。
新闻热点
疑难解答
图片精选