分享
 
 
 

ASP 3.0高级编程(三十九)

王朝asp·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

8.4.3 创建记录集

创建一个记录集十分容易,通过调用Recordset对象的Open方法来实现:

Recordset.Open [Source], [ActiveConnection], [CursorType], [LockType], [Options]

参 数

说 明

Source

数据源。可以是数据库中的表名、存储的查询或过程、SQL字符串、Command对象或适用于提供者的其他命令对象

ActiveConnection

记录集使用的连接。可以是一个连接字符串或者一个打开的Connection对象

CursorType

使用的光标类型。必须是定义的光标类型中的一种,缺省值为adForwardOnly

LockType

使用的锁定类型。必须是定义的锁定类型中的一种,缺省值为adLockReadOnly

Options

告诉提供者Source参数的内容是什么,如表、文本字符串等等

例如,要打开数据库pubs中authors表上的记录集:

Dim rsAuthors

Set rsAuthors = Server.CreateObject("ADODB.Recordset")

rsAuthors.Open "authors", strConn

' Do something here

rsAuthors.Close

Set rsAuthors = Nothing

注意,有几个参数没有指定。实际上,所有的参数都是可选的,可以在打开记录集之前为它们设置相应的属性值:

Dim rsAuthors

Set rsAuthors = Server.CreateObject("ADODB.Recordset")

With rsAuthors

.Source = "authors"

.ActiveConnection = strConn

.CursorType = adOpenForwardOnly

.LockType = adLockReadOnly

.Open

End With

' Do something here

rsAuthors.Close

Set rsAuthors = Nothing

一旦打开记录集,当前指针自动地位于第一条记录上。如果在记录集中没有记录,那么EOF和BOF属性都是True:

rsAuthors.Open "authors", strConn

If rsAuthors.BOF and rsAuthors.EOF Then

' Recordset is empty

End If

1. Options参数

Open方法的Options参数允许指定命令文本内容。它可以是以下CommandTypeEnum常数之一:

· adCmdText:文本命令,比如SQL字符串。

· adCmdTable:表名。

· adCmdStoredProc:存储过程名。

· adCmdFile:保存的记录集的文件名。

· adCmdTableDirect:表名。

· adCmdURLBind:URL地址。

adCmdTable与adCmdTableDirect的区别很小,如果想使用表中的全部列,使用adCmdTableDirect将由于ADO执行了某些内部优化而使运行速度变得稍快一些。

如果没有指定命令的类型,ADO必须推算出执行的命令的类型,这将导致额外的开销。

这里还有两个选项:adCmdUnspecified表示没有指定类型;adCmdUnknow表示命令的类型未知。一般地可能不会使用它们。

额外的选项

Options参数可以是以上常数中的任一个,但也可以加入下列ExecuteOptionEnum常数:

· adAsyncExcute:异步地执行命令。

· adAsyncFetch:取得初始的行集后,异步地获取剩下的行。

· adAsyncFetchBlocking:除了获取记录不阻止命令运行以外,其他与adAsyncFetch相似。

· adExechteNoRecords:命令不返回任何记录。

异步处理意味着在后台执行操作,可以运行命令,然后继续其他工作,而不需要等待其执行完毕(同步操作)。当创建用户界面时,这显得特别方便,因为可以从命令执行中返回,向用户显示一些内容,而同时数据的获取仍然在后台进行。当返回记录集时,这对ASP程序员来说不是很有用,因为脚本语言不支持ADO事件,所以记录集何时已完成填充移无法得知。当处理更新、删除或插入数据命令以及不返回记录集的时候,可以使用异步操作,即仅在不关心结果的情况下才能使用。

在另一方面,adExecuteNoRecords选项十分有用。它告诉ADO执行的命令不返回任何数据。所以,就没有必要创建记录集(总之,可能为空)。这会加速正在运行的更新或添加数据的查询操作。

为了加入这些选项之一,可以使用Or符号(等同于加号“+”)

