Benutzer mit den meisten Antworten
OpenFileDialog und OleDbConnection

Frage
-
Hallo,
Hintergrund: Datenbankanwendung, Forms, OleDbConnection (Jet), VS 2008
Express, XP SP3Wenn ich in einem Formular einen Öffnen-Datei-Dialog aufrufe, mir den
Dateipfad zurückgeben lasse und diesen in einer der Tables einlese, meldet
mir meine Datenklasse beim Speichern eine OleDbException bei Conn.Open:„Datei [Der-gerade-ausgewählte-Dateipfad]\MyDatabase.mdb' nicht gefunden.“
und die Datenbank lässt sich auch beim Zurücksetzen der Verbindung nicht
mehr öffnen (s.u.).Nun ist es zwar durchaus ein gangbarer Weg die Jet über die Dauer einer
Arbeitssitzung geöffnet zu halten („.ldb“), aber es müsste doch wohl auch
eine Lösung für das Problem geben. Oder übersehe ich was Grundlegendes?Ich tappe gänzlich im Dunkeln.
Danke und Gruß
Josef MorloCodefragment zur Demonstration:
beliebige .mdb ins Ausgabeverzeichnis, Form mit einem Button
Imports System.Data.OleDb
Public Class Form1
Private Conn As New OleDbConnection( _
"Provider=Microsoft.Jet.OleDb.4.0;Data Source=MyDb.mdb")
Private mPath As String =String.EmptyPrivate Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
Conn.Open()
MsgBox(Conn.State.ToString)
Conn.Close()
End SubPrivate Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.ClickDim dlg As New OpenFileDialog
If dlg.ShowDialog = Windows.Forms.DialogResult.OK Then
mPath = dlg.FileName
End If
dlg.Dispose()
Conn.Open() 'hier
End SubEnd Class
Antworten
-
Hallo Josef,
wo sollte denn der Code stehen, mit dem der ConnectionString geändert wird? Da steht immer noch "DataSource=MyDb.mdb" drin. Da kein Pfad angegeben wird, ist es Glückssache, wo die Datei gesucht wird, in der Regel im aktuellen Arbeitsverzeichnis, welches aber nicht das Anwendungsverzeichnis sein muss. Daher wäre es sinnvoll, den Pfad zur Laufzeit zu ermitteln und den ConnectionString dann mit Pfad aufzubauen.
Aber nochmal: Du setzt zwar mPath = ... aber dr ConnectionString wird hierdurch nicht geändert.
Für die Connection solltest Du immer Conn.Dispose() aufrufen, wenn Du die Connection nicht mehr benötigst. Dann sollte auch die .ldb verschwinden.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Elmar BoyeEditor Sonntag, 22. April 2012 15:21
- Als Antwort markiert Josef Morlo Sonntag, 22. April 2012 19:10
Alle Antworten
-
Hallo Josef,
wo sollte denn der Code stehen, mit dem der ConnectionString geändert wird? Da steht immer noch "DataSource=MyDb.mdb" drin. Da kein Pfad angegeben wird, ist es Glückssache, wo die Datei gesucht wird, in der Regel im aktuellen Arbeitsverzeichnis, welches aber nicht das Anwendungsverzeichnis sein muss. Daher wäre es sinnvoll, den Pfad zur Laufzeit zu ermitteln und den ConnectionString dann mit Pfad aufzubauen.
Aber nochmal: Du setzt zwar mPath = ... aber dr ConnectionString wird hierdurch nicht geändert.
Für die Connection solltest Du immer Conn.Dispose() aufrufen, wenn Du die Connection nicht mehr benötigst. Dann sollte auch die .ldb verschwinden.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Elmar BoyeEditor Sonntag, 22. April 2012 15:21
- Als Antwort markiert Josef Morlo Sonntag, 22. April 2012 19:10
-
Hallo Josef,
ergänzend zu Stefans Antwort:
Damit Du den Pfad in die Verbindungszeichenfolge eingebaut bekommst, verwende den OleDbConnectionStringBuilder.
Dort findest Du auch ein einfaches Beispiel für Access / Jet.Gruß Elmar
-
Hallo Stefan, hallo Elmar,
zunächst mal danke für’s Interesse.
@Stefan
Da kein Pfad angegeben wird, ist es Glückssache, wo die Datei gesucht wird, in der Regel im aktuellen Arbeitsverzeichnis
[…]
D.h. also umgekehrt, dass die .mdb, selbst wenn sie Ausgabeverzeichnis
liegt, aufgrund irgendwelcher Seiteneffekte (hier: Öffnen-Datei-Dialog),
nicht immer gefunden wird, bzw. den Speicherort wieder ‚vergisst’. Habe ich
das recht verstanden? Gleiches Problem im übrigen auch mit dem
Projektverzeichnis (..\..\MyDb.mdb).Das war mir bisher nicht bewusst. Beim Entwickeln hatte ich bislang auch
noch keine Probleme mit dem Ausgabeverzeichnis als (vorläufigem)
Speicherort.
Man ist dann also nur dann auf der sicheren Seite, wenn der Pfad voll
qualifiziert ist. Korrekt?Für die Connection solltest Du immer Conn.Dispose() aufrufen, wenn Du die Connection nicht mehr benötigst.
Schon klar, ich nutze in der Regel Using, da erübrigt sich .Dispose
ohnehin.Herzlichen Dank und Gruß
Josef Morlo