CONN.execute rs.open Command.execute之间的差别

形成记录集的方法有三种
CONN.execute rs.open Command.execute
方法用法大大不通
通常 Set rs=CONN.execute(SQL)
或直接 rs=CONN.execute(SQL)
和 Set rs=Server.CreateObject("ADODB.Recordset"
rs.open SQL,CONN,0,1 或 rs.open SQL,CONN
这种情况 通常open比上一个性能要好那么一丁点
( command对象更灵活,执行范围更广)
使用 CONN.execute 可以不用关闭直接执行下一个 set rs=conn.execute(SQL)
但性能速度会大打折扣!!
大约要慢 2~5倍!!(这是我在msSQL循环1000次亲自测试过的,不信你马上自己测试),所以执行下一个 rs=conn.execute之前!!一定要关闭掉!是个好习惯!
使用单一对象的rs rs.open在open下一个记录集之前,必需要求显示关闭,否则出错,速度在SQL,CONN,0,1的情况下可前者基本一样
所以我喜欢使用直设置一个 CreateObject("adodb.recordser"(在不需要多个记录集交错操作的情况下,多个也不碍是!)
然后从头用到尾!!!
开门关门开门关门~~~~~咵踏咵踏~~~~
最后一个 set rs=nothing 化上句号,爽!
更主要是 open提供非常灵活的操作数据库元数据的非常多的属性!!
打开百宝箱,金光灿灿什么都看见!
有很多情况下是非得用open来做的!
而conn.execute 想黑布下换胶卷~~~偷偷摸摸~~非常单一!!!
比如:
rs1.open SQL1,conn,0,1
rs.open SQL,conn,1,3
if rs(0)<0

关于Rs.Fields与conn.Execute的效率

内容:

ASP中,一般更新或修改数据库无非是用下面两种方法:
方法1:
conn.Execute "Update ...."
conn.Execute "Insert into ...."
方法2:
Set Rs.Open "select ...",conn,1,2
[Rs.AddNew]
Rs.Fields("...")= xx
Rs.Update
现在的问题是,这两种方法,那一种效率更高?
我个人是习惯用conn.Execute的,因为它操作比效方便,少了好几个步骤。
但无奈本人是个效率主义者,想清楚这两者的效率区别。
或者说这两种方法,在不同的操作上,各自的优缺点。
 
关于conn.execute 的介绍及用法
Public Sub ExecuteX()

   Dim strSQLChange As String
   Dim strSQLRestore As String
   Dim strCnn As String
   Dim cnn1 As ADODB.Connection
   Dim cmdChange As ADODB.Command
   Dim rstTitles As ADODB.Recordset
   Dim errLoop As ADODB.Error

   \' 定义两个 SQL 语句作为命令文本执行。
   strSQLChange = "UPDATE Titles SET Type = " & _
      "\'self_help\' WHERE Type = \'psychology\'"
   strSQLRestore = "UPDATE Titles SET Type = " & _
      "\'psychology\' WHERE Type = \'self_help\'"

   \' 打开连接。
      strCnn = "Provider=sqloledb;" & _
      "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
   Set cnn1 = New ADODB.Connection
   cnn1.Open strCnn

   \' 创建命令对象。
   Set cmdChange = New ADODB.Command
   Set cmdChange.ActiveConnection = cnn1
   cmdChange.CommandText = strSQLChange
  
   \' 打开标题表。
   Set rstTitles = New ADODB.Recordset
   rstTitles.Open "titles", cnn1, , , adCmdTable

   \' 打印原始数据报告。
   Debug.Print _
      "Data in Titles table before executing the query"
   PrintOutput rstTitles

   \' 清除 Errors 集合的外部错误。
   cnn1.Errors.Clear

   \' 调用 ExecuteCommand 子例程执行 cmdChange 命令。
   ExecuteCommand cmdChange, rstTitles
  
   \' 打印新数据报告。
   Debug.Print _
      "Data in Titles table after executing the query"
   PrintOutput rstTitles

   \' 使用 Connection 对象的 execute 方法执行 SQL 语句以恢复数据。
   \' 捕获错误,必要时检查 Errors 集合。
   On Error GoTo Err_Execute
   cnn1.Execute strSQLRestore, , adExecuteNoRecords
   On Error GoTo 0

   \' 通过再查询记录集检索当前数据。
   rstTitles.Requery

   \' 打印已恢复数据的报告。
   Debug.Print "Data after executing the query " & _
      "to restore the original information"
   PrintOutput rstTitles

   rstTitles.Close
   cnn1.Close
  
   Exit Sub
  
Err_Execute:

   \' 将任何由执行查询引起的错误通知用户。
   If Errors.Count > 0 Then
      For Each errLoop In Errors
         MsgBox "Error number: " & errLoop.Number & vbCr & _
            errLoop.Description
      Next errLoop
   End If
  
   Resume Next

End Sub

Public Sub ExecuteCommand(cmdTemp As ADODB.Command, _
   rstTemp As ADODB.Recordset)

   Dim errLoop As Error
  
   \' 运行指定的 Command 对象。捕获错误,必要时检查 Errors 集合。
   On Error GoTo Err_Execute
   cmdTemp.Execute
   On Error GoTo 0

   \' 通过再查询记录集检索当前数据。
   rstTemp.Requery
  
   Exit Sub

Err_Execute:

   \' 将任何由执行查询引起的错误通知用户。
   If Errors.Count > 0 Then
      For Each errLoop In Errors
         MsgBox "Error number: " & errLoop.Number & vbCr & _
            errLoop.Description
      Next errLoop
   End If
  
   Resume Next

End Sub

Public Sub PrintOutput(rstTemp As ADODB.Recordset)

   \' 枚举 Recordset。
   Do While Not rstTemp.EOF
      Debug.Print "  " & rstTemp!Title & _
         ", " & rstTemp!Type
      rstTemp.MoveNext
   Loop

End Sub
就是这样用的。在你需要的过程中调用这个过程。