wie kann ich denn in eine SQLite-Datenbank einen Datensatz einfügen? Bisher versuche ich über InsertSQL einen Datensatz einzufügen, indem ich einen SQL-Befehl losschicke. Es kommt aber dummerweise nix an..
qlang.Active:=false;
qlang.InsertSQL.Clear;
qlang.InsertSQL.Add('insert into lang (r,d,e,f) values ("test1","test2","test3","test4")');
qlang.Active:=true;
qlang.Insert;
karkov hat geschrieben:wie kann ich denn in eine SQLite-Datenbank einen Datensatz einfügen? Bisher versuche ich über InsertSQL einen Datensatz einzufügen, indem ich einen SQL-Befehl losschicke. Es kommt aber dummerweise nix an..
Ich kenne die Komponenten nicht, die du da verwendest: also bitte einmal den Debugger einsachalten und bis zu den SQLite-API-Aufrufen (mindestens sqlite3_prepare() und sqlite_step()) herunter debuggen und die Statuscodes, die zurückgeliefert werden, notieren.
karkov hat geschrieben:qlang.InsertSQL.Add('insert into lang (r,d,e,f) values ("test1","test2","test3","test4")');
Die Verwendung der Anführungszeichen ist nicht unbedingt das, was SQLite unter SQL-Standard versteht, da die Bibliothek aber dahingehend sehr tolerant ist, dürfte der Fehler nicht an dem Statement liegen (sieht richtig aus). Was du natürlich noch überprüfen kannst:
Existiert die Tabelle "lang" in der richtigen Definition?
Verwendest du die Komponenten so, wie es sich der Autor gedacht hat?
Werden die Transaktionen ggf. erst zwischengespeichert, sodass sie am Ende noch in übernommen werden müssen?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
mit execSQL klappt es auch nicht.
Das einzige, was geholfen hat war:
sqllite3conn.ExecuteDirect('insert into lang (r,d,e,f) values (test1,test2,test3,test4);');
Das ganze speichert aber leider bisher nur während der Sitzung ab. Wie schließe ich denn meine Transaktion ordentlich ab, damit meine Daten in der Datenbank bleiben? closetransaction und ähnliche Befehle haben bisher gar nicht geklappt...
procedure TDM.ExecThisSQL(mySQL: String; Autocommit: Boolean=True);
begin
try
if AutoCommit then con1.Transaction.Commit;
myExecQuery1.Close;
myExecQuery1.SQL.Clear;
myExecQuery1.ParseSQL:=True;
myExecQuery1.ReadOnly:=False;
myExecQuery1.SQL.Text:=(mySQL);
myExecQuery1.Transaction.Active:=True;
myExecQuery1.ExecSQL;
if AutoCommit then con1.Transaction.Commit;
myExecQuery1.ParseSQL:=False;
myExecQuery1.ReadOnly:=True;
myExecQuery1.close;
except on e:exception do
begin
Showmessage('Fehler in DM.ExecThisSQL [SQL:'+mySQL+']: '+e.message);
raise;
end;
end;
end;
Über das über die Eigenschaft SQL mit execSQL liefert er bei mir nur bei Select-Anweisungen Resultate. Insert und Ähnliches liefern Fehler, dass nur SQL-Anweisungen gestattet sind. Übrigens auch bei InsertSQL. Ich glaube bei SQLite muss man scheinbar wirklich direkt über die connection gehen. Nur dann weiß ich nicht, wie ich die Transaction abschließen kann, dass es in der Datenbank bleibt, auch nachdem ich das Progi beendet habe..
Ich komme von Delphi, möchte aber aus verschiedenen Gründen mal versuchen, mit Lazarus kleinere Projekte umzusetzen.
Einiges klappt gut, einiges ist etwas ungewohnt aber einiges bekomme ich einfach nicht hin, u.a. eben das aus dem Betreff.
In D2010 (und davor) habe ich de facto folgendes Szenario gehabt (simplifiziert):
Ich zog auf die Oberfläche
- eine Oracle- Connection (ODAC- Klassen, nativer Zugriff)
- eine Table- Komponente (ebenda)
- eine Datenquelle (u.a. auch da)
- ein DB- Grid
- einen DB Navigator
Dann habe ich das alles miteinander verheiratet und konnte fleißig in meinen Daten editieren, anfügen, löschen ...
Nun habe ich versucht, ähnliches für SQLite mittels Lazarus zu probieren
- SQL3- Connection
- Transaktion (weil er die haben wollte)
- Query- Komponente
- Datenquelle
- ein DB- Grid
- einen DB Navigator
Ich kann mir die Datensätze auch ansehen, insofern funktioniert es. Ich kann auch im DB- Grid was ändern und das sieht auch aus, als wenn das klappt.
Aber sobald ich die Query schließe und wieder öffne, ist alles wie vorher.
Ich habe alles ausprobiert, was ich hier in diesem Forum finden konnte. Ich habe auf alle erdenklichen Arten versucht, ein Commit herbeizuführen - teilweise hat er mir dabei dann die Query deaktiviert - ich habe nichts erreicht.
Daher hier meine konkreten Fragen:
- Wozu ist das Transaktionsobjekt und wie benutzt man es (Was eine Transaktion auf DB- Ebene ist, das weiß ich wohl, aber ich weiß nicht, wie ich mittels dieses Objektes SavePoints, Commits oder Rollbacks realisiere)
- Ist das obene beschriebene Delphi-Szenario so übertragbar?
- Gibt es eine Art Tutorial? Die Einzelkomponenten zusammenzufügen hat sich irgendwie als nicht gangbar erwiesen (bzw. ich habe das Zusammenspiel nicht durchschaut)
Herzlichen Dank
AM
ps: Ich habe einiges über ZEOS gelesen, wollte aber eigentlich ohne auskommen. Kann ich oder sind die Vorteile zu groß, um sie zu ignorieren?
<tsqlqueryinstance>.active:= true; //starts transaction, fetches data from DB server
<tsqlqueryinstance>.edit; //activates edit buffer
<tsqlqueryinstance>.post; //moves data from edit buffer into local buffer
<tsqlqueryinstance>.applyupdates; //writes edited data to the DB server
<tsqltransactioninstance>.commit; //commits the transaction
edit und post übernimmt ja der navigator, aber das ApplyUpdates, das muss anscheinend ich übernehmen, dann klappt es.
Das Commit der Transaktion scheint dabei mit abzulaufen, möglicherweise ein Ergebnis irgendeiner Einstellung der selben.
Ich baue es also noch mal von vorn auf und schaue, ob es dann funktioniert.
am2 hat geschrieben:
Das Commit der Transaktion scheint dabei mit abzulaufen, möglicherweise ein Ergebnis irgendeiner Einstellung der selben.
Das gibt es bei FPC SQLDB soviel ich weiss nicht. Die MSEgui Version hat die Optionen in tdscontroller.options dso_autoapply und dso_autocommit/dso_autocommitretaining. Falls aktiviert, lässt sich mit SQL-DB's wie mit lokalen Datenbanken arbeiten.