Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

VB6 ADODB... knop 'Test verbinding'

None
20 antwoorden
  • Ik maak een database-prog die werkt via een [i:0685fb022f]ADODB.Connection[/i:0685fb022f].

    In een Beheer-schermpje mag je de parameters aanpassen die nodig zijn in de [i:0685fb022f]ConnectionString[/i:0685fb022f] (server, uid, pwd, enz…)

    Wanneer deze zijn ingevuld, wil ik met een knop [i:0685fb022f]'Test verbinding'[/i:0685fb022f], je raadt het al, de verbinding testen. Dit doe ik door de [i:0685fb022f]ConnectionString[/i:0685fb022f] samen te stellen en de verbinding een keer te openen weer te sluiten.

    Echter… de test lukt elke keer (na herstart van prog) meestal maar 1 of 2 keer, daarna helemaal niet meer (de instellingen natuurlijk onveranderd en correct).

    [b:0685fb022f]VRAAG[/b:0685fb022f]: Is dit uberhaupt de manier om te testen, zo ja, wat is er aan de hand of wat doe ik eventueel fout?

    Alvast bedankt voor de moeite, groetjes Rob
  • Hangt ervan af welke driver je gebruikt, ik meestal Microsoft JET 4.0 OLE DB Provider, maar ik programmeer in [b:2e39544ff5]Delphi[/b:2e39544ff5].

    Verbinding testen is volgens mij alleen maar ff de ConnectionString invoeren en kijken of er verbinding gemaakt kan worden. Als je programma het verder gewoon doet moet je niet letten op dat Verbinding testen.
  • Ja, inderdaad, die driver gebruik ik.
    Maar het gaat hier om een connectionstring die de eindgebruiker/beheerder zelf kan samenstellen, bijv. in een ander filiaal of zelfs een ander bedrijf, dus een andere situatie.

    Om te kunnen zien of alles juist is ingevuld, moet je dus de verbinding kunnen testen. Ik wil dan het liefst als de verbinding 2 keer wel lukt, dat dit de 3e keer ook het geval is, met dezelde instellingen. Dus op dit moment zit ik met een zeer onbetrouwbare TEST-knop.

    Nog suggesties hierop? Bedankt, Rob
  • Oh, ik begrijp het! Nee, dit is wel erg vreemd dat het niet werkt… Dus je wilt het standaard venster gebruiken hiervoor? Hmm heel vreemd. Ik zou niet weten hoe dit komt.
  • Nee, sorry, Ik heb zelf een beheerschermpje gemaakt waarin je (een systeembeheerder of gebruiker) alle items van een connectionstring kunt invullen en daarna testen.

    Dus een textbox voor de servernaam, een textbox voor de databasenaam, eentje voor UID, en eentje voor PWD.

    De driver-naam wordt bepaald aan de hand van een combobox waarin je kunt kiezen tussen een Acces- of een SQL-database.

    Wanneer op 'Test verbinding' (zelf gemaakte knop dus) wordt geklikt, stel ik de connectionstring samen aan de hand van zojuist ingevoerde gegevens en probeer ik deze verbinding te openen. Alleen 'slaagt' deze verbinding 2 keer wel en de derde keer gewoon niet. (ik wil dus meerdere keren achterelkaar op de testknop kunnen klikken, met hetzelfde resultaat.

    ROB
  • Dat is heel vreemd.

    Misschien verouderde versie van ADO?
    Geeft de ADOConnection ook een foutmelding terug?

    Het is waarschijnlijk een bug in ADO als je zeker weet dat je alles goed doet.

    Johan
  • Ik gebruik dezelfde als jij in ditr geval, Microsoft JET 4.0 OLE DB Provider.

    De enige foutmelding die ik krijg (en onzichtbaar afvang) is wanneer de status (dbTemp.State) niet kan worden verkregen op sommige momenten, bijv Na het .Open commando zeg ik:

    Do Until dbTemp.State <> adStateConnecting
    Loop

    Op bepaalde momenten is de status blijkbaar niet te lezen, maar dat vang ik gewoon af en vormt verder geen probleem.

    Ik werkt overigens wel met database op een server. Zou het kunnen dat na 2 keer testen, de server nog ergens mee bezig is ofzo?

    ROB
  • Ja, het zou best aan de server kunnen liggen.

    Probeer het eens lokaal, dus gewoon op je eigen computer. De fout zit, denk ik, in de verbinding met de server of op de server, als je zelfs de status al niet kan opvragen!

    Als het lokaal werkt en niet op de server, weet je waar het aan ligt.
  • Zal ik proberen morgen.

    Ik kan meestal wel de status opvragen, maar tijdens bovengenoemde 'loop' zijn er momenten dat het even niet kan, maar dat vang ik af.

    Het is trouwens alleen wanneer ik een SQL-server connectie probeer te openen. (provider=OLEDB, server=192.168.0.1 o.a. in connectionstring).

    Bij een Acces-database (provider=Microsoft.OLEDB.Jet.4.0, Database=F:\Database\database.mdb) kan ik oneindig op mijn Testknop drukken met altijd hetzelfde resultaat. Dit werkt dus zoals ik het wil.

    ROB
  • Maar die momenten dat het even niet kan (van die status) is vreemd, het moet altijd kunnen!

    Ik ben geen expert op dit gebied; kan je niet die Access database op een server zetten? :-? of een Microsoft SQL Server met Access of kan dat niet?

    Ik denk dat als je het vandaag lokaal geprobeerd hebt dat het dan moet lukken.
  • Voeg in je VB 6 project de volgende references toe:
    Microsoft ActiveX Data Objects 2.6 library
    Microsoft ADO Ext. 2.7 for DLL and security

    '**************************************************
    'Plaats deze code in een module
    '**************************************************
    Option Explicit

    'declaration
    Public AdoConnection As ADODB.Connection
    Public sAccessConnect As String

    Public Function fADOConnect(ByVal sDbPath As String, _
    ByVal sDatabase As String, _
    Optional ByVal sUser As String, _
    Optional ByVal sPass As String) As String

    '———————————————————-
    ' Open a MS Acess connection using ADO
    '
    '———————————————————-
    Dim lRet As Long

    On Error GoTo errH

    If sUser = "" Then
    sUser = "admin"
    End If
    sAccessConnect = "DRIVER={Microsoft Access Driver (*.mdb)};" & _
    "DBQ=" & sDatabase & ";" & _
    "DefaultDir=" & sDbPath & ";" & _
    "UID=" & sUser & ";PWD=" & sPass & ";"

    ' Create Connection Object and open it on installspy.mdb
    Set AdoConnection = New ADODB.Connection
    AdoConnection.ConnectionString = sAccessConnect
    AdoConnection.open sAccessConnect

    fADOConnect = AdoConnection

    Exit Function

    errH:
    fADOConnect = ""
    End Function

    Public Function fDisconnectFromMDB() As Long
    '————————————————-
    ' Disconnect from MDB database
    '
    '————————————————-
    Dim lRet As Long

    fDisconnectFromMDB = 0

    On Error GoTo errH
    If Not AdoConnection Is Nothing Then
    If AdoConnection.State <> 0 Then
    AdoConnection.Close
    End If
    End If
    Set AdoConnection = Nothing
    Exit Function
    '—————————————–
    errH:
    lRet = MsgBox("The following Error has occurred:" & vbCrLf & vbCrLf & vbCrLf & Err.Description & vbCrLf & vbCrLf & "On Disconnect form MDB", vbOKOnly)
    Select Case lRet
    Case vbOK
    Resume Next
    'End
    End Select
    fDisconnectFromMDB = 9
    End Function
    Public Function UnQualifyPath(ByVal sFolder As String) As String
    '———————————–
    ' Trim and remove any trailing slash
    '———————————–
    sFolder = Trim$(sFolder)

    If Right(sFolder, 1) = "" Then
    UnQualifyPath = Left(sFolder, Len(sFolder) - 1)
    Else
    UnQualifyPath = sFolder
    End If

    End Function

    Public Function QualifyPath(ByVal sFolder As String) As String
    '———————————–
    ' Trim path and add a trailing slash
    '———————————–
    sFolder = Trim(sFolder)

    If Right$(sFolder, 1) <> "" Then
    QualifyPath = sFolder & ""
    Else
    QualifyPath = sFolder
    End If
    End Function

    '**************************************************
    ' En onderstaande code in een form met een commandbutton
    '**************************************************
    Option Explicit
    'Declaration
    Private dbConnectionString As String
    Private DataBasePath As String
    Private Database As String
    Private sUser As String
    Private passw As String
    Private lRet As Long

    Private Sub Command1_Click()
    DataBasePath = "C:\temp"
    Database = "Northwind.mdb"
    sUser = ""
    passw = ""

    Select Case LCase(Command1.Caption)
    Case "connect"
    'Connect to the database
    dbConnectionString = fADOConnect(DataBasePath, Database)
    'Check connection state
    If AdoConnection.State <> 0 Then
    MsgBox "Connected to " & QualifyPath(DataBasePath) & Database
    Command1.Caption = "Disconnect"
    Else
    MsgBox "Could not create a connection to " & QualifyPath(DataBasePath) & Database
    End If
    Case "disconnect"
    lRet = fDisconnectFromMDB
    If lRet = 0 Then
    MsgBox "Disonnected from " & QualifyPath(DataBasePath) & Database
    Command1.Caption = "Connect"
    Else
    MsgBox "Could not disconnect from " & QualifyPath(DataBasePath) & Database
    End If
    End Select

    End Sub

    Private Sub Form_Load()
    Command1.Caption = "Connect"

    End Sub
  • Mooi stukje code, dit gaat goed, alleen wil ik ook dat het naar een SQL-Server database kan.

    Ik kan hem 1 of 2 keer goed testen, daarna mislukt de test (net alsof de instellingen fout zouden zijn). Dit is natuurlijk niet het geval, want anders lukt het helemaal niet.

    Kan je hier ook iets mee? ik wacht af, bedankt !


    Rob
  • Jemug… Snap je dat allemaal?
  • hehehe, nee, als ik het zo terug lees ziet het er inderdaad niet uit.
    Maar kopieer deze code maar eens naar een project in vb, dan leest het al wat makkelijker. Als je er dan met F8 doorheen loopt moet je het toch een beetje kunnen volgen.
  • Maar ff voor alle duidelijkheid, geeft dit stukje code bij jou hetzelfde probleem, dus na een aantal keren aanroepen toch vast?

    En voor een SQL server… mmmmmm moet ook kunnen, zal er eens naar kijken.
  • ok, probeer dit maar eens

    Onderstaande weer in een module:

    Option Explicit
    Public ADOconnection As New ADODB.Connection

    Public Function ConnectToSQL(ByVal sServer As String, ByVal sDataBase As String, _
    Optional ByVal sUser As String, Optional ByVal sPass As String, _
    Optional ByRef Conxx As ADODB.Connection) As Long

    '——————————————————
    ' Connect to an existing SQL server
    '——————————————————

    Dim lRet As Long

    On Error GoTo errH
    DoEvents

    'Check if all connections are closed
    If Not Conxx Is Nothing Then
    On Error Resume Next
    If Not Conxx Is Nothing Then Call DisconnectFromSQL(Conxx)
    On Error GoTo errH

    Screen.MousePointer = vbDefault

    ' Specify the OLE DB provider.
    Conxx.Provider = "sqloledb"

    ' Set SQLOLEDB connection properties.
    Conxx.Properties("Data Source").Value = sServer
    Conxx.Properties("Initial Catalog").Value = sDataBase
    If sUser = "" Then
    Conxx.Properties("Integrated Security").Value = "SSPI"
    Else
    Conxx.Properties("User ID").Value = sUser
    Conxx.Properties("Password").Value = sPass
    End If
    Conxx.Open
    Else
    On Error Resume Next
    If ADOconnection <> "" Then DisconnectFromSQL
    On Error GoTo errH

    Screen.MousePointer = vbDefault

    ' Specify the OLE DB provider.
    ADOconnection.Provider = "sqloledb"

    ' Set SQLOLEDB connection properties.
    ADOconnection.Properties("Data Source").Value = sServer
    ADOconnection.Properties("Initial Catalog").Value = sDataBase
    If sUser = "" Then
    ADOconnection.Properties("Integrated Security").Value = "SSPI"
    Else
    ADOconnection.Properties("User ID").Value = sUser
    ADOconnection.Properties("Password").Value = sPass
    End If
    ADOconnection.Open
    End If
    Exit Function

    errH:
    lRet = MsgBox("The following Error has occurred:" & vbCrLf & vbCrLf & vbCrLf & Err.Description & vbCrLf & vbCrLf & "SQL Server : " & sServer & vbCrLf & "Databasename : " & sDataBase, vbOKOnly)
    Select Case lRet
    Case vbOK

    End Select
    ConnectToSQL = 9
    End Function


    Public Function DisconnectFromSQL(Optional ByRef Cnxx As ADODB.Connection) As Long
    Dim lRet As Long

    On Error GoTo errH
    If Cnxx Is Nothing Then
    If ADOconnection <> "" Then
    ADOconnection.Close
    End If
    Else
    Cnxx.Close
    End If
    Exit Function

    errH:
    lRet = MsgBox("The following Error has occurred:" & vbCrLf & vbCrLf & vbCrLf & Err.Description & vbCrLf & vbCrLf & "On Disconnect form SQL", vbOKOnly)
    Select Case lRet
    Case vbOK

    End Select
    DisconnectFromSQL = 9
    End Function
  • Gebruik ook hier dezelfde references in je project en roep alsvolgt aan:

    lRet = ConnectToSQL(sServerName, sDataBase)
  • O Voordat ik dit probeer. Nu ik nog een keer naar de references kijk in je vorige bericht, zie ik dat ik alleen oudere versies heb staan (2.5 library en 2.5 for DLL). zitten de nieuwe versies soms in ServicePack 5, want die heb ik nog niet geinstalleerd (wel gedownload). Ik wacht meestal even af bij nieuwe servicepacks (wat de kinderziektes zijn).

    Ik ga nu jouw code proberen met de referentie-versies die ik heb.

    Bedankt!

    Rob
  • Ben ik weer!
    Connectie openen gaat prima, maar echter,
    de tweede keer als ik het probeer, lukt het niet meer.

    Ik open de verbinding en bij succes sluit ik hem meteen weer.
    De tweede keer lukt niet meer, ook niet als ik een tijd wacht tussen de eerste en tweede keer.

    Misschien toch de referentie-versies?

    Ik wacht even je antwoord af op mijn vorige berichtje.


    ROB
  • Yep, servicepack 5 gewoon installeren. Maar vwb de lock….. hmm.
    Zal er eens verder induiken.

    Tot later

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.