>
' 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:删除当前记录,缺省操作。
? adAffectGroup:删除匹配当前过滤条件的所有记录。
? adAffectAll:删除记录集中的全部记录。
? adAffectAllChapters:删除所有段(chapter)中的记录。
最简单的调用形式是:
rsAuthors.Delete
这将删除当前记录。如果有一个过滤条件,并想删除所有匹配该条件的记录,那么仅需加上适当的常数:
rsAuthors.Delete adAffectGroup
4. 自动递增的字段
当添加一条新记录时,一般会碰到这样一个问题:如何处理那些自动递增的或标识字段(Identity Filed)。这些字段是由服务器自动更新的数字字段,一般用于为每一行提供一个唯一的字段值。当数据库含有多个表时,那么这个唯一的字段经常被当作关联表的外键。所以,添加一条新记录时,经常需要找出它们的值。
例如,考虑一下有两个字段的表,一个自动递增的ID字段(SQL Server中的IDENTITY字段或Access中的AutoNumber字段),一个字段名为Name的文本字段。现在考虑一下下面的向表中添加记录的代码:
With rsData
.Open "tblTest", adOpenDynamic, adLockOptimistic, adCmdTableDirect
.AddNew
.Fields("Name") = "Janine"
.Update
intID = .Fields("ID")
End With
看上去很平常,但添加记录后是否能够取到这个值依赖于光标的类型、锁定的类型以及ID字段是否被索引。表8-4列出了哪些组合允许获取新插入的ID字段的值。其他没有列在表中的组合不能返回ID字段的值。
表8-4 获取ID字段的值与光标、锁定的类型及ID字段是否被索引的关系
提供者
对象
索引
光标位置
光标类型
锁定类型
ODBC
Access97
是
服务器
键集
悲观型
乐观型
Access2000
是
服务器
键集
悲观型
乐观型
否
客户
所有
悲观型
乐观型
SQL Server 6.5
是
服务器
键集
悲观型
乐观型
SQL Server 7.0
是
服务器
键集
悲观型
乐观型
客户
所有
悲观型
乐观型
否
客户
所有
悲观型
乐观型
Jet 4.0
Access97
是
服务器
所有
所有
Access 2000
是
服务器
所有
所有
否
客户
所有
悲观型
乐观型
SQL OLE DB
SQL Server 6.5
SQL Server 7.0
是
服务器
键集
悲观型
乐观型
客户
所有
悲观型
乐观型
否
客户
所有
悲观型
乐观型
这清楚地说明必须使用正确的组合,才能保证能取得ID字段的正确值。否则,可能会得到0、空值或NULL,这取决于组合的方式。
在下一章中处理存储过程时,将见到另一种从SQL Server获取IDENTITY字段值的方法。
8.5 管理错误
处理数据存储时,发生错误的可能性总是存在的:安全性问题,试图更新已被其他用户删除的记录,诸如此类的问题很多。不能保证一切都运行良好,因此必须构建某种形式的错误控制。
在第7章中,研究了ASP页面中一般的错误处理,但现在涉及的是数据存储,所以必须考虑使用额外的代码进行错误处理。先看一下Errors集合,再讨论其如何满足ASP 3.0的错误处理机制。
' 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:删除当前记录,缺省操作。
? adAffectGroup:删除匹配当前过滤条件的所有记录。
? adAffectAll:删除记录集中的全部记录。
? adAffectAllChapters:删除所有段(chapter)中的记录。
最简单的调用形式是:
rsAuthors.Delete
这将删除当前记录。如果有一个过滤条件,并想删除所有匹配该条件的记录,那么仅需加上适当的常数:
rsAuthors.Delete adAffectGroup
4. 自动递增的字段
当添加一条新记录时,一般会碰到这样一个问题:如何处理那些自动递增的或标识字段(Identity Filed)。这些字段是由服务器自动更新的数字字段,一般用于为每一行提供一个唯一的字段值。当数据库含有多个表时,那么这个唯一的字段经常被当作关联表的外键。所以,添加一条新记录时,经常需要找出它们的值。
例如,考虑一下有两个字段的表,一个自动递增的ID字段(SQL Server中的IDENTITY字段或Access中的AutoNumber字段),一个字段名为Name的文本字段。现在考虑一下下面的向表中添加记录的代码:
With rsData
.Open "tblTest", adOpenDynamic, adLockOptimistic, adCmdTableDirect
.AddNew
.Fields("Name") = "Janine"
.Update
intID = .Fields("ID")
End With
看上去很平常,但添加记录后是否能够取到这个值依赖于光标的类型、锁定的类型以及ID字段是否被索引。表8-4列出了哪些组合允许获取新插入的ID字段的值。其他没有列在表中的组合不能返回ID字段的值。
表8-4 获取ID字段的值与光标、锁定的类型及ID字段是否被索引的关系
提供者
对象
索引
光标位置
光标类型
锁定类型
ODBC
Access97
是
服务器
键集
悲观型
乐观型
Access2000
是
服务器
键集
悲观型
乐观型
否
客户
所有
悲观型
乐观型
SQL Server 6.5
是
服务器
键集
悲观型
乐观型
SQL Server 7.0
是
服务器
键集
悲观型
乐观型
客户
所有
悲观型
乐观型
否
客户
所有
悲观型
乐观型
Jet 4.0
Access97
是
服务器
所有
所有
Access 2000
是
服务器
所有
所有
否
客户
所有
悲观型
乐观型
SQL OLE DB
SQL Server 6.5
SQL Server 7.0
是
服务器
键集
悲观型
乐观型
客户
所有
悲观型
乐观型
否
客户
所有
悲观型
乐观型
这清楚地说明必须使用正确的组合,才能保证能取得ID字段的正确值。否则,可能会得到0、空值或NULL,这取决于组合的方式。
在下一章中处理存储过程时,将见到另一种从SQL Server获取IDENTITY字段值的方法。
8.5 管理错误
处理数据存储时,发生错误的可能性总是存在的:安全性问题,试图更新已被其他用户删除的记录,诸如此类的问题很多。不能保证一切都运行良好,因此必须构建某种形式的错误控制。
在第7章中,研究了ASP页面中一般的错误处理,但现在涉及的是数据存储,所以必须考虑使用额外的代码进行错误处理。先看一下Errors集合,再讨论其如何满足ASP 3.0的错误处理机制。