Datenbank richtig schließen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von woeh.

    Datenbank richtig schließen

    hallo :)

    ich habe folgendes problem....
    ich versuche eine datenbank. fehlt diese, wird sie erstellt:

    VB.NET-Quellcode

    1. Private Function Open(Optional pass As String = "") As Boolean
    2. Try
    3. dbCon = New OleDb.OleDbConnection
    4. dbCon.ConnectionString =
    5. "Provider=Microsoft.Jet.OLEDB.4.0;" &
    6. "Data Source=" & modMain.My.DBpath
    7. If pass.Length <> 0 Then
    8. dbCon.ConnectionString = dbCon.ConnectionString &
    9. ";Jet OLEDB:Database Password=" & pass
    10. End If
    11. dbCon.Open()
    12. Return True
    13. Catch ex As Exception
    14. If Err.Number <> 5 Then
    15. Log(LogColor.errorInfo, Err.Description, Err.Number)
    16. End If
    17. Return False
    18. End Try
    19. End Function
    20. Private Function CreateNewDatabase(Optional pass As String = "") As Boolean
    21. Dim catalog As Object
    22. Dim strCreate As String
    23. KillFile(modMain.My.DBpath, False)
    24. Log(LogColor.info, "Eine neue Datenbank wird erstellt.")
    25. Try
    26. strCreate = "Provider=Microsoft.Jet.OLEDB.4.0; " &
    27. "Data Source=" & modMain.My.DBpath
    28. If pass.Length <> 0 Then
    29. strCreate = strCreate & "; Jet OLEDB:Database Password=" & pass
    30. End If
    31. catalog = CreateObject("ADOX.Catalog")
    32. catalog.create(strCreate)
    33. catalog = Nothing
    34. Return True
    35. Catch ex As Exception
    36. Log(LogColor.errorInfo, Err.Description, Err.Number)
    37. Return False
    38. End Try
    39. End Function


    wird sie erstellt, wird ein tabelle hinzugefügt:

    VB.NET-Quellcode

    1. Private Function CreateTable() As Boolean
    2. Dim sql As String = "CREATE TABLE " & "Overview" & "(" &
    3. "ID COUNTER NOT NULL CONSTRAINT PK_ID_no PRIMARY KEY, " &
    4. "Filename Text(255) NOT NULL, " &
    5. "Path Text NOT NULL, " &
    6. "Filesize Integer, " &
    7. "Playtime Integer," &
    8. "ID3v1 Bit, " &
    9. "ID3v2 Bit, " &
    10. "Track Integer, " &
    11. "Title Text, " &
    12. "Artist Text, " &
    13. "Album Text, " &
    14. "Jahr Integer, " &
    15. "Genre Text, " &
    16. "Comment Text" &
    17. ")"
    18. Try
    19. Dim cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand(sql, dbCon)
    20. cmd.ExecuteNonQuery()
    21. cmd.Dispose()
    22. cmd = Nothing
    23. Return True
    24. Catch ex As Exception
    25. Log(LogColor.errorInfo, Err.Description, Err.Number)
    26. Return False
    27. End Try
    28. End Function


    dann wird versucht die tabelle zu öffnen:

    VB.NET-Quellcode

    1. Public Function SelectTable(ByVal CloseTable As Boolean,
    2. ByRef cmd As OleDb.OleDbCommand) As Boolean
    3. Try
    4. Dim sql As String = "SELECT * FROM Overview"
    5. cmd = New OleDb.OleDbCommand(sql, dbCon)
    6. If CloseTable Then
    7. cmd.Dispose()
    8. cmd = Nothing
    9. End If
    10. Return True
    11. Catch ex As Exception
    12. Log(LogColor.errorInfo, Err.Description, Err.Number)
    13. Return False
    14. End Try
    15. End Function


    soweit, sogut.
    ich möchte dem user die möglichkeit geben die tabelle zu entfernen oder ein backup zu machen.
    in beiden fällen muß die verbindgung zur datenbank geschlossen werden:

    VB.NET-Quellcode

    1. Private Sub butDatabaseRemove_Click(sender As Object, e As EventArgs) Handles butDatabaseRemove.Click
    2. If Message("Hiermit wird die Datenbank unwiederruflich gelöscht.", vbInformation + vbYesNoCancel) <> vbYes Then
    3. Exit Sub
    4. End If
    5. If dbCon IsNot Nothing Then
    6. dbCon.Close()
    7. dbCon = Nothing
    8. End If
    9. If KillFile(modMain.My.DBpath, True) = True Then
    10. gbDatabase.Visible = False
    11. End If
    12. End Sub


    ich kann die tabelle genau 2x löschen...danach erhalte ich keinen zugriff mehr...obwohl ich sie schliesse und dbCon = Nothing ist.

    jmd eine idee ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „woeh“ ()

    woeh schrieb:

    Datenbank richtig schließen
    Du meinst wohl die Verbindung zur DB richtig schließen...
    Verwende bei solchen Operationen immer ein Using - damit wird immer ordentlich aufgeräumt und auch geschlossen...

    VB.NET-Quellcode

    1. Public Function queryUpdate(connString As String, sql As String) As Integer
    2. Using con As New OleDbConnection(connString)
    3. con.Open()
    4. Using cmd As New OleDbCommand(sql, con)
    5. Return cmd.ExecuteNonQuery
    6. End Using
    7. End Using ' hier wird die Connection wieder ordentlich geschlossen...
    8. End Function
    ich habe eben folgendes entdeckt bei der variabel "dbCon"

    folgendes bekomme ich angezeigt:
    Der Ausdruck kann nicht ausgewertet werden, da der Code der aktuellen Methode optimiert wurde.

    das kommt direkt nach dem ersten open-Befehl....also sofort wenn ich versuche sie zu öffnen
    es wird aber kein fehler ausgegeben...

    ich werde erstmal deinen rat beherzigen und aufräumen :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „woeh“ ()

    ich habe aufgeräumt, aber das problem besteht weiterhin....nach 2x löschen keinen zugriff....

    datenbank versuchen zu öffnen:

    VB.NET-Quellcode

    1. Public Function Open() As Boolean
    2. Dim success As Boolean
    3. Using con As New OleDb.OleDbConnection(GetConnectionString)
    4. Try
    5. con.Open()
    6. success = True
    7. Catch ex As Exception
    8. If Err.Number <> 5 Then
    9. Log(LogColor.errorInfo, Err.Description, Err.Number)
    10. End If
    11. success = False
    12. End Try
    13. End Using
    14. Return success
    15. End Function


    datenbank erstellen:

    VB.NET-Quellcode

    1. Private Function CreateNewDatabase() As Boolean
    2. Dim catalog As Object
    3. KillFile(modMain.My.DBpath, False)
    4. Try
    5. catalog = CreateObject("ADOX.Catalog")
    6. catalog.create(GetConnectionString())
    7. catalog = Nothing
    8. Log(LogColor.info, "Die Datenbank wurde erfolgreich erstellt.")
    9. Return True
    10. Catch ex As Exception
    11. Log(LogColor.errorInfo, Err.Description, Err.Number)
    12. Return False
    13. End Try
    14. End Function


    tabelle erstellen:

    VB.NET-Quellcode

    1. Private Sub CreateTable()
    2. Dim sql As String = "CREATE TABLE " & "Overview" & "(" &
    3. "ID COUNTER NOT NULL CONSTRAINT PK_ID_no PRIMARY KEY, " &
    4. "Filename Text(255) NOT NULL, " &
    5. "Path Text NOT NULL, " &
    6. "Filesize Integer, " &
    7. "Playtime Integer," &
    8. "ID3v1 Bit, " &
    9. "ID3v2 Bit, " &
    10. "Track Integer, " &
    11. "Title Text, " &
    12. "Artist Text, " &
    13. "Album Text, " &
    14. "Jahr Integer, " &
    15. "Genre Text, " &
    16. "Comment Text" &
    17. ")"
    18. queryUpdate(sql)
    19. End Sub


    connectionString

    VB.NET-Quellcode

    1. Private Function GetConnectionString() As String
    2. Dim strCon As String
    3. strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" &
    4. "Data Source=" & modMain.My.DBpath
    5. If modMain.My.DBpass.Length <> 0 Then
    6. strCon = strCon & ";Jet OLEDB:Database Password=" & modMain.My.DBpass
    7. End If
    8. Return strCon
    9. End Function


    abfrage:

    VB.NET-Quellcode

    1. Public Function queryUpdate(ByVal sql As String) As Integer
    2. Using con As New OleDb.OleDbConnection(GetConnectionString)
    3. con.Open()
    4. Using cmd As New OleDb.OleDbCommand(sql, con)
    5. Return cmd.ExecuteNonQuery
    6. End Using
    7. End Using
    8. End Function


    es bleibt gleich....programmstart -> versuchen zu öffnen...wenn false --> neue datenbank anlegen
    im programm: datenbank löschen & neue anlegen...beim 2x kommt wieder die meldung

    ich habe den code jetzt um einiges verkürzen können. das problem besteht weiterhin :(

    ich greife sonst nicht zu...nur öffnen bzw erstellen & wieder löschen.

    löschen sieht so aus:

    VB.NET-Quellcode

    1. Private Sub butDatabaseRemove_Click(sender As Object, e As EventArgs) Handles butDatabaseRemove.Click
    2. If Message("Hiermit wird die Datenbank unwiederruflich gelöscht.", vbInformation + vbYesNoCancel) <> vbYes Then
    3. Exit Sub
    4. End If
    5. If KillFile(modMain.My.DBpath, True) = True Then
    6. gbDatabase.Visible = False
    7. End If
    8. End Sub


    ich weiß nicht, was ich falsch machen :(
    Löschst du mit KillFile nur die Tabellen, oder die ganze Access Datei?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Kannst du mal deinen Code am Stück (in einem Spoiler) posten?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    die fileinfo sagt mir aber nicht ob ich sie öffnen kann und ob die tabelle existent ist.

    außerdem habe ich herausgefunden, dass es nicht am öffnen liegt.
    es liegt an der erstellung. ich kann öffnen & löschen sooft ich will.

    ich kann auch löschen & mit inhalt erstellen & löschen sooft ich will.

    aber sobald ich erstelle ohne inhalt, also nur mit table & lösche kommt der fehler nach 2x.
    Ok, hab mal geschaut:

    1. Erzeuge die DB richtig, und nutze ADOX
    ->support.microsoft.com/de-de/he…using-adox-and-visual-bas
    -> vbarchiv.net/tipps/tipp_1306-d…t-adox-erstellen-ado.html
    2. Die Datenbank befindet sich, nach der Erstellung im Zugriff des Programms und kann nicht geöffnet werden (leicht zu testen über den Explorer). Diese muss also geschlossen werden. Wie, hab ich auf die schnelle nicht heraus gefunden. Hier bietet ADOX sicher was.
    3. Anbei ein Testprojekt für die anderen hier mit allen Verweisen zum testen.
    Dateien
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „mrMo“ ()

    @VB1963 Ja cool, dachte mir schon sowas in der Richtung, hatte nur keine Zeit mehr, bin im Urlaub und musste Essen gehen;-)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen