Vraag & Antwoord

Programmeren

VB6 ADODB... knop 'Test verbinding'

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][url=http://www.borland.com/delphi]Delphi[/url][/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.[/b]
  • 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

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

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