Anfngerfrage: DB ffnen / Beispiele

Hallo, ich hatte die verwegene Idee, mich mehr als 20 Jahre nach dBase, Clipper, dbFast und Foxpro mal wieder an einem kleinen, individuellen DB-Tool zu versuchen. Da die oben genannten Entwicklungswerkzeuge ja schon lange nicht mehr existieren, erinnerte ich mich RealBasic, das mir bei einer ersten, flüchtigen Begegnung vor Jahren den Eindruck vermittelt hatte, für den Zweck geeignet zu sein. Also einfach mal runtergeladen und ausprobiert. Allerdings scheitere ich schon an grundlegenden Dingen wie dem Öffnen einer Datenbankdatei.

Da ich mit den englischsprachigen Ressourcen wenig anfangen kann, habe ich kurzerhand mal bei den mitgelieferten Beispielen gestöbert, ob ich aus denen was übernehmen, verstehen und ggf. abwandeln kann.

Es gibt da auch eine Anwendung namens SQLiteBackup, die augenscheinlich auf eine ebenfalls mitgelieferte Datenbank namens EddiesElectronics.sqlite zugreift:

Dim dbFile As FolderItem
dbFile = GetFolderItem(“EddiesElectronics.sqlite”)

Lasse ich das Programm laufen, stoppt es allerdings immer mit der Fehlermeldung

“Could not find EddiesElectronics.sqlite file.”

Die Datei liegt im selben Verzeichnis wie die Anwendung.

Woran liegt’s? An mir? An der Anwendung? Der Datei? Sollte ich es lieber gleich ganz lassen, wenn ich nicht mal das verstehe?

Über Tipps/Hinweise würde ich mich freuen.

Hallo Axel,
du findest weiter unten im Navigator einen CopyFiles-Buildstep. Dem ist wohl die Zuordnung zur Datei durcheinandergekommen – wenn du da reinklickst, wird dir die Datenbank als fehlend angezeigt.
Lösche einfache diese rote Zeile und ziehe die von dir gefundene EddiesElectronics.sqlite in den Buildstep. Dann wird die Datenbank beim Start des Programms kopiert und die Demo läuft.
Sollte es nicht klappen, gib gerne Bescheid, dann korrigiere ich das Projekt manuell und schick dir einen Downloadlink.

Hallo Ulrich, danke, dass du dich meines vermutlich absurd banal anmutenden Problems angenommen hast. Ich musste zwar erst mal ein wenig suchen (und interpretieren), aber es hat tatschlich geklappt.

Meinem Verstndnis der Vorgnge zum ffnen einer Datenbankdatei war das allerdings nicht eben frderlich. Scheint doch alles 'n Zacken komplizierter zu sein als ich das von frheren Tools in Erinnerung habe. Ich werde trotzdem mal versuchen, das auf meine Datenbank zu bertragen. Vielleicht komme ich ja doch noch zu einem Erfolgserlebnis. :wink:

Frag gerne nach! Ich bin selbst gerade dabei, mich ein Stückchen mehr in SQLite reinzufinden, und habe eine kleine Erweiterung in Arbeit, die – so alles klappt – die Arbeit mit SQLite ein wenig Filemakiger machen soll: Man platziert einfach Controls auf dem Bildschirm, registriert diese auf einen Recordset, und Aktualisierungen laufen dann automatisch.

Das klingt nach einer guten Idee. Und beantwortet neben auch meine Frage, ob es tatschlich keine Steuerelemente fr einfache DB-Operationen gibt (weil ich keine gefunden hatte).

Danke auch fr das Angebot des Nachfragens. Gut mglich, dass ich darauf zurckkomme. Denn inzwischen habe ich die erste (kleine) Hrde, das ffnen der Datenbank und Darstellung der Datenstze in einem Listfeld, bersprungen, werde also erst mal dran bleiben und schauen, was noch so geht (man freut sich ja schon ber Kleinigkeiten).

Bis hierher aber schon mal: Danke!

PS: Bist du der mit dem Blog und den Videos auf Youtube? (Fiel mir gerade so auf.)

bersprungen meinst du im Sinne von berwunden? Das freut mich! Das Handling mit Recordsets ist ein wenig ungewhnlich eigentlich hat man ja eine Array-Struktur vor sich, aber statt ber den Index ein Element zu adressieren muss man mit den MoveTo-Befehlen hantieren. Und anstatt die Daten direkt als property auszulesen muss man sie ber Field und Value adressieren. Das irritiert m.E. erst mal recht grndlich. Wenn ich mir das so berlege, wre vielleicht eine Recordset-Subklasse auch frderlich, um das Datenhandling zu vereinfachen. Ich werd mal drber meditieren!

Und ja, der bin ich.

Viele Gre
Uli

Herzlich willkommen zu Xojo!

Zum Datenbank-Handling strickt sich wohl jeder etwas selbst. Die einzige Klasse dafür, die ich kenne ist die hier: http://www.bkeeney.com/rbinto/activerecord/ .

Hallo allerseits, ich setze das einfach mal hier mit rein …

Nach mehrwöchiger Pause habe ich mich heute wieder an mein kleines Xojo-Projekt begeben. Was bisher geschah: Anwendungsfenster mit mehreren Listboxen, die jeweils mit Daten aus verschiedenen Tabellen einer Datenbank befüllt werden. Soweit, so gut.

Jetzt wollte ich den nächsten Schritt gehen und in der ersten Listbox einen Datensatz hinzufügen. Als Basis habe ich mich dazu wieder einer Action aus dem “Bundesliga-Projekt” von Ulrich bedient und diese bei den Bezeichnungen geringfügig angepasst. So sieht das Ergebnis aus:

