我始终觉得编译好的语句速度比较快。
VB可否这样,对于一条语句,里面包含一些固定的参数,
然后向这些固定的参数赋值
然后执行我看了command对象的帮助,只发现一些执行存储过程的例子比如我要插入一个包含很大字段的记录,怎么做?
我知道recordset的addnew可以做到,
但是这个recordset要先open,我总觉得这个open效率不高想听听你的见解?

解决方案 »

  1.   

    对。用存储过程。
    sql可以负责预先编译
      

  2.   

    recordset.open对语句编译并没有影响速度。对速度有影响的是在recordset前应进行的连接(connection),因为这时的记录集已经被调入缓存,对记录集操作不会影响速度。
    不过,由vb向数据库提交sql语句要经过二次编译,调用存储过程是最好、最快的方法.
      

  3.   

    我的目的是addnew,但我却要open一个select *的记录集,
    所以很不爽很同意 Rabbitsy(sz) ,我的程序有一个连接池,可以给需要的
    程序段分配连接。
    在实现的过程中,我有一个疑问,某个函数内有一个connection的变量,
    这个connection已经被close了,但是没有set成nothing,
    这个程序段结束以后,这个变量占用的空间应该被释放了吧?
      

  4.   

    有的,可以用Prepared 属性来编译SQL语句。
          
    功能:
    指示执行前是否保存命令的编译版本。设置和返回值:设置或返回布尔型值。说明:使用 Prepared 属性可使提供者在首次执行 Command 对象前保存 CommandText 属性中指定的已准备好(已编译)的查询版本。该属性会降低命令首次执行的速度,但提供者对命令进行编译后,在后继的命令执行中提供者可使用已编译好命令版本,这样可以提高执行性能。如果该属性为 False,提供者将直接执行 Command 对象而不创建编译版本。如果提供者不支持命令准备,将该属性设置为 True 时也许将返回错误。如果没有返回错误,则只需要忽略准备命令的请求并将 Prepared 属性设置为 False 即可。示例:
    通过打开两个 Command 对象(一个是准备好的,另一个是未准备好的)演示 Prepared 属性。
    Public Sub PreparedX()   Dim cnn1 As ADODB.Connection
       Dim cmd1 As ADODB.Command
       Dim cmd2 As ADODB.Command
       Dim strCnn As String
       Dim strCmd As String
       Dim sngStart As Single
       Dim sngEnd As Single
       Dim sngNotPrepared As Single
       Dim sngPrepared As Single
       Dim intLoop As Integer   ' 打开连接。
       strCnn = "Provider=sqloledb;" & _
          "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
       Set cnn1 = New ADODB.Connection
       cnn1.Open strCnn   ' 为相同命令(一个是准备好的,另一个是未准备好的)创建两个命令对象。
       strCmd = "SELECT title, type FROM titles ORDER BY type"
       
       Set cmd1 = New ADODB.Command
       Set cmd1.ActiveConnection = cnn1
       cmd1.CommandText = strCmd
          
       Set cmd2 = New ADODB.Command
       Set cmd2.ActiveConnection = cnn1
       cmd2.CommandText = strCmd
       cmd2.Prepared = True
       
       ' 设置一个计时器,而后执行未准备好的命令 20 次。
       sngStart = Timer
       For intLoop = 1 To 20
          cmd1.Execute
       Next intLoop
       sngEnd = Timer
       sngNotPrepared = sngEnd - sngStart
       
       ' 重置计时器,而后执行准备好的命令 20 次。
       sngStart = Timer
       For intLoop = 1 To 20
          cmd2.Execute
       Next intLoop
       sngEnd = Timer
       sngPrepared = sngEnd - sngStart   ' 显示执行结果。
       MsgBox "Performance Results:" & vbCr & _
          "   Not Prepared: " & Format(sngNotPrepared, _
          "##0.000") & " seconds" & vbCr & _
          "   Prepared: " & Format(sngPrepared, _
          "##0.000") & " seconds"
          
       cnn1.CloseEnd Sub
      

  5.   

    Prepared 属性是Command对象的。为了养成良好的习贯,最好是人为的将连接对象释放。cn.close
    set cn=nothing