SQLite und die SELECT Abfrage

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

SQLite und die SELECT Abfrage

Beitrag von Velindos »

Hallo Leute,
habe folgendes Problem bei der Abfrage der SQLite Datenbank:

Wenn ich die Abfrage starte mit:
[1] If DatabaseQuery(0, "SELECT * FROM Velindos WHERE Zeiger < 7")
Dann bekomme ich die Werte der Datenbank.

Ersetze ich die 7 mit einer Variablen kommen keine Werte der Datenbank, obwohl 7 eingegeben wird:
SuchBaseString = Val (GetGadgetText(#String_DBRecord))
[2] ] If DatabaseQuery(0, "SELECT * FROM Velindos WHERE Zeiger < SuchBaseString ")

Selbiges passiert auch wenn ich
SuchString$ = GetGadgetText(#String_DBRecord) verwende!

Kann mir jemand sagen warum!

Gruss … Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
ALF1965
Beiträge: 8
Registriert: 17.09.2010 16:51
Computerausstattung: Laptop
Wohnort: Lengerich Westf.

Re: SQLite und die SELECT Abfrage

Beitrag von ALF1965 »

Hey, wir sind beide noch nicht so lange dabei... ;-)

Lösung: If DatabaseQuery(0, "SELECT * FROM Velindos WHERE Zeiger < " + SuchBaseString )

So wie Du das gemacht hast, interpretiert PB "SuchBasString" als Spalte der Datenbank, nicht als Variable in Deinem Code.

Gruß Ralf
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: SQLite und die SELECT Abfrage

Beitrag von Velindos »

Hallo Ralf,

du sagst es, fühl mich richtig wie an Anfänger.

Bei der Spalte Zeiger funktioniert die Sache. Wenn ich die Spalte auf Notiz stelle, funktioniert die Sache nicht mehr… Idee!
SuchBaseString$=GetGadgetText(#String_DBRecord)
If DatabaseQuery(0, "SELECT * FROM Velindos WHERE Notiz =" +SuchBaseString$ )

Gruss … Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQLite und die SELECT Abfrage

Beitrag von Kiffi »

Strings müssen in Hochkommata eingeschlossen werden.

DatabaseQuery(0, "SELECT * FROM Velindos WHERE Notiz = '" +SuchBaseString$ + "'")

Und bevor die nächste Frage kommt: Befinden sich in SuchBaseString$ ebenfalls Hochkommata, so müssen sie dupliziert werden. ;-)

SuchBaseString$ = GetGadgetText(#String_DBRecord)
SuchBaseString$ = ReplaceString(SuchBaseString$, "'", "''")
DatabaseQuery(0, "SELECT * FROM Velindos WHERE Notiz = '" +SuchBaseString$ + "'")

(ist aber in Access genauso)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: SQLite und die SELECT Abfrage

Beitrag von Velindos »

Hallo Kiffi!
nicht mein bester Tag, hatte gestern frei, muss erst meine Wolken sammeln.
Danke für die rasche und ausführliche Antwort!!!

Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
ALF1965
Beiträge: 8
Registriert: 17.09.2010 16:51
Computerausstattung: Laptop
Wohnort: Lengerich Westf.

Re: SQLite und die SELECT Abfrage

Beitrag von ALF1965 »

Kiffi hat eh mehr Ahnung als ich. Mir hat er eben meine Woche gerettet... auch in Sachen SQLITE.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: SQLite und die SELECT Abfrage

Beitrag von Velindos »

Hallo,
Habe mir eine SQL Datenbank angelegt mit der Tabelle Notiz und mit den Spalten
(ID(Integer, Aufsteigend), Stichwort(Text), Notiz(Text), Pfad(Text), Bild(Blob))

In meinen Window möchte ich nun die Werte der Datenbank anzeigen und blättern. Hierfür habe ich mir Button (mit Anfang, Ende, Vor, Zurück, Neu, Delete) angelegt.

StringGadget(#String_ID, 200, 105, 30, 20, "ID")
StringGadget(#String_Stichwort, 195, 135, 255, 20, "Stichwort")
StringGadget(#String_Notiz, 195, 170, 255, 20, "Notiz")
StringGadget(#String_Pfad, 195, 385, 255, 20, "Pfad")
ImageGadget(#Image_Bild, 195, 220, 255, 155, Bild, #PB_Image_Border)

Wie verbinde ich meine Gadget mit den Inhalten der Datenbank?

Gruss … Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQLite und die SELECT Abfrage

Beitrag von Kiffi »

Velindos hat geschrieben:Wie verbinde ich meine Gadget mit den Inhalten der Datenbank?
im Gegensatz zu Access oder VB(6) hast Du in PB keine Möglichkeit, Gadgets
an Datenbankfelder zu binden. Du musst also das Auslesen der Werte aus der
Datenbank, das Eintragen in die Gadgets und das Aktualisieren in die Datenbank
bei Änderungen der Werte in den Gadgets selber programmieren.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: SQLite und die SELECT Abfrage

Beitrag von Velindos »

Hallo,
habe mir bereits eine Prozedur geschrieben. Mein Problem ist, die Strings kann ich auf Array geben, jedoch wie mache ich das mit dem Bild?

Procedure DatenbankAnzeigen()
#DatenFILE=0
a=0
Debug DatabaseFile$
If OpenDatabase(#DatenFILE, DatabaseFile$, "", "",#PB_Database_SQLite )
If DatabaseQuery(#DatenFILE, "SELECT * FROM Notiz")

While NextDatabaseRow(#DatenFILE) ; alle Einträge durchlaufen
ID$(a)=GetDatabaseString(0,0)
StringGadget(#String_ID, 200, 105, 30, 20, ID$(a))
Stichwort$(a)=GetDatabaseString(0,1)
StringGadget(#String_Stichwort, 195, 135, 255, 20, Stichwort$(a))
Notiz$(a)= GetDatabaseString(0,2)
StringGadget(#String_Notiz, 195, 170, 255, 20, Notiz$(a))
Pfad$(a)= GetDatabaseString(0,3)
StringGadget(#String_Pfad, 195, 385, 255, 20, Pfad$(a))
;Image= GetDatabaseString(0,4)
;ImageGadget(#Image_Bild, 195, 220, 255, 155, Image, #PB_Image_Border)
Debug a
Debug ID$(a)
Debug Stichwort$(a)
Debug Notiz$(a)
Debug Pfad$(a)
a=a+1
Debug a

Wend
EndIf

FinishDatabaseQuery(#DatenFILE)
EndIf
EndProcedure

Gruss … Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQLite und die SELECT Abfrage

Beitrag von Kiffi »

@Velindos:

Du solltest vorher mal Deinen Code ein wenig sauberer gestalten. Mir ist schon länger
aufgefallen, dass Du mit mehreren überdimensionierten Arrays arbeitest. Das ist nicht
nur speicherbelastend sondern auch fehleranfällig. Außerdem musst Du immer eine
Counter-Variable mit Dir rumschleppen.

Hier mein Vorschlag: Arbeite mit einer strukturierten LinkedList. Dann hast Du alles an
Ort und Stelle und musst Dich nicht mit x Arrays herumschlagen.

Code: Alles auswählen

Structure sData
  ID.s
  Stichwort.s
  Notiz.s
  Pfad.s
EndStructure

Global NewList MyDataList.sData()

Procedure LadeDatenAusDatenbank(DatabaseFile.s)
  
  Protected DB
  
  DB = OpenDatabase(#PB_Any, DatabaseFile, "", "",#PB_Database_SQLite)
  If DB
    If DatabaseQuery(DB, "SELECT * FROM Notiz") 
      While NextDatabaseRow(DB) ; alle Einträge durchlaufen
        
        AddElement(MyDataList())
        
        MyDataList()\ID        = GetDatabaseString(0,0)
        MyDataList()\Stichwort = GetDatabaseString(0,1)
        MyDataList()\Notiz     = GetDatabaseString(0,2)
        MyDataList()\Pfad      = GetDatabaseString(0,3)
        
      Wend
    FinishDatabaseQuery(DB)
    EndIf
    CloseDatabase(DB)
  EndIf
  
EndProcedure


Abgesehen davon ist das Erstellen der Gadgets in Deiner Datenbankschleife
falsch platziert. Lieber so:

Code: Alles auswählen

LadeDatenAusDatenbank(MeineDatenbank)

[...]

OpenWindow(...)

[...]

  ; Ersten Datensatz anzeigen
  FirstElement(MyDataList())

  StringGadget(#String_ID, 200, 105, 30, 20, MyDataList()\ID)
  StringGadget(#String_Stichwort, 195, 135, 255, 20, MyDataList()\Stichwort)
  StringGadget(#String_Notiz, 195, 170, 255, 20, MyDataList()\Notiz)
  StringGadget(#String_Pfad, 195, 385, 255, 20, MyDataList()\Pfad)

[...]
oder so:

Code: Alles auswählen

[...]

OpenWindow(...)

[...]

StringGadget(#String_ID, 200, 105, 30, 20, "")
StringGadget(#String_Stichwort, 195, 135, 255, 20, "")
StringGadget(#String_Notiz, 195, 170, 255, 20, "")
StringGadget(#String_Pfad, 195, 385, 255, 20, "")

[...]

LadeDatenAusDatenbank(MeineDatenbank)

[...]

; Ersten Datensatz anzeigen
FirstElement(MyDataList())

SetGadgetText(#String_ID, MyDataList()\ID)
SetGadgetText(#String_Stichwort, MyDataList()\Stichwort)
SetGadgetText(#String_Notiz, MyDataList()\Notiz)
SetGadgetText(#String_Pfad, MyDataList()\Pfad)

Grüße ... Kiffi
a²+b²=mc²
Antworten