German Datenbank - prüfen ob Wert vorhanden

pjo12345

Active Member
Licensed User
Longtime User
Hallo Leute,

ich brauche mal wieder eure Unterstützung. Ich habe eine App, welche diverse Daten in einer SQL Datenbank ablegt. Nun möchte ich neue Funktionen hinzufügen. Dazu brauche ich weitere Einträge (Spalten) in der Tabelle der Datenbank. Nehmen wir mal an die Tabelle enthält Anrede, Name, Kundennummer. Nun sollen noch Wohnort und Telefonnummer hinzukommen. Dabei möchte ich beim Aufruf der Datenbank prüfen ob diese neuen Spalten in der Datenbanktabelle vorhanden sind oder nicht. Wenn sie nicht vorhanden sind dann möchte ich sie mit einem Standardwert einfügen. Ich habe es mit count versucht aber wenn die Spalte noch gar nicht vorhanden ist, kommt natürlich gleich eine Fehlermeldung.
 

rboeck

Well-Known Member
Licensed User
Longtime User
Habe auch schon genau in dieser Richtung Überlegungen angestellt, aber noch nicht realisert. Ich habe zwei Vorschläge, wie Du es lösen könnstest:
Öffne die Tabelle mit einem "Select * ...", der Cursor hat die Eigenschaft ColumnCount. Aus diesem Wert könntest Du schon schliessen, ob die Datenbank bereits die neuen Spalten hat oder nicht.
Die zweite Variante ist ähnlich wie die erste Variante; nur hier verwendest Du z. B. *.Getstring("Plz") innerhalb einer Try Catch Anordnung. Die Get... Befehle müssen natürlich dem Datentyp entsprechen, nachdem Du suchst.
Was ich selbst noch nicht genau getestet habe: es gibt Einschränkungen von SQLite, was die Änderung des Tabellendesigns betrifft. Hinzufügen von Spalten ist aber möglich, nicht aber alle Änderungen an deren Eigenschaften. Hier der Link dazu: SQLite Query Language: ALTER TABLE
An der gefundenen Lösung wäre ich interessiert.
Sg
Reinhard
 

klaus

Expert
Licensed User
Longtime User
Wie rboeck schon angedeutet hatkannst Du mit "Select * ..." und Cursor1.ColumnCount wissen wie viele Spalten Du hast.
Dann kannst Du mit Cursor1.GetColumnName(i) den Namen der Spalten finden !
Dann weisst Du genau was drin ist. Den Rest hat rboeck auch schon beschrieben.
Ich frage mich trotzdem warum Du nicht weisst was in der Datenbank drin ist.

Beste Grüsse.
 

pjo12345

Active Member
Licensed User
Longtime User
So ungefähr habe ich mir das auch vorgestellt. Werde mal sehen was mir da so einfällt.

@Klaus: Ich weiß schon was in der Datenbank drin ist. Ich möchte halt nur prüfen ob die neuen Spalten schon drin oder nicht. Denn wenn ich Spalten auslese, welche es (noch) nicht gibt, dann kommt ja eine Fehlermeldung.
 

pjo12345

Active Member
Licensed User
Longtime User
Ich habe das jetzt für mich so gelöst:

Ich zähle mit
B4X:
CounterSpalten=Cursor1.ColumnCount
die Spalten.

Wenn die Spaltenzahl nicht stimmt, füge ich meine zwei neuen Spalten ein. Das mache ich mit
B4X:
SQL1.ExecNonQuery ("ALTER TABLE table2 ADD Spaltenname Datentyp)
Und fülle sie mit Standardwerten
B4X:
SQL1.ExecNonQuery ("UPDATE table2 SET Spaltenname= 'Wert'")
 

rwblinn

Well-Known Member
Licensed User
Longtime User
Hallo,

eine andere Möglichkeit wäre die Verwendung des SQLite Befehls PRAGMA table_info. Hier eine Beispielroutine:

B4X:
Sub bFieldExists(sTableName As String, sFieldName As String) As Boolean
' SQLite command pragma table_info returns values in the fields: cid, name, type, notnull, dflt_value, pk
' These can be searched through to check if a field exists, or get the field type etc.
' SQL1 is defined global as SQL. To be init using If SQL1.IsInitialized = False Then SQL1.Initialize(...
' Usage: If bFieldExists(sDBTable, sDBField) = True Then ...
   Dim curTable As Cursor
   Dim sSQLCommand As String
   Dim i As Int
   Dim Result As Boolean

   Result = False
   sSQLCommand = "PRAGMA table_info(" & sTableName & ")"
   Try
      curTable = SQL1.ExecQuery(sSQLCommand)
      For i = 0 To curTable.RowCount - 1
         curTable.Position = i
          If curTable.GetString("name") = sFieldName Then Result = True
      Next
      curTable.Close
   Catch
      Msgbox("SQL Error: " & LastException.Message, "")
   End Try
   Return Result
End Sub

Auch ein Gruss aus dem Norden...
 
Top