使用 SQL 指令来新增或更新数据库中的资料是非常方便也是大部分开发者所爱用的方法, 不过当你要进行多笔不同的更新时, SQL 的方法看几来就不是很完美, 今天的文章将介绍另一个选择, 使用 Recordset 方法来新增或更新资料
建立 Recordset
建立 Recordset 你可以使用以下的方法, 在这篇文章中我们将重点放再第三种方法
由查询 (Query) 建立 Recordset 对象
Set oConn = Server.CreateObject("Adodb.Connection")
oConn.Open "你的资料来源名称 DSN"
Set oRs = oConn.Execute("Select * From SomeTable")
藉由使用 Connection 对象的 Execute 方法, Recordset 对象将会被自动建立, 这个方法也就是前面所说的 SQL 指令的方法
由资料表 (Table) 建立 Recordset 对象
Set oConn = Server.CreateObject("Adodb.Connection")
oConn.Open "你的资料来源名称 DSN"
Set oRs = oConn.Execute("SomeTable")
另一种使用 Execute 的方法, 只是把 SQL 指令改为资料表名称, 和第一种方法不同的是他只传回这个资料表的资料而不具备更新资料的能力
直接建立 Recordset 对象
Set oRs = Server.CreateObject("Adodb.Recordset")
oRs.Open Source, ActiveConnection, CursorType, LockType, Options
新增资料
有说有作才是真功夫, 来作实作的例子, 这一次我们将使用北风数据库里的 Categories 资料表, 因为这个资料表最简单, 这个资料表记载产品的类别, 剧情如下, 我们想要新增一笔类别, 你可以这么做
<%
Const adOpenKeyset = 1, adLockPessimistic = 2 'ADO 常数的宣告
sConnString = "Provider=SQLOLEDB;" _ '在这个例子我们使用 OLEDB Provider
& "Data Source=你的SQL服务器名称;" _
& "Initial Catalog=Northwind;" _
& "User Id=sa;" _
& "Password="
Set oRs = Server.CreateObject("Adodb.Recordset")
oRs.Open "Categories", sConnString, adOpenKeyset, adLockPessimitic
oRs.AddNew '使用 Recordset 的 AddNew 方法来新增资料
oRs("CategoryName") = "测试类别"
oRs("Description") = "这是测试类别说明"
oRs.Update '储存变更
oRs.Close
Set oRs = Nothing
%>
更新资料
现在来看看 Recordset 如何更新资料, 很趣味的是和前面新增的方法比较起来更加简单, 只要把 oRs.AddNew 这一行去掉即可, 哪么是哪一笔资料会被更新呢? 这里我们假设你对 Recordset 浏览的五种方法 (Move, MoveNext,...) 有一定的认识, 按内你大概猜到答案了, 也就是 Cursor 所在的资料会被更新! 来看个例子, 好比说我们想将
<%
Const adOpenKeyset = 1, ...
...... 省略 ......
Set oRs = Server.CreateObject("Adodb.Recordset")
oRs.Open "Categories", sConnString, adOpenKeyset, adLockPessimitic
oRs("CategoryName") = "更新类别"
oRs("Description") = "这是更新类别说明"
oRs.Update
oRs.Close
Set oRs = Nothing
%>
执行的结果你会发现第一笔资料被更新了!
在 Recordset 的新增或更新资料又可以分为两种模式, 立即模式 (Immediate Mode) 和批次模式 (Batch Mode), 在立即模式中每次当你呼叫 Update 数据库会立即作变更, 在前一个例子中的 Recordset 开启, 我们指定了 LockType 属性为 adLockPessimistic , 这代表当你在进行资料更新的时候, Data Provider 会将这些资料锁定以防止同时有其它的使用者更改相同的资料, 这就是立即模式的更新!
相对于立即模式, 当你呼叫 Update 时批次模式下会先将变更存在 ADO 的快取 (Cache), 直到你呼叫 UpdateBatch 方法被呼叫, 数据库才会一次进行所有的变更, 要使用批次模式你必须指定 LockType 属性为 adLockBatchOptimistic , 例如
<%
Const adOpenKeyset = 1, adLockBatchOptimistic = 4
...... 省略 ......
Set oRs = Server.CreateObject("Adodb.Recordset")
oRs.Open "Categories", sConnString, adOpenKeyset, _
adLockBatchOptimistic
......
多笔变更
......
oRs.UpdateBatch
oRs.Close
Set oRs = Nothing
%>
用惯了 SQL 指令的方法, 你可能还不太习惯 Recordset 的做法, 其实方法的选择是依情况而定的, 一般简单的情况用 SQL 的方法是较方便的, 但较进阶的更新例如多个值的更新, 就一定要用 Recordset 的做法! 在以后的文章我们还会再多介绍一些例子!