Re: Problem: MDB-Datenbank Zugriff über das Intranet

Tech-Archive recommends: Speed Up your PC by fixing your registry

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

  • Next message: 3ronco Mikic: "Re: Dataenvironment ja/nein?"
    Date: Sat, 29 May 2004 09:49:37 +0200
    
    

    Hallo Torsten,

    > OK, ich gebe zu, ich war etwas zu sparsam mit meinem Code,
    > ich hatte eben gehofft, der Fehler waere einfach zu finden.

    Auch jetzt hast Du wieder nur wenig brauchbare Codefragmente geliefert.

    Wie und wo öffnest Du Deine Connection zur *.mdb?

    > Hier also die entsprechenden Code-Fragmente:
    >
    > PC1 ("Server") erhaelt Daten ueber die seriellen Schnittstelle.
    > Wenn ein komplette Datenblock empfangen ist, wird er in die Datenbank
    > geschrieben:
    >
    > Dim rs as ADODB.Recordset
    > [...]
    > Set rs = New ADODB.Recordset
    > With rs
    > .Open "Tabelle1", _
    > "Provider=Microsoft.Jet.OLEDB.4.0;Data
    > Source=Datenbank.mdb", _
    > adOpenForwardOnly, _
    > adLockOptimistic, _
    > adCmdTable

    Wer verbreitet bloss immer diese fürchterlichen, mit allen möglichen und
    unmöglichen Parametern vollgepackten Open-Anweisungen?
    Warum nutzt Du nicht eine Schreibweise, die auch ein halbwegs vernünftiges
    Debugging ermöglicht?

    > .AddNew
    > .Fields("datDatumUhrzeit").value = Now
    > [... = Schreiben der anderen Felder]
    > .Update
    > .Close
    > End With
    > Set rs = Nothing
    >
    > Wie Du siehst, erfolgt der Zugriff direkt ueber das Recordset-Objekt,
    > daher kann ich keine weitere Fehlermeldungen in Erfahrung bringen.

    Natürlich kannst Du das.
    Die wirklichen Informationen zum Fehler sind in der
    Connection.Errors-Auflistung zu finden. Diese Auflistung kann im Fehlerfall
    eines oder auch mehrere Error-Objekte enthalten. Und eben diese
    Error-Objekte geben Auskunft über die wahren Fehlerhintergründe.

    > Der Absturz finden beim Befehl ".Open ..." statt.

    Na ja, klar, wo denn sonst?

    > Ich werde noch einen Versuch mit einem Connection-Object machen. Mal
    > sehen, ob da weitere Fehlermeldungen stehen.

    Welchen Versuch möchtest Du mit welchem Connection-Objekt machen?

    >
    > PC2 ("Client") fragt "\\PC1\Daten\Datenbank.mdb" Timer-gesteuert ab:
    >
    > Dim rs as New Recordset
    > [...]
    > rs.Open "Tabelle1", _
    >
    "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=\\PC1\Daten\Datenbank.mdb",
    > _
    > adOpenForwardOnly, _
    > adLockOptimistic, _
    > adCmdTable

    Auch hier wieder diese schauerliche Open-Anweisung, mit der Du Dir
    unnötigerweise ein vernünftiges Debugging verbaust.
    Welche Tabelle in Deiner Datenbank möchtest Du damit öffnen?

    > rs.MoveLast

    Du öffnest ein Recordset mit adOpenForwardOnly.
    Als erstes machst Du ein RS.MoveLast.
    Du hast danach keine Möglichkeit mehr, auf einen vor diesem letzten
    Datensatz liegenden Datensatz zuzugreifen. Ist das wirklich beabsichtigt?
    Wenn Du wirklich nur einen einzigen Datensatz lesen/bearbeiten willst, wäre
    es mit Sicherheit geschickter, Du würdest diesen Datensatz geziehlt mit
    einem SQL-Statement mit entsprechender Where-Klausel selektieren.
    RS.MoveLast bringt Dich zum letzten Datensatz. Was glaubst oder hoffst Du,
    welches Kriterium dieser Datensatz erfüllt?
    Das ganze sieht mehr wie ein Zufallsgenerator, denn wie methodische
    Ver-/Bearbeitung von Daten aus.

    > [... Auswerten des Datensatzes]

    Welches Datensatzes denn?
    Der letzte Datensatz in einem Recordset kann irgendein zufälliger Datensatz
    sein, wenn Du nicht mit einer entsprechenden OrderBy-Klausel für eine
    bestimmte Reihenfolge sorgst oder Deine Tabelle ein entsprechend indiziertes
    Feld / Primärschlüssel enthält.

    > rs.Close
    >
    > Auch hier wieder der Zugriff über das Recordset-Objekt.
    > Andere Zugriffe auf die Datenbank finden nicht statt, insbesondere
    > kann ich
    > ausschliessen, dass mehrere Programme gleichzeitig _schreibend_ auf
    > die
    > Datenbank zugreifen.
    > Auch diesen Programm stuerzt bei "rs.Open ..." ab.

    Dein Problem, gleichzeitige mehrfache Zugriffe auf die DB hat nicht primär
    was mit Deinem/einem Recordset zu tun.
    Viel wichtiger zu wissen wäre, wieviele Connection-Objekte es gibt, welche
    auf Deine *.mdb verweisen.
    Wenn Du zwei oder mehr Connection-Objekte in Deinem Programmcode öffnest
    (das können auch DataControls oder DataEnvironments) sein, dann hat das die
    selben Auswirkungen wie ein Mehrbenutzerbetrieb von verschiedenen Clients
    auf diese DB.

    > Noch eine Bemerkung am Rande: Installiere ich beide Programme auf
    > demselben Rechner, gibt es keine Abstuerze, nur beim Zugriff ueber das
    > Netzwerk.

    Auch das besagt ohne relevanten Code leider gar nichts.

    >
    > Wie schon erwaehnt, habe ich mit "On Error..." eine Fehlerbehandlung
    > implementiert. Jetzt stuerzen die Programme zwar nicht mehr ab, aber

    Jede Fehlerbehandlung wird mit "On Error" eingeleitet. Das was dann wirklich
    Aufschluss über Deine Arbeitsweise geben würde, zeigst Du wieder nicht.

    > ich verstehte nach wie vor nicht, warum es in meiner Konstellation
    > ueberhaupt Probleme gibt.

    Weil Du ganz offenbar das Funktionieren/Zusammenwirken von
    Connectionobjekten und Recordsets bzw. Commandobjekten nicht wirklich
    verstanden hast.

    >
    > Ich hoffe, dass sich mit diesen Informationen die Fehlerquelle finden
    > laesst.

    Mit welchen Informationen denn?
    Das worauf es ankommt, hast Du bisher nicht gezeigt.

    Vergleiche mal das nachfolgende Beispiel zum Öffnen einer Connection mit
    anschliessendem Öffnen eines Recordsets mit Deinem oben gezeigten Code.

    Option Explicit
        Private WithEvents mCNN as ADODB.Connection
        Private WithEvents mRS As ADODB.Recordset

    Public Sub AnySub()
        Dim strDBFileName As String
        Dim strDBPwd As String
        Dim strSQL As String

        ' vollst. Pfad zur Datenbankdatei *.mdb
        strDBFileName = "C:\Verzeichnis\DB.mdb"

        ' falls die DB mit einem Datenbankkennwort geschützt ist.
        strDBPwd = "DeinDBKennwort"

        ' Instanz eines Connectionobjektes erstellen
        Set mCnn = New ADODB.Connection

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

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

            .CursorLocation = adUseClient
            .Mode = adModeShareDenyNone

            .Open
        End With

        ' SQL-String für das zu erzeugende Recordset.
        strSQL = "Select FeldA, FeldB, FeldC From TabellenName"

        ' Instanz eines Recordsets erzeugen
        Set mRS = New ADODB.Recordset

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

            .Open
        End With
    End Sub

    Das sieht doch gleich wesentlich übersichtlicher aus und ermöglicht vor
    allem ein vernünftiges Debugging. Du kannst hierbei sogar jede einzelne
    Eigenschaft des Connectionobjektes und des Recordsetobjektes per
    Intellisense ansehen und auf seine Richtigkeit kontrollieren.

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


  • Next message: 3ronco Mikic: "Re: Dataenvironment ja/nein?"

    Relevant Pages

    • Re: Was ist schneller AddNew oder INSERT ???
      ... > with RS ... Du solltest dazu besser ein statisches Recordset mit clientseitgem Cursor ... Ein mit CursorType adOpenKeyset geöffnetes Recordset kann nicht im ... Fall jeder Datensatz einzeln zur DB übertragen würde. ...
      (microsoft.public.de.vb.datenbank)
    • =?Windows-1252?Q?Re:_Warum_werden_die_Datens=E4tze_nicht_fehlerfrei_ge=E4?= =?Windows-1252?Q
      ... Datensatz in die Spalte ArtEKpreis den Wert 3344, ... Prinipiell sollte Deine Routine alle Datensätze im Recordset erreichen. ... Entsprechend bereinigt und unter der Annahme dass das Feld "ArtEKpreis" ... With Recordset ...
      (microsoft.public.de.vb.datenbank)
    • Re: RecordSet.Delete und .AbsolutePosition
      ... ohne das Recordset danach neu einzulesen. ... End With ... Jetzt hat das Recordset RS keine Verbindung mehr zur Datenbank. ... Dein Recordset hat nun einen neuen Datensatz bekommen, ...
      (microsoft.public.de.vb.datenbank)
    • Re: AduseClient, Cn muss offen bleiben??
      ... > <Ab jetzt ist keine Verbindung zur DB mehr notwendig. ... With CN ... Statt Properties für die Connection in einem mehr oder weniger unlesbaren ... Da Du ein verbindungsloses Recordset haben willst, ...
      (microsoft.public.de.vb.datenbank)
    • Re: Updating Access data using SQL / refresh time question
      ... As a test today, for one poarticular recordset, I changed from DAO to ADO to ... > I forgot to mention that the expense of repeated connection open and close ... > dim oconn as new adodb.connection ... > 'Now load the listview by looping through each RS row ...
      (microsoft.public.vb.database)