首页 > 编程 > .NET > 正文

ADO.NET 数据库实例教程

2024-07-10 13:04:40
字体:
来源:转载
供稿:网友


收集最实用的网页特效代码!

  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" %>

  connection

  为了连接数据库,必须使用oledbconnection:

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

  command

  连接数据库以后,就可以发送命令对数据库进行操作了,oledbcommand允许发送命令对数据库进行操作。根据发送的sql语句,我们可以对数据库进行几乎所有操作。

dim objcmd as new oledbcommand("select * from users", objconn)

  以上语句建立command,根据习惯不同,也可以使用以下方法:

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

  executereader

  在需要一个data reader的时候,我们可以使用以上方法,具体这样执行:

dim objrd as oledbdatareader
objrd = objcmd.exeutereader

  executescalar

  使用executescalar方法来取得一个单个地返回数据,比如对数据的统计。

  data reader

  oledbreader是专门用来读取数据的对象,这个对象除了读数据以外,不能做其他任何数据库操作。尽管比较简单,但是在用来浏览数据的时候效率是非常高的。

dim objreader as oledbdatareader
objreader = objcmd.executereader
while objreader.read
response.write(objreader.getstring(0) & "<br>")
end while

  以上语句读取command的返回结果的第一个字段,这个字段是字符型数据。我们可以使用其他方法取得各种类型的数据:

    getboolean(x)

    getbyte(x)

    getbytes(x)

    getchar(x)

    getchars(x)

    getdatatypename(x) -取得数据类型

    getdatetime(x)

    getdecimal(x)

    getdefaultstream(x)

    getdouble(x)

    getfieldtype(x)

    getfloat(x)

    getguid(x)

    getint16(x)

    getint32(x)

    getint64(x)

    getname(x) - 取得字段名

    getordinal(name) -根据字段名取得字段序号

    getstring(x)

    gettimespan(x)

    getvalue(x)

    getvalues(values())

  以上方法都是command返回数据。

  data adapter

  oledbdataadapter取得数据并且数据与dataset之间建一座桥梁,可以这样使用:

dim objadapter as new oledbdataadapter("select * from users", objconn)

  实现方法有点类似于oledbcommand。oledbadapter可以填充dataset,也可以修改数据然后提交以实现对具体数据的修改:

dim ds as dataset = new dataset()
objadapter.fill(ds, "users")

  以上语句实现将sql语句取得的users表的数据填充到dataset。

  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

  以上语句稍微有点复杂,我们来看看:

  前半部分我们建立了一个dataset和一个叫people的datatable,然后,我们为这个datatable加入了三个列并将"uid"列设为自动递增。最后,将这个datatable加入到了dataset。

  第二部分我们现在不需要理解,只要知道定义了主键就可以了。

  datatables

  datatable就是一个数据表,我们可以对这个表进行如:增加数据、修改数据等操作。我们也可以通过dataset建立一个datatable:

dim dtable as datatable = ds1.tables("people")

  这样,将dataset的表people的结构和数据拷贝到了datatable中,尽管它是无连接的,但是仍然可以通过修改这个dataset来更新dataset表,因此,如果我们在dtable中增加一列并且接受改变就以实现对dataset的修改:

dim row as datarow = dtable.newrow()
row(0) = "philip"
row(1) = "quinn"
dtable.rows.add(row)
dtable.acceptchanges

  这样我们就建立了一个新的datarow,这和用dtable.newrow()建立一个新的数据列一样,我们还可以给这个列取名了fname。

  因为以上的datatable来自dataset,如果我们使用dtable.acceptchanges方法更新datatable,dataset也会被更新:

<%@ 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>

  以上代码将显示"philip",现在我们来看看具体过程:

  1、 建立一个dataset和一个叫"people"的datatable;

  2、 增加三个数据列并且设置它们的数据属性;

  3、 将它们加入到dataset;

  4、 建立另外一个datatable,这个datatable是刚才建立的那个的拷贝;

  5、 用datatable建立新的datarow并加入数据;

  6、 接受数据改变同时更新了dataset;

  7、 显示第一个数据列;

  datarows

  datarow是datatable的数据列,刚才我们已经看到,我们可以使用datatable的以下方法建立一个新的datarow:

ds1.tables("people").rows(0)("fname") = "phil"

  以上语句中,ds1.tables("people")选择表"people",.rows(0)选择表的第一行,("fname")选择表的字段为"fname"。

  datarows是数据列的集合,通过以下语句取得:

dim drow as datarowcollection = ds1.tables("people").rows

  对于datarows,我们基本上不能做太多。如果针对一个具体的数据列,我们可以这样:

dim drow2 as datarow = drow.item(0)

  需要修改这个列的数据,可以这样:

