关于ADODB.Connection作为全局的效率有关问题
关于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
------解决方案--------------------
------解决方案--------------------
可以认为连接是程序到数据库之间的通道,记录集是通过通道打开的房间,一个通道上允许多个同时打开的房间。
根据不同的需要,可以同时由一个有效的连接打开多个记录集
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 子表,非要循环查询子表呢?
本人用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
------解决方案--------------------
------解决方案--------------------
可以认为连接是程序到数据库之间的通道,记录集是通过通道打开的房间,一个通道上允许多个同时打开的房间。
根据不同的需要,可以同时由一个有效的连接打开多个记录集
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 子表,非要循环查询子表呢?