SQL Anfänger

Anfängerfragen zum Programmieren mit PureBasic.
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

SQL Anfänger

Beitrag von HemSA »

Hallole und schon mal schöne Ostern wünsche ich euch allen.

Ich will was in SQL machen und fange gerade erst an damit die Beispiele mal zu probieren.

Dieser funktioniert ohne Probleme:

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Database example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

UseSQLiteDatabase()

Procedure CheckDatabaseUpdate(Database, Query$)
   Result = DatabaseUpdate(Database, Query$)
   If Result = 0
      Debug DatabaseError()
   EndIf
   
   ProcedureReturn Result
EndProcedure

DatabaseFile$ = GetTemporaryDirectory()+"Database.sqlite"

If CreateFile(0, DatabaseFile$)
   CloseFile(0)
   
   If OpenDatabase(0, DatabaseFile$, "", "")
   
      CheckDatabaseUpdate(0, "CREATE TABLE food (name CHAR(50), weight INT)")

      CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('apple', '10')")
      CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('pear', '5')")
      CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('banana', '20')")
      
      If DatabaseQuery(0, "SELECT * FROM food WHERE weight > 7")
      
         While NextDatabaseRow(0)
            Debug GetDatabaseString(0, 0)
         Wend
      
         FinishDatabaseQuery(0)
      EndIf
      
      CloseDatabase(0)
   Else
      Debug "Can't open database !"
   EndIf
Else
   Debug "Can't create the database file !"
EndIf
Dieser funktioniert zum Teil. Ich habe auch die Debugerwerte geschrieben:

Code: Alles auswählen


UseSQLiteDatabase()

  Filename$ = OpenFileRequester("Wähle einen Dateinamen", "PureBasic.sqlite", "*.sqlite|*.sqlite", 0)
  
  If CreateFile(0, Filename$)
    Debug "Datenbank-Datei erstellt"
    CloseFile(0)
  EndIf
  
  If OpenDatabase(0, Filename$, "", "")
    Debug "Verbunden mit PureBasic.sqlite"
    If DatabaseUpdate(0, "CREATE TABLE info (test VARCHAR(255));")
      Debug "Tabelle erstellt"
    EndIf
  EndIf
  
  
  Ergebnis = OpenDatabase(0, "PureBasic.sqlite", "", "")
  Debug Ergebnis      ;Wert: 34609824
  
  Name$ = DatabaseColumnName(0, 0)
  Debug Name$         ;Wert: leer obwohl es doch test sein müsste oder?  
  
  DatenbankID = DatabaseID(0)
  Debug DatenbankID   ;Wert: 3189744
  
  Text$ = GetDatabaseString(0, 0)
  Debug Text$         ;Wert:leer
  
  Ergebnis2 = OpenDatabase(0, "PureBasic.sqlite", "", "")
  Debug Ergebnis2     ;Wert: 34609824 ==> sollte auch so sein  
  

  
  ; Zuerst stellen wir eine Verbindung zu der 'employee' (Angestellten) Tabelle her
  ;
  If DatabaseQuery(0, "SELECT * FROM PureBasic.sqlite")  ; Ermittelt alle Einträge in der 'employee' Tabelle

    While NextDatabaseRow(0)   ; alle Einträge durchlaufen
      Debug GetDatabaseString(0, 0)  ; Inhalt vom ersten Feld anzeigen
    Wend

    FinishDatabaseQuery(0)
  Else
    MessageRequester("Fehler", "Kann die folgende Abfrage nicht ausführen: "+DatabaseError())
  EndIf

Es kommt immer die Fehlermeldung: no such table: PureBasic.sqlite
Egal ob da Purebasic oder PureBasic.sqlite in dieser Zeile steht:

Code: Alles auswählen

If DatabaseQuery(0, "SELECT * FROM PureBasic.sqlite")

Hat da jemand eine Idee an was das liegt und was ich falsch mache?

Danke
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: SQL Anfänger

Beitrag von mk-soft »

Es wird nicht bei SQL der Dateiname von der Datenbank verwendet.

Es gibt noch die "sqlite_master" Tabelle.
Ausserdem kann man zum testen auch sehr gut eine Memory Datenbank mit SQLite erstellen. (Dateiname ":memory:")

P.S. Vielleicht auch noch interessant
- ShowDatabaseItems
- A QUICK & SIMPLE TUTORIAL ON SQLite DATABASE FUNCTIONS

Code: Alles auswählen

;-TOP

