Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SDAC insert geräteübergreifend Delphi 10.2.3. (https://www.delphipraxis.net/197739-sdac-insert-geraeteuebergreifend-delphi-10-2-3-a.html)

jangbu 31. Aug 2018 18:21

Datenbank: MS-SQL • Version: 2014 • Zugriff über: SDAC

SDAC insert geräteübergreifend Delphi 10.2.3.
 
Hallo,
es gelingt mir nicht mit MSConnection + MSQuery in meiner Android-App auf MS-SQL zu schreiben. Es wird nur ein Datensatz mit NULL-Werten erzeugt also die FieldByName Zuweisung wird ignoriert? Unter WIN10 funktioniert das wie immer. Select funktioniert aber unter Windows und Android-App?

Delphi-Quellcode:
MSQuery1.Close;
MSQuery1.SQL.Clear;
sql_str := 'select * from tab1';
MSQuery1.SQL.Add(sql_str);
MSQuery1.Open;
try
   MSQuery1.Append;
   MSQuery1.FieldByName('cnt').AsInteger := _cnt;
   MSQuery1.Post;
   MSQuery1.Close;
except
  on E: Exception do
  begin
     ShowMessage('Fehler bei insert: ' E.ClassName + ' ' + E.Message);
     MSQuery1.Close;
   end;
end;
Jemand ne Idee wie ich mit SDAC in den SQL-Server schreiben kann?

hoika 31. Aug 2018 19:29

AW: SDAC insert geräteübergreifend Delphi 10.2.3.
 
Hallo,
warum kein einfaches

SQL.Add('Insert Into tab1)

Was soll das Select * from tab1 und das Open/Append?

jangbu 1. Sep 2018 10:09

AW: SDAC insert geräteübergreifend Delphi 10.2.3.
 
Nun ja, ich muss doch erst was selectieren bevor ich was anhängen kann.
Nur meine ich ist es übersichtlicher mit FieldByName := ... den Feldern Daten zuzuweisen. Unter Windows funktioniert das ja auch alles aber warum nicht unter Android?

Query.Close;
Query.SQL.Text := 'select * from demo where 1=0;';
Query.Open;
Query.SQLInsert.Text := 'INSERT Into Demo (demo.wert1) VALUES (12);';
Query.Insert;
Query.Post;

Werde mal anstatt der Zuweisung
MSQuery.FieldByName('cnt').AsSinteger := 1
die Daten direkt in das Insert-Statement packen. Wo ist da eigentlich der Unterschied?
Query.SQLInsert.Text := 'INSERT Into tab (cnt) VALUES (1)';

Delphi.Narium 1. Sep 2018 18:23

AW: SDAC insert geräteübergreifend Delphi 10.2.3.
 
Für ein Insert muss man nichts selektieren. Insert ist ein SQL-Befehl zum Einfügen von Daten.
Delphi-Quellcode:
query.sql.Text := 'INSERT Into tabellenname (Spaltename) VALUES (wert);';
query.ExecSQL;
https://www.w3schools.com/sql/sql_insert.asp

himitsu 1. Sep 2018 20:04

AW: SDAC insert geräteübergreifend Delphi 10.2.3.
 
Ein
Delphi-Quellcode:
WHERE false
oder
Delphi-Quellcode:
LIMIT 0
würde sich an deinem SELECT bestimmt nicht schlecht machen, denn wozu erst die GANZE Tabelle laden, wenn nur etwas eingefügt werden soll.

In deinem Fall muß die Query-Komponente automatisch ein INSERT-Statement erzeugen,
und da kann man bestimmt über ein Connection-Event oder über eine Logging-Komponente sich mal ausgeben lassen wie dieses INSERT aussieht, welches bei dir ja scheinbar nicht ganz korrekt sein wird.


Zitat:

Zitat von Delphi.Narium (Beitrag 1412226)
Delphi-Quellcode:
Query.SQLInsert.Text := 'INSERT Into Demo (demo.wert1) VALUES (12);';
Query.Insert;
Query.Post;

Falsch.

In das Statement kommen keine Values sondern Parameter dein, welche zwischen Insert und Post gefüllt werden,
ansonsten Query.SQL.Text und Query.Execute, anstatt soeiner Misshandlung dieser Funktion, um das INSERT-Statement "auszuführen".

Und das SQLInsert ist übrigens auch die Lösung, für denn Fall, dass das automatische Erstellen des INSERT-Statements nicht funktioniert.

Delphi.Narium 1. Sep 2018 20:20

AW: SDAC insert geräteübergreifend Delphi 10.2.3.
 
Zitat:

Zitat von himitsu (Beitrag 1412229)
Zitat:

Zitat von Delphi.Narium (Beitrag 1412226)
Delphi-Quellcode:
Query.SQLInsert.Text := 'INSERT Into Demo (demo.wert1) VALUES (12);';
Query.Insert;
Query.Post;

Falsch.

In das Statement kommen keine Values sondern Parameter dein, welche zwischen Insert und Post gefüllt werden,
ansonsten Query.SQL.Text und Query.Execute, anstatt soeiner Misshandlung dieser Funktion, um das INSERT-Statement "auszuführen".

Und das SQLInsert ist übrigens auch die Lösung, für denn Fall, dass das automatische Erstellen des INSERT-Statements nicht funktioniert.

Das ist aber kein Zitat von mir. Und dass man eigentlich Parameter nutzt ist mir auch klar. Wollte aber erstmal nur drauf hinweisen, dass SQL über sowas wie Insert verfügt und dass man das andere Brumborium für das Einfügen von Datensätzen nicht benötigt.

jangbu 2. Sep 2018 14:24

AW: SDAC insert geräteübergreifend Delphi 10.2.3.
 
Danke, werde jetzt Paramter verwenden obwohl mir noch immer nicht klar ist warum meine ADO Insert Variante mit der FieldByName-Zuweisung dann bisher immer funktioniert hatte?

Uwe Raabe 2. Sep 2018 15:07

AW: SDAC insert geräteübergreifend Delphi 10.2.3.
 
Zitat:

Zitat von jangbu (Beitrag 1412247)
obwohl mir noch immer nicht klar ist warum meine ADO Insert Variante mit der FieldByName-Zuweisung dann bisher immer funktioniert hatte?

Die meisten Datenzugriffskomponenten bauen sich anhand der Select-Anweisung selbst eine Insert- bzw. Update-Anweisung zusammen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz