Best practice ADO recordset die leeg is of een error geeft

Status
Niet open voor verdere reacties.

Interface

Gebruiker
Lid geworden
27 jan 2009
Berichten
156
Hi,

Ik ben wat bezig met een ADO recordset. Nu geef ik mijn SQL command door aan een functie die de SQL uitvoert. Het resultaat daarvan is dan dus het resultaat van de functie. Dit gezegd hebbende zijn er 2 dingen die er kunnen gebeuren als er geen resultaat is/of er een fout in de SQL statement zit:
  1. het sql statement is onjuist (bijv. een table naam die niet juist is
  2. het resultaat van de query is niks, er is dus geen match

Hoe kan ik dit het beste opvangen. Ik werk eigenlijk al een tijdje met ADO excel in vba icm SQLserver ik deed dit altijd afvangen in de functie en mijn qeuries die al voor gedefinieerd waren klopten ook eigenlijk altijd wel. Nu wil ik wat meer gelaagdheid inbouwen, zodat ik mijn module gwn kan exporteren. Bedoeling is wel dat ik die beide scenario's goed opvang. Nu kan ik daar omslachtige scenario's voor bouwen maar er moet toch een snelle kort methode zijn om die twee scenario's op te vangen (Lees: ik ben gwn benieuwd hoe de guru's dat hier zouden aanpakken.

De code/functie die ik gebruik voor mn statement is, waar het probleem is dat als ik een recordset tergukrijg die leeg is ik alsnog een error krijg:

Code:
Function funRunSql(ByVal strSQL As String) As Variant

    Dim cn              As Object
    Dim rs              As Object
    
    Set cn = CreateObject("ADODB.Connection")
        cn.Open strConst_DB_SQLSERVER
    Set rs = cn.Execute(strSQL)
   
    On Error GoTo Hell
   
    If rs.RecordCount <> 0 Then
        funRunSql = funTranspose(rs.getrows)
    Else
        MsgBox "No result with this SQL statement!"
        End
    End If
    
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
    
    Exit Function
    
Hell:
    MsgBox "Something wend wrong with the SQL query:" & vbCrLf & vbCrLf & strSQL & vbCrLf & vbCrLf & "All script and procedures will stop from this point."
    End
    
End Function

Function funTranspose(ByRef varSQ As Variant) As Variant
    Dim i As Integer, j As Integer, sq As Variant
    ReDim sq(UBound(varSQ, 2), UBound(varSQ))
    For i = 0 To UBound(varSQ): For j = 0 To UBound(varSQ, 2): sq(j, i) = varSQ(i, j): Next j: Next i
    funTranspose = sq
End Function
 
Code:
Sub M_Sql(ByVal strSQL As String)
  with  CreateObject("ADODB.Connection").Open(strConst_DB_SQLSERVER)
    .Execute strSQL
   
    If .RecordCount > 0 Then activesheet.cells(1).copyfromrecordset .datasource
  End With
End Sub
 
dank je wel!

Ik krijg een error dat er een object vereist is.

Is dit omdat een early binding moet maken(een reference)? Ik maak toch in mijn functie (die ik asl voorbeeld heb) een late binding net als dat u dat doet in uw antwoord?
 
Laatst bewerkt:
Dank voor je reactie.

Ik ben zeer bekend met je site ik kijk er meer dan regelmatig op! Vandaag nog even het stuk over ado doorgenomen.

als antwoord op u vraag:

2019-08-13_1834.png

2019-08-13_1835.png

Ik weet dat mn connectie/providerstring naar mn SQLsever goed is, ik kan namelijk in de eerste functie die ik stuurde namelijk wel resultaat ophalen met het SQL statement/functie.

Ik werk met office365, zou het kunnen dat er iets is veranderd in de interpretatie van ADO en de connectie? Het gaat uiteindelijk om de error handling. Al vond ik u code wel 'lekker' kort. Ik hou van korte code...
 
Laatst bewerkt:
Dit werkt hier:

Code:
Sub M_snb()
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\OF\voorbeeld.xlsb;Extended Properties=""Excel 12.0 Xml"""
        With .Execute("SELECT * FROM `Sheet1$`")
            x0 = .Fields.Count
            sn = .GetRows
            MsgBox "Fields: " & UBound(sn) + 1 & vbLf & "Records :" & UBound(sn, 2) + 1
            If UBound(sn, 2) = 0 And sn(0, 0) = "" Then Exit Sub
        End With
    End With
End Sub
 
Dit werkt wel

Deze procedure werkt dan weer wel als ik de conectionstring aanpas naar mijn database. Enige is wel dat als ik de tabel naam fout heb ik een error krijg, daarbij krijg ik ook een fout (.BOF or .EOF = true) als ik een SQL draai die een resultaat als niks heeft (bijvoorbeeld als ik zoek op id = -1 in de WHERE clause en deze niet gevonden wordt).

Ik heb het nu als volgt aangepakt:

Code:
Function funRunSQL(ByVal strSQL As String) As Variant

    Dim cn              As Object
    Dim rs              As Object
    
    On Error GoTo Hell
    
    Set cn = CreateObject("ADODB.Connection")
        cn.Open strConst_DB_SQLSERVER
    Set rs = cn.Execute(strSQL)
    
    If rs.EOF = False And rs.bof = False Then
        funRunSQL = funTranspose(rs.GetRows)
    Else
        funRunSQL = Empty
    End If

    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
    
    Exit Function
    
Hell:
    MsgBox "Something wend wrong with the SQL query:" & vbCrLf & vbCrLf & strSQL & vbCrLf & vbCrLf & "All script and procedures will stop from this point." & vbCrLf & vbCrLf & "Error Message:" & vbCrLf & vbCrLf & err.Description
    End
    
End Function

vervolgens kan ik dan in mn functies die ik aanroep gebruik maken van de isempty() functie. Niet the best practice but it fits.... Thanks though. Ik zal de vraga op 'opgelost' zetten.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan