Re: Problem: MDB-Datenbank Zugriff über das Intranet
From: Peter Götz (gssg_nospam_at_t-online.de)
Date: 05/29/04
- Previous message: Peter Götz: "Re: Datensatzänderungen"
- In reply to: Torsten Kahl: "Re: Problem: MDB-Datenbank Zugriff über das Intranet"
- Messages sorted by: [ date ] [ thread ]
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)
- Previous message: Peter Götz: "Re: Datensatzänderungen"
- In reply to: Torsten Kahl: "Re: Problem: MDB-Datenbank Zugriff über das Intranet"
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|