Socke hat geschrieben:mse hat geschrieben:Benutze "TSqlQuery.ExecSQL()" statt "Active".
Kannst du die die Variante mit ExecSQL() ein wenig ausführlicher fassen? Ich bin mit SQLdb noch nicht so vertraut.
In MSEgui verwende ich dafür tsqlstatement. IIRC kann man bei FPC TSQLQuery in die SQL Property das gewünschte SQL-Statement eintragen (auch zur Entwurfszeit) und mit TSQLQuery.ExecSQL() ausführen lassen. Dabei wird kein Datenpuffer angelegt, auch insert durch ApplyUpdates() ist natürlich nicht möglich.
Also z.B.
Code: Alles auswählen
insert into personen (id,name,vorname) values (:id,:name,:vorname);
mse hat geschrieben:Wenn du das automatisch erzeugte insert-statement verwenden möchtest, füge im SQL-query Statement eine WHERE-Klausel an welche keine Daten zurückliefert, z.B WHERE 1 = 2.
Ich hatte die Abfrage 'SELECT id, name, vorname FROM personen LIMIT 0' (um bei Michls Demo-Programm zu bleiben) verwendet. Nach meinem Empfinden ist ein solche Abfrage sinnlos und gehört gestrichen. Gibt es hier eine Möglichkeit, die SQL-Query entsprechend zu Initialisieren, sodass trotzdem INSERTs möglich sind?
An sich ist es mir egal, wo das INSERT-Statemen herkommt. Falls möglich/notwendig gebe ich das auch gerne vor.
Die LIMIT Klausel kann ziemlichen Aufwand im Server bedeuten, da die ganze dem query entsprechende Datenmenge aufbereitet und sortiert wird. Es werden dann von der bereitgestellten Menge die gewünschte Anzahl Datensätze auf die Leitung gegeben. Ich weiss nicht, ob LIMIT 0 im Server als abgekürzter Spezialfall behandelt wird.
Die query mit dem dummy-WHERE dient dazu um im Dataset die benötigten Felder zu erzeugen und die Arbeit mit TDataset.Insert(),Post() oder den entsprechenden GUI-Aktionen und TSQLQuery.ApplyUpdates() zu ermöglichen.
Falls man nicht das automatisch erzeugte insert statement verwenden möchte kann man den gewünschten SQL-Text in TSQLQuery.SQLInsert schreiben.
Geht es hier immer noch um LAST INSERT ID? Dann kann man auch wenn die verwendete Datenbank RETURNING unterstützt
Code: Alles auswählen
insert into personen (id,name,vorname) values (:id,:name,:vorname) returning id;
in TSQLQuery.SQL schreiben, ParseSQL auf false und TSQLQuery.Active true setzen. Die von der DB erzeugte id steht dann im Feld "id" des Dataset.
MSEgui frischt Felder mit gesetztem of_refreshinsert, of_refreshinsert in optionsfield über diesen Weg automatisch auf, primary key fields mit autoinc werden ebenfalls automatisch via LAST INSERT ID aufgefrischt. AFAIK macht dies FPC Sqldb nun ebenfalls.
Socke hat geschrieben:Da die vorhandene Methode TConnectionName.GetInsertID (am Beispiel MySQL) nicht virtuell ist, kann sie auch nicht über die VMT bzw. die Methode TObject.MethodAddress nicht gefunden werden.
Habt ihr Lösungsvorschläge?
Code: Alles auswählen
if connection is tmysql55connection then begin
theid:= tmysql55connection(connection).getinsertid;
end
else begin
if connection is tmysql51connection then begin
theid:= tmysql51connection(connection).getinsertid;
...