Seite 1 von 2

[SQLite] Datenbank wie Key/Column löschen?

Verfasst: 03.06.2019 13:47
von Mijikai
Hinzufügen ist kein Problem:

Code: Alles auswählen

;...
request = "ALTER TABLE " + Table + " ADD " + Key + " INTEGER"
ProcedureReturn DatabaseUpdate(*Database,request)
Aber wieder löschen will nicht :roll:

Code: Alles auswählen

;...
request = "ALTER TABLE " + Table + " DROP COLUMN " + Key
ProcedureReturn DatabaseUpdate(*Database,request)
Ist es ein anderer Befehl?

Re: [SQLite] Datenbank wie Key/Column löschen?

Verfasst: 03.06.2019 14:07
von Sicro
Dafür musst du eine neue Tabelle erstellen:
How do I add or delete columns from an existing table in SQLite.

Re: [SQLite] Datenbank wie Key/Column löschen?

Verfasst: 03.06.2019 14:11
von Kiffi

Re: [SQLite] Datenbank wie Key/Column löschen?

Verfasst: 03.06.2019 14:13
von Mijikai
Danke für die Hilfe :)

Re: [SQLite] Datenbank wie Key/Column löschen?

Verfasst: 03.06.2019 15:43
von Mijikai
Muss ich alle Befehle einzeln übergeben?

Code: Alles auswählen

Procedure.i TableRemoveKey(*Database,Table.s,Key.s)
    Protected request.s
    Protected column_count.i
    Protected column_name.s
    Protected column_type.s
    Protected column_index.i
    Protected column_test.i
    Protected keys.s
    Protected backup.s
    ;Protected query.i
    If Table And Key
      request = "SELECT * FROM " + Table
      If DatabaseQuery(*Database,request)
        column_count = DatabaseColumns(*Database)
        column_count - 1
        For column_index = 0 To column_count
          column_name = DatabaseColumnName(*Database,column_index)
          Select DatabaseColumnType(*Database,column_index)
            Case #PB_Database_Long, #PB_Database_Quad
              column_type = " INTEGER"
            Case #PB_Database_Float, #PB_Database_Double
              column_type = " REAL"
            Case #PB_Database_String
              column_type = " TEXT"
            Case #PB_Database_Blob
              column_type = " BLOB"
          EndSelect
          If column_name = Key
            column_test = #True
          Else
            If column_index = column_count
              keys + column_name + column_type
            Else
              keys + column_name + column_type + ", "
            EndIf 
          EndIf
        Next
        FinishDatabaseQuery(*Database)
        If column_test
          backup = Table + "_backup"
          request = "CREATE TEMPORARY TABLE " + backup + " (" + keys + ")"
          request + " INSERT INTO " + backup + " SELECT " + keys + " FROM " + Table
          request + " DROP TABLE " + Table
          request + " CREATE TABLE " + Table + " (" + keys + ")"
          request + " INSERT INTO " + Table + " SELECT " + keys + " FROM " + backup
          request + " DROP TABLE " + backup
          request + " COMMIT"
          ProcedureReturn DatabaseUpdate(*Database,request)
        EndIf 
      EndIf 
    EndIf 
    ProcedureReturn #False
EndProcedure

Re: [SQLite] Datenbank wie Key/Column löschen?

Verfasst: 03.06.2019 15:59
von Kiffi
Du kannst das Create-Statement einer Tabelle auslesen:

Code: Alles auswählen

UseSQLiteDatabase()
OpenDatabase(DB, ":memory:", "", "", #PB_Database_SQLite)
DatabaseUpdate(DB, "Create Table myTable (Col1 INT, Col2 TEXT)")
DatabaseQuery(DB, "SELECT sql FROM sqlite_master WHERE name='myTable'")
NextDatabaseRow(DB)
Debug GetDatabaseString(DB, 0) ; -> "CREATE TABLE myTable (Col1 INT, Col2 TEXT)"
Danach kannst Du dieses nach Belieben per String-Operation verändern und auf die neue Tabelle anwenden.

Grüße ... Peter

Re: [SQLite] Datenbank wie Key/Column löschen?

Verfasst: 03.06.2019 19:45
von Mijikai
Danke Kiffi :)
Bin totaler Anfänger was die Datenbankprogrammierung betrifft. :oops:

Re: [SQLite] Datenbank wie Key/Column löschen?

Verfasst: 03.06.2019 23:12
von Kiffi
Kein Thema! Eine Hand wäscht die andere.

Grüße ... Peter

Re: [SQLite] Datenbank wie Key/Column löschen?

Verfasst: 04.06.2019 08:31
von Mijikai
Der Code funktioniert jetzt zwar aber lt. DatabaseUpdate() ist irgendwas falsch!?
Ich vermute es liegt an der Formatierung der Anfrage.

Ignoriert bitte den ersten Teil des Codes werde in später ändern.
Vorher will ich das Ganze erst einmal korrekt zum laufen bekommen.

Code: Alles auswählen

Procedure.i TableRemove(*Database,Table.s,Key.s)
    Protected request.s
    Protected column_count.i
    Protected column_name.s
    Protected column_type.s
    Protected column_index.i
    Protected column_test.i
    Protected keys.s
    Protected backup.s
    Protected query.i
    If Table And Key
      request = "SELECT * FROM " + Table
      If DatabaseQuery(*Database,request)
        column_count = DatabaseColumns(*Database)
        column_count - 1
        For column_index = 0 To column_count
          column_name = DatabaseColumnName(*Database,column_index)
          Select DatabaseColumnType(*Database,column_index)
            Case #PB_Database_Long, #PB_Database_Quad
              column_type = " INTEGER"
            Case #PB_Database_Float, #PB_Database_Double
              column_type = " REAL"
            Case #PB_Database_String
              column_type = " TEXT"
            Case #PB_Database_Blob
              column_type = " BLOB"
          EndSelect
          If column_name = Key
            column_test = #True
          Else
            If column_index = column_count
              keys + column_name + column_type
            Else
              keys + column_name + column_type + ", "
            EndIf 
          EndIf
        Next
        FinishDatabaseQuery(*Database)
        If column_test
          backup = Table + "_backup"
          request = "CREATE TEMPORARY TABLE " + backup + " (" + keys + ");"
          request + "INSERT INTO " + backup + " SELECT " + keys + " FROM " + Table + ";"
          request + "DROP TABLE " + Table+ ";"
          request + "CREATE TABLE " + Table + " (" + keys + ");"
          request + "INSERT INTO " + Table + " SELECT " + keys + " FROM " + backup+ ";"
          request + "DROP TABLE " + backup+ ";"
          request + "COMMIT;"
          Debug "->"
          Debug DatabaseUpdate(*Database,request)
          ProcedureReturn #True
        EndIf 
      EndIf 
    EndIf 
    ProcedureReturn #False
  EndProcedure

Re: [SQLite] Datenbank wie Key/Column löschen?

Verfasst: 04.06.2019 08:39
von Kiffi
Du kannst ja mal versuchen, ob DatabaseError() etwas verständliches ausgibt.