+ -
当前位置:首页 → 问答吧 → 关于ADODB.Connection作为全局的效率问题

关于ADODB.Connection作为全局的效率问题

时间:2011-11-28

来源:互联网

本人用Dim cnnConn As ADODB.Connection 链接数据库 再excel下生产报表。

目前遇到一个问题,因为涉及到多次链接数据库,
所以想把cnnConn做成全局的,因为会很多次的查询,所以经过实际测试链接一个全局的连接确实能省时间。

但目前遇到一个问题。
如果我需要从主表取数据,根据取到的数据作为条件再次查询,这样就会遇到查主表的连接没有关闭后涉及到再次查询。
可以看下面的代码GET_FI_FACEAMOUNT函数查询主表信息, 再没有关闭rstRecordset时候会调用函数BOB_FIMTM再次查询。
此时如果使用全局的cnnConn,会非常的慢。因为这个报表程序会有几百次的查询,累计起来非常的可怕。

不知道大家是如何处理这样的问题呢?
还是这样的情况不适合全局的连接。
谢谢大家??

代码如下
Sub GET_FI_FACEAMOUNT(aggr1, aggr2, aggr3, col, rowindex)

Dim rstRecordset As ADODB.Recordset
Dim cmdCommand As ADODB.Command

Set rstRecordset = New ADODB.Recordset
Set cmdCommand = New ADODB.Command
With cmdCommand
  .ActiveConnection = cnnConn
  .CommandType = adCmdText

 
.CommandText = " sql 语句 "

With rstRecordset
   
  .Open cmdCommand  
 
  While Not rstRecordset.EOF

  If rstRecordset.EOF = False And IsNull(!AMOUNT) = False And !AMOUNT <> 0 Then
   
   
  Range(col & rowindex).Offset(0, 11) = BOB_FIMTM(aggr1, aggr2, aggr3, !contract, "RPT-BOND-VAR")
   
 
  End If
  
   
  rstRecordset.MoveNext
  Wend
   
End With
End With

rstRecordset.Close
Set rstRecordset = Nothing
Set cmdCommand = Nothing

End Function


---------------------------------------------------------------------------------

Function BOB_FIMTM(aggr1, aggr2, aggr3, aggr4, CODE) As Double

Dim rstRecordset As ADODB.Recordset
Dim cmdCommand As ADODB.Command
Dim Concate As String
Dim i

Set rstRecordset = New ADODB.Recordset
Set cmdCommand = New ADODB.Command

With cmdCommand
  .ActiveConnection = cnnConn
  .CommandType = adCmdText
 
.CommandText = " "

Debug.Print .CommandText
With rstRecordset
   
  .Open cmdCommand
   
  If rstRecordset.EOF = False And IsNull(!MTM) = False Then
  BOB_FIMTM = !MTM
  Else
  BOB_FIMTM = 0
  End If
   
End With
End With

rstRecordset.Close
Set rstRecordset = Nothing
Set cmdCommand = Nothing

End Function

作者: fffanpei   发布时间: 2011-11-28

全局ADODB.Connection + 全局ADODB.Recordset

作者: chinaboyzyq   发布时间: 2011-11-28

引用 1 楼 chinaboyzyq 的回复:

全局ADODB.Connection + 全局ADODB.Recordset

+1

Recordset不全局的话, 全局Connection 毫无意义.

至于你说的几百次查询或者其他什么的导致很慢, 我觉得更大的可能是你程序逻辑还有很大优化的余地啊.

作者: WallesCai   发布时间: 2011-11-28

不是很明白啊 全局的recordset 还是会再while中调用新的recordset?

作者: fffanpei   发布时间: 2011-11-28

恩 我试试全局的recordset看看会不会有我不会的地方 
谢谢2位

作者: fffanpei   发布时间: 2011-11-28

对于我说的那个问题 
再使用recordset 没有close的时候
再次调用查询应该怎样写呢 
难道另外新建一个recordset 吗?

作者: fffanpei   发布时间: 2011-11-28

可以认为连接是程序到数据库之间的通道,记录集是通过通道打开的房间,一个通道上允许多个同时打开的房间。

根据不同的需要,可以同时由一个有效的连接打开多个记录集

set rs1=cnn.execute(sql1)
set rs2=cnn.execute(s1l2)
set rs3=new adodb.recordset
rs3.open sql3,cnn

rs1,rs2,rs3可以同时并存,根本不会存在你所说的问题

作者: worldy   发布时间: 2011-11-28

热门下载

更多