Re: Verbindungsversuch zu einer Datenbank

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance

From: Peter Götz (gssg_nospam_at_t-online.de)
Date: 04/02/04

  • Next message: Werner Pfundstein: "Re: doppelten zugriff auf mdb"
    Date: Fri, 2 Apr 2004 16:47:45 +0200
    
    

    Hallo Fred,

        vergiss dieses überflüssige DataEnvironment und erstelle Deine
    ADO-Objekte Connection, Command u. Recordset per konkretem Code. Das
    Dataenvironment macht auch nichts anderes, hindert Dich aber daran zu sehen
    und zu verstehen, was diese Objekte eigentlich tun.

    Die Verbindung zu Deiner DB stellst Du so her:

        Option Explicit
        Private WithEvents mCnn as ADODB.Connection

        Private Sub CnnOpen(DBFileName as string, DBPwd ad String)
            Set mCnn = New ADODB.Connection

            ' *** Connection öffnen
            With mCnn
                .Provider = "Microsoft.Jet.OLEDB.4.0"
                .Properties("Data Source").Value = DBFileName

                If Len(DBPwd) Then
                    .Properties("Jet OLEDB:Database Password").Value = DBPwd
                End If

                .CursorLocation = adUseClient
                .Mode = adModeShareDenyNone

                .Open
            End With
        End Sub

    Jetzt kannst Du an die Sub CnnOpen jeden beliebigen Pfadnamen und ein
    Datenbankkennwort für Deine *.mdb übergeben.

    > ich habe ein Problem mit einer Datenbankanbindung.
    > Folgender Code ist aus einem Beispiel, welches im
    > Buch "Visual Basic 6" von M. Kofler abgebildet ist.
    >
    > Public Sub Form_Load()
    >
    > Dim oText1 As TextBox
    > Dim oText2 As TextBox
    >
    > On Error GoTo OpenErr
    >
    > ' Verbindung zur Datenbank öffnen
    > Set adoPrimaryRS1 = DataEnvironment1.rsCommand1
    > adoPrimaryRS1.Open
    > CursorType:=adOpenStatic, LockType:=adLockOptimistic

    Ein Recordset öffnet man so:

        Option Explicit
        Private WithEvents mRS As ADODB.Recordset

        Private Sub OpenRS(SQL as String)
            Set mRS = New ADODB.Recordset

            ' *** Recordset öffnen
            With mRS
                Set .ActiveConnection = mCnn
                .Source = SQL
                .CursorLocation = adUseClient
                .CursorType = adOpenStatic
                .LockType = adLockOptimistic

                .Open
            End With
        End Sub

    >
    > Set adoPrimaryRS2 = DataEnvironment1.rsCommand2
    > adoPrimaryRS2.Open
    > CursorType:=adOpenStatic, LockType:=adLockOptimistic
    >
    > If adoPrimaryRS1.State = 1 Then connectionOK = True

    Das ist eigentlich unsinnig.
    Recordset.State sagt nicht aus ob die Connection in Ordnung ist.
    Man kann ein Recordset öffnen, es dann per

        Set RS.ActiveConnection = Nothing

    vom Connectionobjekt trennen und dann die Connection schliessen

        Cnn.Close

    RS.State hat jetzt immer noch den Wert adStateOpen (1), obwohl die
    Connection keineswegs mehr geöffnet ist.

    So überprüfst Du, ob Dein Recordset existier, geöffnet ist und auf einem
    gültigen Datensatz steht:

        Select case True
            case mRS is Nothing
            case (mRS.State and adStateOpen) = adStateOpen
            case mRS.BOF or mRS.EOF
            case else
                ' Juchhuuuu... das Recordset existiert, _
                  ist geöffnet und _
                  steht auf einem gültigen Datensatz
        End Select

    >
    > ' Textfelder an Datenprovider binden
    > For Each oText1 In Me.txtFields1
    > Set oText1.DataSource = adoPrimaryRS1
    > Next
    > For Each oText2 In Me.txtFields2
    > Set oText2.DataSource = adoPrimaryRS2
    > Next

    Wenn Du ein vernünftig und vor allem stabil laufendes Datenbankprogramm
    haben willst, dann verzichte auf gebundene Controls. Damit verlierst
    weitgehend die Kontrolle über die Abläufe bei Deinen ADO-Objekten und gerade
    bei einem Mehrbenutzerbetrieb wird eine vernünftige Fehler- und
    Konfliktbehandlung nahezu unmöglich.

    >
    > Exit Sub
    >
    > OpenErr:
    > MsgBox Err.Description

    Um bei DB-Fehlern die eigentlich Fehlerursache zu erkennen musst Du in den
    meisten Fällen nicht nur das VB-Err-Objekt sondern die
    ADODB.Connection.Errors-Auflistung untersuchen. Erst darin findest Du meist
    die wirklichen, detaillierten Fehlerinformationen.

    >
    > End Sub
    >
    > "DataEnvironment1.rsCommand1" und "-2" ist die Verbindung
    > zu einer bestehenden .mdb-Datenbank.

    Ein Command ist keine Verbindung zu einer DB.
    Die Verbindung zur DB wird über das Connection-Objekt hergestellt.
    Ein Commandobjekt führt Befehle über die vom Connection-Objekt hergestellte
    Verbindung aus.

    > Der Code funktioniert einwandfrei, solange ich die
    > Datenbankdatei an der voreingestellten Stelle belasse.

    Genau das ist das Problem mit diesen Gimmicks DataEnvironment und ADODC.
    Du kopierst irgendwelchen vorgestanzten Code ab, der so lala funktioniert.
    Aber warum er funktioniert und warum in einem anderen Fall eben nicht, wirst
    Du mit einem DataEnvironment vermutlich nie verstehen.

    > Wenn ich diese Datei vor dem Start meines Programms
    > verlagere (Ich möchte damit simulieren, dass z.B. keine
    > Verbindung aufgebaut werden kann, Netzwerk down o.ä.),
    > kommt eine Abfrage mit dem Titel "Geben Sie bitte MS JET
    > OLE-DB-Initialisierungsinformationen ein". Dieses Fenster
    > stört mich, da ich dem Bediener eigentlich mit einer
    > selbstprojektierten MsgBox den fehlgeschlagenen
    > Verbindungsversuch mitteilen will. Weiß jemand, wie ich
    > das Initialisierungsfenster unterdrücken kann ?

    1) Kein DataEnvironment benutzen
    2) Kein DataControl (ADODC) benutzen
    3) Connection-, Recordset- u. Command-Objekte per konkretem Code erzeugen

    Unter

        www.gssg.de -> VB-Tips -> Datenbank -> "ADO DemoMU 2002"

    findest Du ein Programm welches für den Mehrbenutzerbetrieb auf eine *.mdb
    konzipiert ist.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tips u. Beispielprogrammen)


  • Next message: Werner Pfundstein: "Re: doppelten zugriff auf mdb"

    Relevant Pages

    • Re: Try Catch Finally
      ... habe aus 3 Tabellen beim Programmstart drei Listboxen zu füllen. ... connection oder 3 kurze? ... Für den SQL Server ist das wie eine lange offene Verbindung. ... Ich würde eine Sub erstellen und alle Listboxen in einer Connection füllen. ...
      (microsoft.public.de.german.entwickler.dotnet.vb)
    • ADO Connection Object
      ... I would like a function to test whether I can open a connection to my SQL ... Server database. ... Dim WithEvents m_cnn As ADODB.Connection ... Private Sub Form_Open ...
      (comp.databases.ms-access)
    • Re: Threading.Monitor.Enter that doesnt /quite/ block the thread
      ... Protected Overloads Overrides Sub Dispose ... Public ReadOnly Property Connection() As SqlCeConnection ... Private Sub Form1_Activated(ByVal sender As Object, ...
      (microsoft.public.dotnet.framework.compactframework)
    • Re: Threading.Monitor.Enter that doesnt /quite/ block the thread
      ... Protected Overloads Overrides Sub Dispose ... Public ReadOnly Property Connection() As SqlCeConnection ... Private Sub Form1_Activated(ByVal sender As Object, ...
      (microsoft.public.dotnet.framework.compactframework)
    • Re: strange slowness with getrows method
      ... > After creating the recordset objRS (not actually listed on code I ... Create a connection variable and open it at the beginning of your page: ... SUB DataGetrows(parmConn, parmSQL, byref parmArray, byref parmDict) ...
      (microsoft.public.inetserver.asp.db)