none
OpenFileDialog und OleDbConnection RRS feed

  • Frage

  • Hallo,

    Hintergrund: Datenbankanwendung, Forms, OleDbConnection (Jet), VS 2008
    Express, XP SP3

    Wenn 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 Morlo

    Codefragment 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.Empty

        Private Sub Form1_Load(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Me.Load
            Conn.Open()
            MsgBox(Conn.State.ToString)
            Conn.Close()
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button1.Click

            Dim dlg As New OpenFileDialog
            If dlg.ShowDialog = Windows.Forms.DialogResult.OK Then
                mPath = dlg.FileName
            End If
            dlg.Dispose()
            Conn.Open() 'hier
        End Sub

    End Class

    Sonntag, 22. April 2012 10:20

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
    Sonntag, 22. April 2012 10:46
    Moderator

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
    Sonntag, 22. April 2012 10:46
    Moderator
  • 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

    Sonntag, 22. April 2012 15:21
    Beantworter
  • 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

    Sonntag, 22. April 2012 19:06