Announcement

Collapse
No announcement yet.

Prüfen ob Datenbank oder Tabelle existiert (SqlServerCe)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Prüfen ob Datenbank oder Tabelle existiert (SqlServerCe)

    Hallo Forum,

    @ Moderatoren: War mir nicht sicher in welches Forum das gehört. Bitte gfs. verschieben. Danke.

    Code unter VB.Net mit einer SqlServerCe - Datenbank.
    Die DB nutzte ich wie in dem Turorial erklärt.

    Bin auf dem Gebiet blutiger Anfänger. Für SqlServerCe habe ich mich entschieden auf Grund einer Empfehlung hier im Forum. Nach nächtelangem googeln habe ich einzig das obige Tutorial gefunden um auch damit arbeiten zu können. Geht soweit auch.

    Meine Fragen:

    1) Wie kann ich (geschickt) prüfen ob die Datenbank schon existiert?
    2) Wie kann ich (geschickt) prüfen ob eine bestimmte Tabelle existiert?
    2.1) Wie kann ich "As DataTable" verwenden?

    Zu 1) Da SqlServerCe ja nur aus einer Datei besteht mache ich das so:
    Code:
    If System.IO.File.Exists(My.Application.Info.DirectoryPath & "\test.sdf") = False Then CreateSQL() End If
    Das geht. Ist das auch die übliche Vorgehensweise oder würdet Ihr das anders (besser) lösen?

    Zu 2) Hier scheitere ich mit folgendem Versuch:
    Code:
    If TABLEEXISTS(TABLENAME) = False Then
                CreateTable()
    
            End If
    
    Public Function TABLEEXISTS(ByVal TABLENAME As String) As Boolean
            Dim conn As New SqlCeConnection
            Dim cmd As New SqlCeCommand
    
            conn.ConnectionString = Me._appPath
            cmd.Connection = conn
            cmd.CommandText = "Select * From Information_Schema.Tables Where Table_Name = '" & TABLENAME & "'"
            Dim da As New SqlCeDataAdapter(cmd)
            Dim dt As New DataTable
    
            conn.Open()
            da.Fill(dt)
            cmd.ExecuteNonQuery()
            conn.Close()
    
            If dt Is Nothing Then
                Return False
            Else
                Return True
            End If
    
        End Function
    Leider returned diese Funktion immer True. Eigentlich auch klar, das Objekt gibt es ja auch, aber ich will ja prüfen ob es leer ist...

    Gibt es da nicht einen besseren Ansatz? Also direkt mit SQL-Befehl prüfen ob die Tabelle existier und boolean zurückliefern, doer so?

    Zu 2.1 Dadurch erklärt sich auch diese Frage. Wie kann ich denn eine DataTable überprüfen ob oder vieviele Datensätze enhalten sind?

    Danke für Eure Hilfe!
    Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
    Entwicklungsumgebung: Visual Basic 2008 Pro

  • #2
    Hallo,

    dieses Unterforum ist auf jeden Fall falsch. Es ist nur zuständig für SQL-Probleme, die nicht zu einem speziellen DBMS gehören. Weil du mit NET arbeitest, kommt .NET/ADO.NET infrage. Geeignet ist auch das Unterforum MS-SQL Server, weil die Fragen mit passenden SQL-Befehlen beantwortet werden können (auch wenn das Unterforum seltsam bezeichnet ist).

    zu 1. Diese Prüfung muss zuerst kommen. Der nächste Schritt kann sein, ob mit Connection.Open eine Verbindung hergestellt werden kann; unter .sdf könnte theoretisch auch jede andere Art von Datei gespeichert sein.

    zu 2. Das sollte der richtige Weg sein. Aber für einen solchen SELECT ist ExecuteNonQuery eher Quatsch (NonQuery = keine Abfrage), sondern ExecuteReader sinnvoll. Wenn die Tabelle nicht existiert, sollten 0 Zeilen zurückgegeben werden. Vielleicht kannst du den SELECt auch so formulieren, dass ExecuteScalar funktioniert.

    zu 2.1. DataTable ist sinnvoll, wenn du die Daten haben willst, und zwar zusammen mit DbDataAdapter.Fill.

    Für den Arbeitsablauf von Connection bis conn.Close benutze vorzugsweise einen Using-Block; die Forumssuche in ADO.NET oder VB.NET sollte diverse Tipps bringen.

    Gruß Jürgen

    Comment


    • #3
      Gelöst:

      Hallo Jürgen,

      vielen Dank für Deine ausführliche Antwort - auch wenn ich (als Newbie) einige Tage gebraucht habe sie zu verstehen... ;-)

      Auch wenn's das falsche Unterforum ist poste ich hier mal meine Lösung für den Fall, dass mal Jemand (verzweifelt wie ich es war) hier drüber stolpert:

      Lösung:

      via VB.Net
      1) Prüfen ob eine SqlServerCe - Datenbank existiert und der Zugriff darauf möglich ist.
      2) Prüfen ob eine bestimmte Tabelle in dieser SqlServerCe - Datenbank vorhanden ist.

      Aufruf:
      Code:
      Private app_root As String = My.Application.Info.DirectoryPath
      DbPruefen("datenbank1", "tabelle1"") 'db_name, tabelle_name
      Ans Werk:
      Code:
      Private Sub DbPruefen(ByVal db_name As String, ByVal tabelle_name As String)
              'Prüfen ob es die Datenbank schon gibt.
              If System.IO.File.Exists(app_root & "\" & db_name & ".sdf") = False Then
                  DbErstellen(db_name)
              End If
              'Prüfen ob der Dateizugriff auch klappt.
              Try
                  Dim conn As New SqlCeConnection
                  Dim cmd As New SqlCeCommand
                  conn.ConnectionString = "datasource = " & app_root & "\" & db_name & ".sdf"
                  cmd.Connection = conn
                  conn.Open()
                  conn.Close()
              Catch ex As Exception
                  Console.Write(ex)
                  'überarbeiten -> gefährlich!!!
                  System.IO.File.Delete(app_root & "\" & db_name & ".sdf")
                  Console.Write("Datei gelöscht.")
                  DbErstellen(db_name)
              End Try
              'Prüfen ob die Tabelle schon existiert
              If GibtsTabelle(db_name, tabelle_name) = False Then
                  TabelleAnlegen(db_name, tabelle_name)
              End If
          End Sub
      
          Private Function GibtsTabelle(ByVal db_name As String, ByVal tabelle_name As String) As Boolean
              Dim dt As New DataTable
              Try
                  Dim conn As New SqlCeConnection
                  Dim cmd As New SqlCeCommand
                  conn.ConnectionString = "datasource = " & app_root & "\" & db_name & ".sdf"
                  cmd.Connection = conn
                  cmd.CommandText = "Select * From Information_Schema.Tables"
                  Dim da As New SqlCeDataAdapter(cmd)
                  conn.Open()
                  da.Fill(dt)
                  conn.Close()
              Catch ex As Exception
                  Console.Write(ex)
              End Try
              Dim row As DataRow
              For Each row In dt.Rows
                  If row("TABLE_NAME") Is tabelle_name Then
                      Return True
                      Exit Function
                  End If
              Next
              Return False
          End Function
      So das war's. ;-)

      Würde mich dennoch über Kommentare oder gar Verbesserungsvorschläge freuen!
      Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
      Entwicklungsumgebung: Visual Basic 2008 Pro

      Comment


      • #4
        Wenn's nur auf die Existenz der Tabelle ankommt, dann lieber anstelle da.Fill()

        [highlight=vbnet]Private Function GibtsTabelle(ByVal db_name As String, ByVal tabelle_name As String) As Boolean
        Dim RetVal As Boolean = False
        Try
        .
        .
        .
        cmd.CommandText = "Select count(*) From Information_Schema.Tables Where Table_Name = '" & tabelle_name & "'"
        RetVal = (CInt(cmd.ExecuteScalar()) <> 0)
        'Connection schließen
        .
        .
        Catch
        End Try

        Return RetVal
        End Function[/highlight]

        Außerdem: If row("TABLE_NAME") Is tabelle_name Then könnte False ergeben, auch wenn der Stringinhalt übereinstimmt (man probiere folgendes).

        [highlight=vbnet]Dim str As String = "string"
        Dim str1 As String = "str"
        str1 &= "ing"
        Dim isRef As Boolean = (str Is str1) ' ergibt False
        Dim isEqual As Boolean = (str = str1)
        [/highlight]

        Daher besser: If row("TABLE_NAME") IsNot System.DbNull.Value AndAlso CStr(row("TABLE_NAME")) = tabelle_name Then

        Code nach einem Return wird nicht mehr ausgeführt; damit ist das nachfolgende "Exit Function" überflüssig.

        Comment

        Working...
        X