Helpmij.nl
Helpmij.nl
Helpmij.nl
Steun Helpmij.nl! Klik hier     Computerprobleem? Klik hier!

Quote

Weergeven resultaten 1 tot 7 van 7

Onderwerp: Best practice ADO recordset die leeg is of een error geeft

  1. #1
    Senior Member
    Geregistreerd
    27 januari 2009
    Vraag is niet opgelost

    Best practice ADO recordset die leeg is of een error geeft

    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

  2. #2
    Giga Honourable Senior Member
    Verenigingslid

    Geregistreerd
    12 juni 2008
    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
    VBA voor smarties
    VBA is een taal die je moet leren met een grammatica- en een woordenboek.

    http://www.helpmij.nl/forum/announcement.php?f=5
    Plaats svp geen bestanden op andere sites; nadat het bestand daar verwijderd is wordt een forumdraad onbegrijpelijk voor anderen.

  3. #3
    Senior Member
    Geregistreerd
    27 januari 2009

    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 aangepast door Interface : 13 augustus 2019 om 16:34

  4. #4
    Giga Honourable Senior Member
    Verenigingslid

    Geregistreerd
    12 juni 2008
    IN welke regel ?

    Ik werk zelf met de ADODB.recordset, zie http://www.snb-vba.eu/VBA_ADODB_recordset.html
    Laatst aangepast door snb : 13 augustus 2019 om 17:24
    VBA voor smarties
    VBA is een taal die je moet leren met een grammatica- en een woordenboek.

    http://www.helpmij.nl/forum/announcement.php?f=5
    Plaats svp geen bestanden op andere sites; nadat het bestand daar verwijderd is wordt een forumdraad onbegrijpelijk voor anderen.

  5. #5
    Senior Member
    Geregistreerd
    27 januari 2009
    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:

    Klik op afbeelding voor grotere versie

Naam:  2019-08-13_1834.png
Bekeken: 8
Grootte:  36,4 KB

    Klik op afbeelding voor grotere versie

Naam:  2019-08-13_1835.png
Bekeken: 7
Grootte:  27,0 KB

    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 aangepast door Interface : 13 augustus 2019 om 17:41

  6. #6
    Giga Honourable Senior Member
    Verenigingslid

    Geregistreerd
    12 juni 2008
    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
    VBA voor smarties
    VBA is een taal die je moet leren met een grammatica- en een woordenboek.

    http://www.helpmij.nl/forum/announcement.php?f=5
    Plaats svp geen bestanden op andere sites; nadat het bestand daar verwijderd is wordt een forumdraad onbegrijpelijk voor anderen.

  7. #7
    Senior Member
    Geregistreerd
    27 januari 2009

    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.

Berichtenregels

  • U mag geen nieuwe vragen starten.
  • U mag niet reageren op berichten.
  • U mag geen bijlagen versturen.
  • U mag uw berichten niet bewerken.
  •  
Helpmij.nl
Helpmij.nl

Helpmij.nl en business

Partners
Sponsoren