drow2(0) = "philip"
drow2.acceptchanges

  可能说了那么多,我们都觉得比较复杂,我们很容易就理清了dataset、datatable、datarowcollection、datarows、datacolumn和datacolumncollection之间的相互关系。

  三、 dataset的使用

  在第一章我们介绍了数据连接、执行查询等内容,第二章我们介绍了dataset的方方面面,这一章我们将具体使用dataset。

dataset <-> data source

  dataset和data source通过dataadapter进行联系,当dataset取得数据库数据以后,就和数据库断开连接,针对数据作的所有数据修改在没有提交以前都在dataset里面保存。

  数据修改

  我们将通过一个小的举例来说明数据怎样被修改和提交。

  这是数据结构(access设计)

field nametypefname lnameid
fnametextphilipquinn 1
lname textjoesphpayne2
idautonumberdouglasadams 3
  michaelokuda4

  举例一:

  我们将一段一段的看程序代码:

<%@ 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)

  以上代码导入namespace同时说明编程语言为vb;

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")

  以上代码建立了connection、dataadapter和commandbuilder,并且填充了dataset。我们必须注意以下几点:

  一、 dataadapter是数据和dataset之间的桥梁;

  二、 commandbuilder建sql语句来执行;

dim drow as datarow

  以上语句声明一个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)

  以上代码为dataset增加一个新的列;

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>

  总结:

  以上我们知道了怎样更新dataset的数据,可能那些并不是特别实用,下一章我们将涉及到用较好的方式显示数据和通过textbox修改数据。

  四、数据显示和修改

  这一章我们将学习怎样显示数据,喜欢偷懒的你可以从拷贝以下代码开始:

<%@ 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")

  repeater

  repeater是一个根据面板循环显示数据的控件。

  itemtemplate:数据主要在这里显示

  alternativeitemtemplate:利用它可以应用交替的样式;

  headertemplate:头格式;

  separatortemplate:分隔数据列;

  footertemplate:脚格式

  databind()

  databind()将数据与页面控件绑定:

repeater1.datasource = ds.tables("users").defaultview
databind()

  以上代码将数据绑定到repeater,如果没有绑定,数据不会显示。

  其他代码

  以下是举例的其他代码:

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>

  说明:

  一、 设置了repeater的datasource;

  二、 绑定数据到repeater;

  三、 repeater数据控件开始;

  四、 headtemplate定义repeater的头信息;

  五、 itemtemplate定义具体数据填充;

  六、 footertemplate定义repeater脚信息;

  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>

  说明:

  一、 绑定数据以后,建立了一个过程;

  二、 将datalist放入form中,因为在以下的步骤中要求根据选择列刷新页面;

  三、 接着定义了一些数据显示格式;

  四、 headertemplate:datalist头信息;

  五、 itemtemplate:加入链接,定义事件;

  六、 selecteditemtemplate:显示first 和 last name;

  datagrid

  可能它是功能最强大的控件,不管简单还是复杂它都可以实现。

  和itemtemplate不同,datagrid有不同类型的列:

   bound columns:datagird默认列显示方式;

   button columns:按钮列;

   edit command column:可以编辑的列;

   hyperlink column :带连接的列;

   templated column :自定义列显示;

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>


  可能有一点复杂,我们看说明:

  一、 绑定数据以后,设置了一些dataset显示效果,包括字体、表宽、头信息背景颜色、交替背景颜色、是否自动生成数据表等;

  二、 加入一个自定义格式列,该列名为name,由字段fname和lname组成;

  现在才刚刚开始

  可能现在你还没有感受到dataset的好处,以后的章节我们将学习怎样编辑数据。

  五、理解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>

  以上程序代码很简单直接,我们应该都可以看懂。只是需要注意page_load的对数据绑定的处理,在几乎所有的数据库程序中,我们都使用这种方式处理数据绑定,所以,这个处理方式一定要牢记。以上是数据连接和事件处理部分,现在我们看datagrid部分。

  自定义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>

  以上代码中,自定义了数据编辑列,这些相应的处理在前面已经给出代码。我们现在来看事件处理。

  oneditcommand

  以下是编辑按钮处理代码:

sub dg_edit(sender as object, e as datagridcommandeventargs)

dg.edititemindex = e.item.itemindex
dg.databind()
end sub

  以上代码需要注意的是,e.item.itemindex就是我们需要编辑的那行数据。在对数据作任何变动以后,都需要重新绑定数据,也就是databing()。

  oncancelcommand

  取消按钮处理和上面的编辑按钮处理差不多,区别的是,在这里,dg.edititemindex被设为-1,也就是将数据恢复到原来状态。

  onupdatecommand

  先来看数据更新代码:

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

  以上代码将建立两个textbox,这两个textbox就是datagrid中的复本。然后用sql语句更新数据,最后重新绑定数据。

  总结

  以上代码可能初学者比较难懂,而且,上面的数据更新方法也不是很好。但是为了我们更好理解,我们还是可以参考以上代码。

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表