adCmdStoredProc Or adExecuteNoRecords

adCmdStoreProc + adExecuteNoRecords

在下一章,将看到对相关内容更详细的介绍,因为这在处理命令(而不是记录集)时会更有用。

2. 在记录集中移动

一旦打开一个记录集,经常需要遍历每一条记录。这需要使用EOF属性。当到达记录集的末尾时,EOF就变为True,因为可以这样创建一个循环:

rsAuthors.Open "authors", strConn

While Not rsAuthors.EOF

Response.Write rsAuthors("au_lname:) & ", " & _

rsAuthors("au_fname") & "<BR>"

rsAuthors.MoveNext

Wend

上面的例子一直循环到EOF属性为True时才退出。MoveNext方法用于移到下一条记录。

如果记录集允许向后移动,则可以使用MovePrevious方法。在这种情况下,循环中需要检测BOF属性值。另外分别还有移动到第一条和最后一条记录的MoveFirst和MoveLast方法:

rsAuthors.Open "authors", strConn, adOpenDynamic

' Now on first record

rsAuthors.MoveLast

' Now on last record

rsAuthors.MovePrevious

rsAuthors.MovePrevious

' Now three rows from the end of the recordset

rsAuthors.MoveFirst

' Back at the beginning again

3. 使用Fields集合

Fields集合包含记录集中每一字段(列)的Fields对象。Fields集合是记录集的缺省集合,因此在访问字段时可以省略,就如同上面的While...Wend例子中的情况。因此,有多种访问字段的方法:

rsAuthors.Fields("au_lname").Value

rsAuthors("au_lname).Value

rsAuthors(1).Value

rsAuthors.Fields(1).Value

可以使用字段名,或使用它在集合中的位置。使用名字是最好的,因为这样将使代码更易于维护。

Value属性是字段的缺省属性,因此也可以省略,比如:

rsAuthors("au_lname")

如果想遍历所有字段,可以使用For Each结构:

For Each fldAuthor In rsAuthors.Fields

Response.Write fldAuthor.Name & " : " & _

fldAuthor.Value & "<BR>"

Next

这个例子将打印每一个字段的名字和值。

4. 书签

当在记录集中移动时,可能需要保留记录的位置,以后再移回来。同真实的书签相似,一个记录集书签是一个指向单个记录的唯一的指针。

为了使用书签,只需将Bookmark属性值赋予一个变量:

varBkmk = rsAuthors.Bookmark

然后,可以在记录集中移动,以后可以通过相反的命令将记录移到做过书签标记的相应记录上:

rsAuthors.Bookmark = varBkmk

在记录集中查找记录时,书签是非常有用的。在本章稍后的8.4.5节中有一个相关的例子。

注意,并非所有记录集都支持书签,Supports方法(在下面讨论)将能识别其是否支持书签。

值得注意的重要一点是,不能跨越不同的记录集使用书签,即使这些记录集是相同的命令创建的。考虑一下以下代码:

rsAuthors.Open "authors", strConn

rsAuthorsOther.Opne "authors", strConn

varBkmk = rsAuthors.Bookmark

varBkmkOther = rsAuthorsOther.Bookmark

尽管两个记录集是用相同的命令创建的,但记录集的书签是不一样的。

可以使用Clone方法获得可交换的书签,但在这里我们不讨论它。

5. 支持的功能

如上所述,并非所有的记录集都支持书签。还有许多其他的记录集选项也不是被所有的提供者或记录集类型支持的,因此可以用Supports方法验证一下。

Supports方法使用一个或多个CursorOptionEnum值作为参数,返回True或False表明是否支持该选项。这些值的列表相当庞大,所以将其列于附录F中。

例如:

If rsAuthors.Supports(adBookmark) Then

' The recordset supports bookmarks

varBkMk = rsAuthors.Bookmark

End If

可以使用Or或加号“+”组合多个常数:

If rsAuthors.Supports(adBookmark Or adFind) Then

' The recordset supports bookmarks and use of Find

varBkMk = rsAuthors.Bookmark

End If

8.4.4 过滤记录集

过滤是一种暂时地限定记录集中可见记录的一种方法。如果仅显示记录集中的某些记录,但又不需要每次都重新查询数据库,这种方法非常有用。

1. 使用条件过滤

Filter属性拥有多个参数,其中一个就是条件表达式,它非常像SQL中Where子句:

rsAuthors.Filter = "state = 'ca'"

这个语句限定记录集只显示州名为ca的记录。使用这个过滤条件将使当前指针回到第一条匹配记录上。可以遍历记录集中的全部记录,并且只有匹配条件的记录才可见。

不仅仅限于单一条件,还可以使用And或Or把多个条件连接在一起:

rsAuthors.Filter = "au_lname = 'Homer' Or au_lname = 'Francis'"

这将过滤出姓为Francis或Homer的记录。

上面的例子显示了一个列匹配一个值的过滤方法,也可以使用下面操作符中的任何一种:

<:小于。

>:大于。

<=:小于等于。

>=:大于等于。

<>:不等于。

LIKE:通配符。

当使用通过配符操作时,可以使用“*”或“%”符号。例如:

rsAuthors.Filter = "au_lname LIKE 'Ho%'"

“*”或“%”作为一个通配符,匹配任何字符,因此上面的例子会匹配au_lname字段中以“Ho”字符开始的所有记录。

可以使用空字符串清空过滤条件,这样将显示全部记录:

rsAuthors.Filter = ""

2. 使用常数过滤

Filter属性也能用FilterGroupEnum常数作为其参数:

· adFilterNone:清空当前过滤条件,与使用一个空字符串的效果相同。

· adeFilterPendingRecords:只显示那些已改变的,但还没送到服务器的记录,只在成批更新模式下可用。

· adFilterAffectedRecords:只显示那些受上一次调用Delete、Resync、UpdateBatch和CancelBatch方法影响的记录。

· adFilterFetchedRecords:显示高速缓存中的记录,即上一次调用读取记录的命令时的结果。

· adFilterConflictingRecords:显示在上一次成批更新中更新失败的记录。

稍后会看到关于成批更新的介绍。

||||||3. 使用书签过滤

最后一种过滤记录集的方法是使用一个书签数组。可以使用这个技术创建一个记录列表,然后再应用一个过滤条件对其过滤。例如:

rsAuthors.Open "authors", strConn, adOpenKeyset, _

adLockReadOnly, adCmdTableDirect

' Save bookmark for the first record

avarBkmk(0) = rsAuthors.Bookmark

' Move forward two records

rsAuthors.MoveNext

rsAuthors.MoveNext

' Save bookmark for the third record

avarBkmk(1) = rsAuthors.Bookmark

' Move to the end and save the bookmark

rsAuthors.MoveLast

avarBkmk(2) = rsAuthors.Bookmark

' Now apply the filter

rsAuthors.Filter = Array(avarBkmk(0), avarBkmk(1), avarBkmk(2))

' Now loop through the recordset

While Not rsAuthors.EOF

Response.Write rsAuthors("au_lname") & "<BR>"

rsAuthors.MoveNext

Wend

当循环至记录集末尾位置时,会发现只有三条记录,因为只有三个书签应用于过滤条件。

注意,不能直接使用数组avarBkmk,必须使用Array函数将各个书签转换成不同的数组。

8.4.5 查找记录

查找单个的记录由Find方法来完成。它类似于使用条件的过滤方法:

rsAuthors.Find "au_lname = 'Lloyd'"

它们之间最主要的区别在于这种方法只能有一个条件,不允许使用And或Or。

可以使用可选的参数指定一些额外的选项,其完整的语法如下:

Recordset.Find Criteria, [SkipRows], [SearchDirection], [Strat]

SkipRows是一个数字,表示在开始查找记录前跳过的行数。缺省为0,查询从当前行开始。

SearchDirection可以是adSearchForward,表示向前搜索记录;或者adSearchBackward,表示向后搜索记录。

Start是一个书签,指出开始查找记录的位置。

如果打开相应的记录,当前指针将位于匹配的记录上,如果没有找到记录,那么将位于下面两个位置中的一个:

· 如果是向前搜索,则位于记录集末尾位置的后面,EOF被设置为True。

· 如果是向后搜索,则位于记录集开始位置的前面,BOF被设置为True。

使用书签保存位置

如果没有找到相应的记录,记录的重新定位可以由书签轻松解决,因为可以为当前位置制作书签,如果在查找记录过程中没有找到所需的记录,那么再移回到上次保存的位置。

例如:

' Save the current position

varBkmk = rsAuthors.Bookmark

' Find the record

rsAuthors.Find "au_lname = 'Sussman'"

' Was it found

If Not rsAuthors.EOF Then

Response.Write "Found: " & rsAuthors ("au_lname") & ", " & _

rsAuthors("au_fname") & "<BR>"

Else

Response.Write "Not found. Moving <BR>"

rsAuthors.Bookmark = varBkmk

End If

使用Filter属性强于Find方法的一个原因是Find语句只能一个查询条件,而Filter属性允许指定多个条件。也就是说,当想要查找的字段条件不止一个时,不能使用Find方法。然而,可以先过滤记录,如果找到记录可以再删除过滤条件。

8.4.6 修改记录

大部分的Web只用来显示信息,而Web应用程序正变得越来越普遍。在这种情形下,如果只拥有只读数据确实没有什么用处。创建一个应用程序,几乎总是需要修改现存的数据或是添加新的数据,其方法有许多。在本节,将学习如何使用Recordset对象的方法来更改数据。在下一章,将会看到如何使用查询完成相同的任务。

可以设置除了adLockReadOnly之处的锁定类型配合使用Recordset对象的方法去修改数据(假定有相应的权限)。记住,缺省的锁定类型是只读的。

1. 添加记录

要在记录集中添加记录,使用AddNew方法。有两种使用AddNew的方法。第一种没有任何参数,仅仅调用AddNew,在记录集的最后添加一个空记录。在调用Update方法保存所做的更改之前,可以随意地修改字段中的数据:

With rsAuthors

.Open "authors", strConn, adOpenDynamic, _

adLockOptimistic, adCmdTableDirect

.AddNew

.Fields("au_id") = "123-12-1234"

.Fields("au_lname") = "Lloyd"

.Fields("au_fname") = "Janine"

.Fields("contract") = 0

.Update

End With

这只是添加了一条新记录,设置四个强制型的字段值。

另一种方法是使用AddNew方法的可选参数,这是两个数组,一个是字段名,另一个是字段的值。

With rsAuthors

.Open "authors", strConn, adOpenDynamic, _

adLockOptimistic, adCmdTableDirect

.AddNew Array("au_id", "au_lname", "au_fname", "contract"), _

Array("123-12-1234", "Lloyd", "Janine", 0)

End With

这个方法不需要调用Update方法。

2. 编辑记录

编辑记录与添加记录的方法相似,不同之处在于不需要调用AddNew方法:

strSQL = "SELECT * FROM authors" & _

"WHERE au_lname='Lloyd'"

With rsAuthors

.Open strSQL, strConn, adOpenDynamic, _

adLockOptimistic, adCmdText

.Fields("contract") =1

.Update

End With

这仅仅是将当前记录(在这种情况下是第一条记录,因为刚刚打开记录集)的contract字段的值赋为1。

3. 删除记录

删除记录需调用Delete方法。删除哪一条记录取决于可选的参数,可以是下面AffectEnum常数中的一个:

· adAffectCurrent:删除当前记录,缺省操作。

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有