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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

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

Beitrag 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?
Zuletzt geändert von Mijikai am 03.06.2019 15:30, insgesamt 2-mal geändert.
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

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

Beitrag von Sicro »

Dafür musst du eine neue Tabelle erstellen:
How do I add or delete columns from an existing table in SQLite.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag von Kiffi »

Hygge
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

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

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag 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
Hygge
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

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

Beitrag von Mijikai »

Danke Kiffi :)
Bin totaler Anfänger was die Datenbankprogrammierung betrifft. :oops:
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag von Kiffi »

Kein Thema! Eine Hand wäscht die andere.

Grüße ... Peter
Hygge
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

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

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag von Kiffi »

Du kannst ja mal versuchen, ob DatabaseError() etwas verständliches ausgibt.
Hygge
Antworten