UseSQLiteDatabase()

Procedure CheckDatabaseUpdate(Database, Query$)
  Result = DatabaseUpdate(Database, Query$)
  If Result = 0
    Debug DatabaseError()
  EndIf
  
  ProcedureReturn Result
EndProcedure

;DatabaseFile$ = GetTemporaryDirectory()+"Database.sqlite"

DatabaseFile$ = ":memory:"

If OpenDatabase(0, DatabaseFile$, "", "")
  
  CheckDatabaseUpdate(0, "CREATE TABLE food (name CHAR(50), weight INT)")
  
  CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('apple', '10')")
  CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('pear', '5')")
  CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('banana', '20')")
  
  Debug "*** Query food ***"
  If DatabaseQuery(0, "SELECT * FROM food WHERE weight > 7")
    
    
    While NextDatabaseRow(0)
      Debug GetDatabaseString(0, 0)
    Wend
    
    FinishDatabaseQuery(0)
  EndIf
  
  Debug "*** Query master ***"
  If DatabaseQuery(0, "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name")
    
    While NextDatabaseRow(0)
      Debug GetDatabaseString(0, 0)
    Wend
    
    FinishDatabaseQuery(0)
  EndIf
  
  CloseDatabase(0)
Else
  Debug "Can't open database !"
EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Re: SQL Anfänger

Beitrag von HemSA »

Hallo mk-soft,
danke für die Links. Habe jetzt viel zu tun um die Beispiele mal zu testen und nochmal schöne Ostern.
Hier gibt es keine Ostern, haben gerade ehh Ausgangssperre.

Wenn ich noch Fragen habe melde ich mich einfach nochmal.

Danke und Tschüßle
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Re: SQL Anfänger

Beitrag von HemSA »

Hallole,
ich hoffe ihr hattet nette Ostern.

Ich habe eine csv Datei. Wenn man die komlett kopiert und in Excel einfügt wird jeder Bereich in einer separaten Spalte (insgesamt 16) eingefügt.
Von dem her alles in Ordnung was die Datei angeht.

Kann mir jemand einen Tipgeben wie ich diese Datei in eine SQLite (oder SQL) Datei einlesen kann?

- Unabhaengig von der Zeilenanzahl von der csv Datei
- Danach eine neue csv Datei anhaengen

Danke
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: SQL Anfänger

Beitrag von Andesdaf »

Für ODBC gibt es Treiber für Excel- und CSV-Zugriff; wenn du das nutzen möchtest, findest du über die Suche einiges.

Ansonsten, als einfachste Vorgehensweise: Datei zeilenweise einlesen, die Werte jeder Zeile am Trennzeichen aufsplitten und dann für jede
Zeile ein Insert mit den aufgeteilten Werten.
Win11 x64 | PB 6.00 (x64)
MenschMarkus
Beiträge: 220
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: SQL Anfänger

Beitrag von MenschMarkus »

Hi HemSA

Code: Alles auswählen

If DatabaseQuery(0, "SELECT * FROM PureBasic.sqlite")
Das geht so nicht. Den SELECT Befehl kannst Du auf eine Tabelle anwenden, nicht aber auf die Datenbank. Die öffnest Du mit "OpenDatabase()"

richtig wäre:

Code: Alles auswählen

If DatabaseQuery(0, "SELECT * FROM info")

Hier mal ein Beispiel mit DB Aufbau, passender CSV Datei, und einlesen der CSV Datei in die Datenbank

Code: Alles auswählen

UseSQLiteDatabase()

Enumeration
  #File
  #Database
EndEnumeration

Define Query.s
Define String.s

