首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

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

2012-03-02 
关于ADODB.Connection作为全局的效率问题本人用Dim cnnConn As ADODB.Connection 链接数据库 再excel下生

关于ADODB.Connection作为全局的效率问题
本人用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

[解决办法]
全局ADODB.Connection + 全局ADODB.Recordset
[解决办法]

探讨

全局ADODB.Connection + 全局ADODB.Recordset

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

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

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

rs1,rs2,rs3可以同时并存,根本不会存在你所说的问题
[解决办法]
如果使用的是SQL的话:
GET_FI_FACEAMOUNT 这个做成存储过程
BOB_FIMTM 这个可以做成函数

如果数据库用的是 access 的话:
把所有需要的数据一次性的从数据库中提取出来 保存在recordset中
每次都从本地的recordset中进行查询


一句话:尽量减少数据库查询次数
[解决办法]
不要忘了 SQL 中的联接操作 INNER JOIN/FULL JOIN/LEFT JOIN/RIGHT JOIN
既然 aggr1, aggr2, aggr3 是从“主表”中得到的,那么为什么不直接 LEFT JOIN 子表,非要循环查询子表呢?

热点排行