Am avut de facut o aplicatie care sa tipareasca automat niste rezultate care provin de la o niste rinduri de Excel, trecute printr-o functie dintr=o BD SQL Server.
Normal ca am facut o functie in VBA care sa faca asta:
Public Function valoarescan(val)
If (Len(val) = 0) Then Exit Function
Dim t As Range
Set t = val
Dim rs As ADODB.Recordset
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionString = “Driver={SQL Server};Server=(local);Database=….;Trusted_Connection=Yes;”
cn.Open
Set rs = cn.Execute(“SELECT [user].[functie] (‘” & t.Text & “‘)”)
valoarescan = rs(0).Value
cn.Close
‘MsgBox Len(valoarescan)
End Function
Ceea ce am observat este ca dura mult prea mult(2 minute) pentru 31 de rinduri, asa incit ceea ce am facut este sa nu mai respect BestPractices pentru o conexiune, ci sa folosesc aceeasi conexiune
Dim cn As ADODB.Connection
Public Function valoarescan(val)
If (Len(val) = 0) Then Exit Function
Dim t As Range
Set t = val
Dim rs As ADODB.Recordset
Dim cn As ADODB.Connection
If (cn Is Nothing) Then
cn.ConnectionString = “Driver={SQL Server};Server=(local);Database=….;Trusted_Connection=Yes;”
cn.Open
End If
Set rs = cn.Execute(“SELECT [user].[functie] (‘” & t.Text & “‘)”)
valoarescan = rs(0).Value
‘MsgBox Len(valoarescan)
End Function
Rezultat: merge in aprox 2 secunde !
Drawback: Conexiunea nu se inchide… – pentru ca nu stiu care e ultima oara cind se apeleaza…
As putea sa fac o clasa care sa refoloseasca conexiunea – si pe Terminate sa o distruga… dar am fost bucuros ca mi-a dat…
Concluzia : Citeodata e bine sa nu respecti bestpractices!