Seite 1 von 4

SQLite und die SELECT Abfrage

Verfasst: 30.11.2010 13:55
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

Re: SQLite und die SELECT Abfrage

Verfasst: 30.11.2010 14:06
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

Re: SQLite und die SELECT Abfrage

Verfasst: 30.11.2010 14:34
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

Re: SQLite und die SELECT Abfrage

Verfasst: 30.11.2010 14:53
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

Re: SQLite und die SELECT Abfrage

Verfasst: 30.11.2010 15:07
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

Re: SQLite und die SELECT Abfrage

Verfasst: 30.11.2010 16:20
von ALF1965
Kiffi hat eh mehr Ahnung als ich. Mir hat er eben meine Woche gerettet... auch in Sachen SQLITE.

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 10:36
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

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 10:42
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

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 11:10
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

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 12:24
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