Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Stringgrid Einträge in SQL-Tabelle übernehmen (https://www.delphipraxis.net/211745-stringgrid-eintraege-sql-tabelle-uebernehmen.html)

jmich 28. Okt 2022 18:05

Delphi-Version: 11 Alexandria

Stringgrid Einträge in SQL-Tabelle übernehmen
 
Hallo Delphianer,

Habe mal wieder ein Problem wo ich nicht weiter komme.
Folgendes:

Ich möchte vom einen Stringgrid alle Einträge in eine
SQL Tabelle übernehmen.
Stringgrid:
Nr Bezeichnung Art Preis
_________________________________
1 Artikel 1 Muster 10,00
2 Artikel 2 Test 20,00
3 Artikel 3 Bild 30,00

u.s.w

Bei meinen Code wird in der SQL-Tabelle immer
leider nur die letzte Stringgrid-Zeile richtig übernommen.
( 3 Artikel 3 Bild 30,00 )

Habe dazu zwei Codes versucht - gleiche Ergebnis.

Hier meine Code:
Delphi-Quellcode:
procedure Ttestform.btn_saveClick(Sender: TObject);
var
LiteConnection : TLiteConnection;
LiteQuery: TLiteQuery;
i,n,nummer : Integer;
preis_um : Double;
begin
          LiteConnection := TLiteConnection.Create(nil);
          LiteQuery := TLiteQuery.Create(nil);

          LiteConnection.Database := ExtractFilePath(Application.ExeName)+'testmuster.db';
          LiteConnection.Connected := True;
          LiteQuery.Connection := LiteConnection;
          LiteConnection.Options.Direct := True;
         try
            LiteQuery.Close;
            LiteQuery.SQL.Clear;
            LiteQuery.SQL.Add('DELETE FROM' + QuotedStr(lbl_tabellenname.Caption)+''); // z.B tabellenname = mustertest
            LiteQuery.ExecSql;

           for i:= sgrid_test.FixedRows to sgrid_test.RowCount-1 do
                n := 1;
              begin
                repeat
                  LiteQuery.Close;
                  LiteQuery.SQL.Clear;
                  LiteQuery.Sql.Add('INSERT INTO '+QuotedStr(lbl_tab_datenbank.Caption)+' (beschreibung,art,preis,nr) VALUES('+QuotedStr(sgrid_test.Cells[1,n])+','   +QuotedStr(sgrid_test.Cells[2,n])+','+QuotedStr(sgrid_test.Cells[3,n])+','+QuotedStr(sgrid_test.Cells[0,n])+ ')');
                   n := n + 1;
                 
                  // 2.Code
                  {  for i:= sgrid_test.FixedRows to sgrid_test.RowCount-1 do
                        begin
                          LiteQuery.Close;
                          LiteQuery.SQL.Clear;
                          LiteQuery.SQL.Text := 'INSERT INTO' + QuotedStr(lbl_tab_datenbank.Caption) +
                            '( '+
                            '[beschreibung],[art],[preis],[nr]'+
                            ')'+
                            'Values ('+
                            ':be,:na,:pr,:nnr'+
                            ')';
                        LiteQuery.ParamByName('nnr').AsInteger := StrToInt(sgrid_test.Cells[0,i]);
                        LiteQuery.ParamByName('ver').AsString := sgrid_test.Cells[1,i];
                        LiteQuery.ParamByName('nam').AsString := sgrid_test.Cells[2,i];
                        LiteQuery.ParamByName('pr').AsFloat := StrToFloat(sgrid_test.Cells[0,i]);;
                        end;
                        LiteQuery.ExecSql; }  // 2.Code Ende]

                until n = i;
              end;
               LiteQuery.ExecSql;
         finally
            LiteQuery.Free;
            LiteConnection.Free;
         end;
end;
Wie kann man alle Einträge (alle Zeilen) des Stringgrigs in die SQL-Tabelle übernehmen.

Vielen Dank im Voraus

Gruß jmich

jmich 28. Okt 2022 18:13

AW: Stringgrid Einträge in SQL-Tabelle übernehmen
 
Hi Leute,

habe die Lösung selber herausgefunden:

hier war der Fehler:
LiteQuery.ExecSql
gehört mit in die repeat until Schleife und
nicht außerhalb.

Trotzdem Danke an Alle

haentschman 31. Okt 2022 06:59

AW: Stringgrid Einträge in SQL-Tabelle übernehmen
 
Hallöle...8-)
Zitat:

habe die Lösung selber herausgefunden
...trotzdem gibt es einen entscheidenden Fehler...keine Parameter! :warn:
Delphi-Quellcode:
'INSERT INTO '+QuotedStr(lbl_tab_datenbank.Caption)+' (beschreibung,art,preis,nr) VALUES('+QuotedStr(sgrid_test.Cells[1,n])+','   +QuotedStr(sgrid_test.Cells[2,n])+','+QuotedStr(sgrid_test.Cells[3,n])+','+QuotedStr(sgrid_test.Cells[0,n])+ ')'
..
= :kotz:

Besser:
Delphi-Quellcode:
LiteQuery.SQL.Text := 'INSERT INTO '+ QuotedStr(lbl_tab_datenbank.Caption) + ' (beschreibung,art,preis,nr) VALUES (:P1, :P2, :P3, :P4)';
LiteQuery.ParamByName('P1').AsString := QuotedStr(sgrid_test.Cells[1,n]);
LiteQuery.ParamByName('P2').AsString := QuotedStr(sgrid_test.Cells[2,n]);
LiteQuery.ParamByName('P3').AsString := QuotedStr(sgrid_test.Cells[3,n]);
LiteQuery.ParamByName('P4').AsString := QuotedStr(sgrid_test.Cells[0,n]);
= :thumb:

Grund:
https://de.wikipedia.org/wiki/SQL-Injection

DeddyH 31. Okt 2022 09:24

AW: Stringgrid Einträge in SQL-Tabelle übernehmen
 
Einem Parameter.AsString einen QuotedStr zu übergeben, ist das nicht doppelt gemoppelt und müsste dazu führen, dass die DB-Einträge dann auch gequoted sind?

haentschman 31. Okt 2022 14:16

AW: Stringgrid Einträge in SQL-Tabelle übernehmen
 
CopyPaste...Schei...:oops:

und ja. :wink:

Guck mal auf die Uhr...Heute, 07:59...wir haben heute hier Feiertag. 8-)

himitsu 31. Okt 2022 14:58

AW: Stringgrid Einträge in SQL-Tabelle übernehmen
 
Nein.
QuoteStr ist für PascalStrings, aber ist und war niemals nicht für SQL-Strings.
Einfaches Beispiel ist das
Delphi-Quellcode:
\
welches davon nicht behandelt wird.

Man nehme Parameter oder die EscapeFunktion des DB-Frameworks.

DeddyH 31. Okt 2022 16:07

AW: Stringgrid Einträge in SQL-Tabelle übernehmen
 
Genau darum geht es doch.

himitsu 31. Okt 2022 19:01

AW: Stringgrid Einträge in SQL-Tabelle übernehmen
 
komisch, vorhin war haentschman ganz bestimmt noch nicht zu sehn :shock:

haentschman 1. Nov 2022 07:52

AW: Stringgrid Einträge in SQL-Tabelle übernehmen
 
Zitat:

vorhin war haentschman ganz bestimmt noch nicht zu sehn
...das ist Absicht. :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 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