一、 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 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)
以上代码导入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修改数据。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!


