(Verständnis)Problem mit SQLite3

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
MvD-Service
Beiträge: 8
Registriert: 23.11.2007 00:36

(Verständnis)Problem mit SQLite3

Beitrag von MvD-Service »

Hallo zusammen,

ich bin sicher - nein ich weiß es liegt an meinem mangelden Verständnis für Datenbanken..... ABER, ich möchte einige meiner Programme für den Betrieb mit SQLite3 umschreiben. Bisher habe ich immer einfache Textfiles genutzt, das soll sich nun ändern - fragt sich nur wie.... :(

Ich nutze die SQLite3_Include.pbi mit der sqlite3.dll und habe mir schon einige male die Demo dazu angesehen und finde meinen Denkfehler trotzdem nicht.



Folgendes sollte eigentlich geschehen:

* Ich möchte einen Table erstellen der 5 Spalten hat - klappt auch soweit.
* Möchte diese Spalten Reihe für Reihe füllen können - das klappt nicht (1. Reihe ist I.O. 2. Reihe: Eintrag für erste Spalte steht immer in Spalte 2..!! Bei dritter Reihe in 3.Spalte usw.) ? :?
* Zum guten Schluß würde ich die Datenbankinhalte gerne in einem 5 Spaltigen ListIconGadget ausgeben wollen.

Würde mir bitte jemand eine Anregung in Form eines Codeschnipsels oder einer Aufzählung der zu nutzenden Befehle geben - bevor ich mir gleich meine letzten Haare ausgerissen habe...

Ich danke Euch schon jetzt für Eure Hilfe

Michael
My programs never have bugs, they just create random features....
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Re: (Verständnis)Problem mit SQLite3

Beitrag von scholly »

MvD-Service hat geschrieben:Möchte diese Spalten Reihe für Reihe füllen können - das klappt nicht (1. Reihe ist I.O. 2. Reihe: Eintrag für erste Spalte steht immer in Spalte 2..!! Bei dritter Reihe in 3.Spalte usw.) ?
Wenn Du Deinen Code hier einstellst, könnte man daran vielleicht den Fehler erkennen/erklären/abstellen.

baw... scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
MvD-Service
Beiträge: 8
Registriert: 23.11.2007 00:36

Beitrag von MvD-Service »

Ich traue mich ja fast gar nicht diesen Spaghetticode hier zu posten, aber natürlich hast Du Recht. Ich habe den Code mal so dahingetippt und teile aus der Demo verwendet ohne alles wirklich genau verstanden zu haben....

Also dann:

Code: Alles auswählen

anlegen:
CloseWindow(#Window_0)
Open_Window_1()

Repeat
    EventID = WaitWindowEvent()
  If EventID = #PB_Event_Gadget
    Select EventGadget()
      Case 6
      kursnummer = LSet(UCase(GetGadgetText(0)),10)
      kursbezeichnung = LSet(GetGadgetText(1),10)
      anzahl = LSet(GetGadgetText(2),5)
      benutzer = user$
      form$= "%dd.%mm.%yyyy"
      wann = FormatDate(form$,Date())
      CloseWindow(#Window_1)
      Open_Window_0()
      Gosub schreiben:
      Break
      
      Case 7
      CloseWindow(#Window_1)
      Open_Window_0()
      Break
      
    EndSelect
  EndIf
ForEver
Return    

schreiben:
Table.SQ3_TABLEMAP
SQliteGetTable(hDB, "SELECT * FROM " +SZ+ " ", Table)
If SQliteExecute(hDB,"INSERT INTO " +SZ+ " (Kursnummer, Kursbezeichnung, Anzahl, Geaendert, Datum) VALUES ('" + kursnummer + "', '"+ kursbezeichnung + "', '" + anzahl + "', '" + benutzer + "', '" + wann +"')") = #False
      Debug SQliteErrorMsg(hDB)
    EndIf
Return
Für jeden Eintrag wird dieser Teil durchlaufen.

Anzeigen lasse ich es (noch) so:

Code: Alles auswählen

ClearGadgetItemList(#ListIcon_0)
Table.SQ3_TABLEMAP
SQliteGetTable(hDB, "SELECT * FROM " +SZ+ " ", Table)
If Table
 SQLiteResetPos(Table)
  While SQLiteNextRow(Table) : i + 1
    SQLiteNextCol(Table)
    inhalt0$ = SQLiteValue(Table) :Debug inhalt0$
    SQLiteNextCol(Table)
    inhalt1$ = SQLiteValue(Table) :Debug inhalt1$
    SQLiteNextCol(Table)
    inhalt2$ = SQLiteValue(Table) :Debug inhalt2$
    SQLiteNextCol(Table)
    inhalt3$ = SQLiteValue(Table) :Debug inhalt3$
    SQLiteNextCol(Table)
    inhalt4$ = SQLiteValue(Table) :Debug inhalt4$
    AddGadgetItem(#ListIcon_0, z, inhalt0$ +Chr(10)+ inhalt1$ +Chr(10)+ inhalt2$ +Chr(10)+ inhalt3$ + inhalt4$)
    z +1
  Wend
EndIf
SQLiteFreeTable(Table)
Return
So, bevor ich jetzt gesteinigt werde, stelle ich mich schon mal in die Ecke und schäme mich....
My programs never have bugs, they just create random features....
Benutzeravatar
MvD-Service
Beiträge: 8
Registriert: 23.11.2007 00:36

Beitrag von MvD-Service »

Habe jetzt gemerkt das es nicht am schreiben der Datensätze lag, sondern an der Abfrage...

Ich mache das jetzt so:

Code: Alles auswählen

liste:
z=0
ClearGadgetItemList(#ListIcon_0)
Table.SQ3_TABLEMAP
SQliteGetTable(hDB, "SELECT * FROM " +SZ+ " ", Table)
If Table
 SQLiteResetPos(Table)
   SQLiteSelectCol(Table, 0)
   SQLiteSelectRow(Table, 0)
  While SQLiteNextRow(Table)
    SQLiteNextCol(Table)
    inhalt0$ = SQLiteValue(Table)
    SQLiteNextCol(Table)
    inhalt1$ = SQLiteValue(Table)
    SQLiteNextCol(Table)
    inhalt2$ = SQLiteValue(Table)
    SQLiteNextCol(Table)
    inhalt3$ = SQLiteValue(Table)
    SQLiteNextCol(Table)
    inhalt4$ = SQLiteValue(Table)
    SQLiteNextCol(Table)
    AddGadgetItem(#ListIcon_0, z, inhalt0$ +Chr(10)+ inhalt1$ +Chr(10)+ inhalt2$ +Chr(10)+ inhalt3$ + inhalt4$)
    z +1
  Wend
EndIf
SQLiteFreeTable(Table)
Return
Die Ausgabe erfolgt in einem 5 Spaltigen ListIconGadget. Das soll auch so sein aber, ich bin sicher dafür gibt es eine elegantere Programmier Lösung....
Kann mir da mal jemand auf die Sprünge helfen?
My programs never have bugs, they just create random features....
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

MvD-Service hat geschrieben:Ich mache das jetzt so:
ok, hier ein paar Verbesserungsvorschläge:

* Nimm SQLiteColValue() zum Auslesen der Datenbankfelder. Hier kannst
Du direkt das Feld angeben, das ausgelesen werden soll. Damit ersparst
Du Dir SQLiteNextCol()

* SQLiteResetPos(), SQLiteSelectCol() und SQLiteSelectRow() vor der
While-Schleife kannst Du weglassen. Nachdem Du SQLiteGetTable()
ausgeführt hast, steht der Datenzeiger initial sowieso auf Zeile 0 und
Spalte 0.

* 'z' brauchst Du nicht mitzuzählen. Verwendest Du den Parameter -1 bei
der Zeilenangabe im ListIconGadget, so wird die hinzuzufügende neue
Zeile immer an das Ende der Liste angefügt.

* Verschieb das SQLiteFreeTable() direkt in die "If Table"-Abfrage (also in
Deinem Fall hinter das "Wend").

* Zwischen inhalt3$ und inhalt4$ ist kein Spaltentrennzeichen angegeben.
Da Du von 5 Spalten schriebst, habe ich das mal in dem Code unten
ergänzt.

Hier noch mal der Code, so wie ich ihn schreiben würde:

Code: Alles auswählen

ClearGadgetItemList(#ListIcon_0)
Table.SQ3_TABLEMAP
SQliteGetTable(hDB, "SELECT * FROM " +SZ+ " ", Table)
If Table
  While SQLiteNextRow(Table)
    inhalt0$ = SQLiteColValue(Table, 0)
    inhalt1$ = SQLiteColValue(Table, 1)
    inhalt2$ = SQLiteColValue(Table, 2)
    inhalt3$ = SQLiteColValue(Table, 3)
    inhalt4$ = SQLiteColValue(Table, 4)
    AddGadgetItem(#ListIcon_0, -1, inhalt0$ + #LF$ + inhalt1$ + #LF$ + inhalt2$ + #LF$ + inhalt3$ + #LF$ + inhalt4$)
  Wend
  SQLiteFreeTable(Table)
EndIf
Zu einem früheren Posting von Dir:
MvD-Service hat geschrieben:

Code: Alles auswählen

schreiben:
Table.SQ3_TABLEMAP
SQliteGetTable(hDB, "SELECT * FROM " +SZ+ " ", Table)
If SQliteExecute(hDB,"INSERT INTO " +SZ+ " (Kursnummer, Kursbezeichnung, Anzahl, Geaendert, Datum) VALUES ('" + kursnummer + "', '"+ kursbezeichnung + "', '" + anzahl + "', '" + benutzer + "', '" + wann +"')") = #False
      Debug SQliteErrorMsg(hDB)
    EndIf
Return 
Vor dem SQliteExecute() brauchst Du kein SQliteGetTable() auszuführen.
SQliteGetTable() benötigt man nur dann, wenn man Daten aus der
Datenbank lesen will. Hier willst Du ja lediglich in die Datenbank schreiben.
MvD-Service hat geschrieben:

Code: Alles auswählen

schreiben:
If SQliteExecute(hDB,"INSERT INTO " +SZ+ " (Kursnummer, Kursbezeichnung, Anzahl, Geaendert, Datum) VALUES ('" + kursnummer + "', '"+ kursbezeichnung + "', '" + anzahl + "', '" + benutzer + "', '" + wann +"')") = #False
      Debug SQliteErrorMsg(hDB)
    EndIf
Return 
Kleiner Tipp noch: Über kurz oder lang solltest Du Dir angewöhnen Gosub
zu vermeiden und anstelle dessen mit Prozeduren zu arbeiten.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
MvD-Service
Beiträge: 8
Registriert: 23.11.2007 00:36

Beitrag von MvD-Service »

DAAANKE Kiffi !!!

DAS ist genau das, was ich jetzt gebraucht habe.... Bild

Wenn man Deine Tipps gelesen hat wird so manches klar. Man fragt sich dann "Warum komme ich da nicht selber drauf?" und "Warum mache ich es mir so kompliziert?" Bild

Nochmals Danke (ehrfürchtig verneig) Bild
Hab eine gute Zeit...

EDIT:
Wo liegt der Vorteil von Prozeduren - im vergleich zu Subroutinen ?
Klar, der Code wird übersichtlicher (kann man von mir noch nicht behaupten...) aber sonst....? Wie Du unschwer erkennen konntest, habe ich es noch nicht mal richtig drauf einen Code 'universell' zu gestalten, mir fällt immer nur eine spezielle Lösung ein.... ABER, ich bleibe dran !
My programs never have bugs, they just create random features....
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

MvD-Service hat geschrieben:Wo liegt der Vorteil von Prozeduren - im vergleich zu Subroutinen ?
Guck Dir mal diesen Thread an oder suche nach beiden Begriffen.
Aus den verschiedenen Standpunkten kannste Dir dann Deine eigene Meinung bilden ;)

baw... scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
MvD-Service
Beiträge: 8
Registriert: 23.11.2007 00:36

Beitrag von MvD-Service »

Ich habe mich da jetzt mal fast zwei Tage 'reingefuchst' und es klappt...

Vielen Dank für Eure schnelle Hilfe :allright: - aber macht Euch keine Hoffnungen, noch seid Ihr mich bestimmt nicht los.... :wink:

@Scholly: Danke, hab' den Vorteil von Prozeduren eingesehen - obwohl der Thread ja zeigt das es sich dabei fast um einen 'Glaubenskrieg' handelt.... :o
My programs never have bugs, they just create random features....
Antworten