[code]Dim SQL as String = “INSERT INTO Clients (CLT_Label) VALUES (‘Neuer Auftraggeber’)”
DB.SQLExecute (SQL)

If not FehlerDB then
dim ID as Integer = DB.LastRowID
LadeClients

Dim Zeile as Integer = -1
Do
  Zeile = Zeile +1
  loop until ListClients.rowtag(Zeile).IntegerValue = ID

ListClients.EditCell (Zeile, 0)

End If
[/code]

Starte ich das Programm, bekomme ich allerdings eine Fehlermeldung zu der Loop-Zeile: “OutOfBoundsException”

Hat jemand eine Ahnung, woran das liegen könnte? Außer dem Namen der Listbox ist nichts geändert. (Falls weitere Infos benötigt werden: welche?)

Für Tipps und Hinweise wäre ich dankbar.

Du hast keine Abbruchbedingung für den Do-Loop für den Fall das ListClients.rowtag(Zeile).IntegerValue nie gleich ID ist.

Sowas in der Art (nicht getestet):

Dim Zeile As Integer = -1 Do Zeile = Zeile +1 Loop Until ( ListClients.RowTag(Zeile).IntegerValue = ID ) Or ( Zeile + 1 > ListClients.ListCount - 1 )

Allerdings ist dann Zeile möglicherweise ungültig und Du solltest ListClients.EditCell (Zeile, 0) nicht aufrufen.

Das wre wahrscheinlich die bessere Lsung:

[code]Dim zeile As Integer = -1

For i As Integer = 0 To ListClients.ListCount - 1
If ListClients.RowTag(i).IntegerValue = ID Then
zeile = i
Exit
End
Next

If zeile > -1 Then
ListClients.EditCell(zeile, 0)
End[/code]

Hallo Eli, danke sehr, Die erste Lösung funktioniert. Es wird ein neuer Eintrag erstellt und markiert, so dass der Inhalt editiert werden kann.

Die zweite Variante hingegen erzeugt zwar auch einen neuen Eintrag, der aber nicht markiert wird und sich auch nicht editieren lässt.

Aber für’s Fortkommen genügt ja, dass die erste Variante funktioniert.

Nochmals vielen Dank!

Das ist korrekt. Es steht ja das hier:

If zeile > -1 Then ListClients.EditCell(zeile, 0) End
Was bedeutet, dass nur wenn ein RowTag mit der ID übereinstimmt wird EditCell ausgeführt.

Ich stehe mal wieder auf dem Schlauch.

[code]Dim SQL as String = "INSERT INTO TabelleA (NAME) VALUES ('"+TextField1.Text+"')" 
DB.SQLExecute (SQL)[/code]

Wenn ich die Tabelle dann neu einlese und in der Listbox anzeigen lasse, ist der neue Eintrag dort vorhanden - wird aber nicht dauerhaft in der DB gespeichert. Was fehlt dazu noch? Ich habe stundenlang die Dokumentation durchforstet und unzhlige Beispielprojekte geffnet, bin dabei aber leider auf keine (nachvollziehbare) Lsung gestoen.

Himmel, einen Datensatz speichern! Das kann doch eigentlich nicht so kompliziert sein …

Bin fr jeden Tipp dankbar.

Hallo Axel,

da du ja schriebst, dass du dein Projekt auf dem Tutorial aufgebaut hast: Wo speicherst du die Datenbank denn hin? Wenn ich mich recht entsinne, hat das Tutorialprojekt einfach jedesmal eine neue DB ins Bundle kopiert. Das darf unter Realbedingungen natürlich nicht sein, sonst wird ja nichts permanent gespeichert.

Hallo Ulrich,

ich habe nicht 1 zu 1 irgendwelche Beispieldateien kopiert, sondern relevant erscheinende Codefragmente genommen und angepasst. Unter anderem auch aus deinem “Bundesliga”-Beispiel (siehe Blog). Meine DB-Datei (per DB Browser vorab mit Testdaten befüllt) liegt im selben Verzeichnis wie die Anwendung. Ich öffne sie mit …

[code]DIM dbDatei AS FolderItem
dbDatei = GetFolderItem(“dateiname.sqlite”)

DB = New SQLiteDatabase
DB.DatabaseFile = dbDatei
[/code]

Der Gedanke mit der Kopie war mir auch schon gekommen, aber ich erkenne eben keine grundlegenden Unterschiede.

[code]Dim SQL as String = “INSERT INTO TabelleA (NAME) VALUES (’”+TextField1.Text+"’)"
DB.SQLExecute (SQL)

If DB.Error Then
MsgBox DB.ErrorMessage // Fehler. Insert hat nicht geklappt
Else
MsgBox Str(DB.LastRowID) // Insert war erfolgreich
End[/code]

Die Nummer des letzten Datensatzes wird korrekt ausgegeben.

Dann ersetze die Zeile

MsgBox Str(DB.LastRowID)   // Insert war erfolgreich

mit

DB.Commit()

DB.Commit hatte ich auch schon versucht. Hab’s jetzt noch mal wie vorgeschlagen eingebaut, ndert aber nichts.

Trotzdem vielen Dank fr die Bemhungen zu spter Wochenendstunde!

Interpretiere ich eure Antworten denn richtig, dass der Code grundstzlich eigentlich so funktionieren und die Daten ohne weiteres in der DB speichern msste?

Das wrde mich immerhin emotional ein Stck weiter bringen, da ich ja schon am Prinzip gezweifelt habe. Und ich knnte das Problem morgen mal etwas groflchiger beschreiben.

When LastRowID größer als -1 ist, dann sind sie gespeichert. Kannst Du mal den Code mit dem SQLSelect und dem Füllen der Listbox posten?