; Vorbereitung CSV Datei (Trennzeichen ";" )
CreateFile(#File,"myCSV.csv")
CloseFile(#File)
OpenFile(#File,"myCSV.csv")
WriteStringN(#File,"25;Hallo;3.141")
WriteStringN(#File,"18;Welt;2.718")
CloseFile(#File)

CreateFile(#File,"MyDB.db")
CloseFile(#File)
If OpenDatabase(#Database,"MyDB.db","","",#PB_Database_SQLite)
  Query = "CREATE TABLE `mytable` (wert1 INT,wert2 CHAR,wert3 float)"     ;Die Tabelle besteht aus 3 Feldern
  If DatabaseUpdate(#Database,Query)
    OpenFile(#File,"myCSV.csv")
    While Not Eof(#File)                            ;Lies solange eine Zeile ein bis keine mehr da sind
      String = ReadString(#File)                    ;Schreibe die gelesene Zeile in die Variable "String"
      Query = "INSERT INTO `mytable` (wert1,wert2,wert3) VALUES (" + StringField(String,1,";") + ",'" + StringField(String,2,";") + "'," + StringField(String,3,";") + ")"      ;Zerlegen der Felder welche mit ";" getrennt wurden
      DatabaseUpdate(#Database,Query)
    Wend  
    CloseFile(#File)
  EndIf
  CloseDatabase(#Database)
EndIf
Viel Spaß beim Probieren
Wissen schadet nur dem, der es nicht hat !
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Re: SQL Anfänger

Beitrag von HemSA »

Hallole MenschMarkus,
erst mal vielen Dank für deinen Post.

Ich habe ein Problem mit dem ich nicht zurecht komme.

Meine Datei ist TAB getrennt.

Ich machte dein Beispiel dann auch so.
Query = "CREATE TABLE `mytable` (wert1 CHAR,wert2 CHAR,wert3 CHAR)"
Aber nach vielen Änderungen kommt nicht das raus was ich will.

Wie muss diese Zeile aussehen für meinen Fall?
Komme da nicht mit den
+
'
Zeichen klar.
Query = "INSERT INTO `mytable` (wert1,wert2,wert3) VALUES (" + StringField(String,1," ") + "','" + StringField(String,2," ") + "','" + StringField(String,3," ") + ")" ;Zerlegen der Felder welche mit "Tab" getrennt wurden
Vielen Dank im Voraus.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
MenschMarkus
Beiträge: 220
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: SQL Anfänger

Beitrag von MenschMarkus »

OK, ist auch kein Problem. Der Query mit TAB sieht wie folgt aus:

Code: Alles auswählen

Query = "INSERT INTO `mytable` (wert1,wert2,wert3) VALUES ('" + StringField(String,1,Chr(9)) + "','" + StringField(String,2,Chr(9)) + "','" + StringField(String,3,Chr(9)) + ")" ;Zerlegen der Felder welche mit "Tab" getrennt wurden
(Im Menüpunkt Werkzeuge > Zeichentabelle findest du die ASCII Werte für die Character)

Das Hochkomma ' zeigt SQLite an jetzt kommt ein zusammenhängender String z.B. 'text' oder auch 'dies ist ein text'
Diese Zeichen muss innerhalb des Query Strings geschrieben werden wenn anschließend eine PB Variable folgt

Richtig:

Code: Alles auswählen

Query = " ... VALUES ('" + ....

Falsch:

Code: Alles auswählen

Query = " ... VALUES (" + ' ....

Falsch:

Code: Alles auswählen

Query = " ... VALUES ("' +  ....


Die Anführungszeichen " am Ende eines Textes sagen PB: hier hört der Text auf. Mit dem + nach dem abschließenden " weiß PB aber, jetzt folgt noch mehr Information.
Also, Texte mit einem Ergebnis einer Variablen zu verbinden funktioniert immer so

Code: Alles auswählen

text.s = "menschmarkus"
ergebnis.i = 5
gesamttext.s = "Du darfst mich " + text.s + " nennen"
rechnen.s = "Das Ergebnis " + Str(ergebnis) + " kann mit 3 + 2 errechnet werden"
Achte darauf wenn Du eine numerische Variable hast diese mit Str(numvariable) in einen Text umzuwandeln
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQL Anfänger

Beitrag von Kiffi »

Um Stringverknüpfungen lesbarer zu machen, verwende ich persönlich folgende Vorgehensweise:

Code: Alles auswählen

Wert1 = StringField(String, 1, #TAB$)
Wert2 = StringField(String, 2, #TAB$)
Wert3 = StringField(String, 3, #TAB$)

Query = "INSERT INTO `mytable` (wert1, wert2, wert3) VALUES ('" + Wert1 + "', '" + Wert2 + "', '" + Wert3 + "')"
Grüße ... Peter
Hygge
MenschMarkus
Beiträge: 220
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: SQL Anfänger

Beitrag von MenschMarkus »

@Kiffi

klar, geht natürlich auch :)

Die implizite Schreibweise die ich hier verwendet habe hat halt den Vorteil, dass ich weniger Code programmieren muss. Um den Query auch prüfen zu können schreibe ich den Query String auch in die gleichgenannte Variable Query.s
Und Danke für die Anmerkung

LG
menschmarkus
Wissen schadet nur dem, der es nicht hat !
Antworten