Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL INSERT Problem (https://www.delphipraxis.net/15507-sql-insert-problem.html)

Piro 29. Jan 2004 21:16


SQL INSERT Problem
 
Ich möchte gerne einen Datensatz anlegen aber irgendwie will er nicht wenn ich zwei Werte übergebne möchte.

Delphi-Quellcode:
nr := '1';
vorname := 'Sven';

with DataModule1.qr_spielerliste do
 begin
   Close;
   SQL.Clear;
   SQL.Add ('INSERT INTO spielerdaten (Nr, Vorname');
   SQL.Add ('VALUES (nr, vorname)');
   ExecSQL;
   Open;
 end;
Fehlermeldung: Ungültiges Schlüsselwort Symbol-String: VALUES Zeilennummer: 2

Kann mir mal bitte einer erklären warum die Meldung kommt, da doch der Quelltext in Ordnung ist?

fkerber 29. Jan 2004 21:26

Re: SQL INSERT Problem
 
Hi!

Fehlt da evtl. eine Klammer?

Zitat:

with DataModule1.qr_spielerliste do
begin
Close;
SQL.Clear;
SQL.Add ('INSERT INTO spielerdaten (Nr, Vorname)');
SQL.Add ('VALUES (nr, vorname)');
ExecSQL;
Open;
end;
oder sie ist in der 2. add anweisung zuviel. Habe da keine genaue Ahnung. Habe nur den Unterschied gesehen.

Ciao fkerber

MrSpock 29. Jan 2004 21:26

Re: SQL INSERT Problem
 
Hallo daywalker299,
du willst ja den Inhalt der Variablen übergeben und nicht deren Namen.
Es muss deshalb wie folgt heißen:

Delphi-Quellcode:
with DataModule1.qr_spielerliste do
begin
   Close;
   SQL.Clear;
   SQL.Add ('INSERT INTO spielerdaten (Nr, Vorname');
   SQL.Add ('VALUES ('+nr+','+QuotedStr(vorname)+')');
   ExecSQL;
   Open;
end;

gekmihesg 29. Jan 2004 21:27

Re: SQL INSERT Problem
 
beim obren fehlt mal ne klammer.
und man muss so weit ich weis auf groß und kleinschreibung achten.

mit dem delphi-sql kenn ich mich auch nicht so aus aber der logischen reihenfolge nach kommt für mich erst open und dann close

trifid 29. Jan 2004 21:29

Re: SQL INSERT Problem
 
nr := '1';
vorname := 'Sven';

SQL.Add ('INSERT INTO spielerdaten (Nr, Vorname) ');
SQL.Add (Format ('VALUES ("%s", "%s")', [nr, vorname]));

Piro 29. Jan 2004 21:43

Re: SQL INSERT Problem
 
ich schließe die Query zur Laufzeit deshalb ersz close und dann open.

das mit der klammer war es aber jetzt kommt die Fehlermeldung : "Fehler beim Erstellen des Cursor-Handle"

Was soll das?

Piro 29. Jan 2004 21:46

Re: SQL INSERT Problem
 
er hat auch 4 datensätze angelegt anstatt nur einem.

trifid 29. Jan 2004 21:51

Re: SQL INSERT Problem
 
wie sieht nun dein code aus (ich habe abgekürzt)
wieviele felder hat noch deine tabelle
kann es sein, dass die routine mehrmals aufgerufen wird (breakpoint setzen und mitzählen)
lösche alle "1", "Sven" aus deiner spielerdaten und probiers nochmal

Piro 29. Jan 2004 22:05

Re: SQL INSERT Problem
 
Also ich habe 3 Spalten

Nr | Vorname | Nachname

und eine Eingabemaske.

Auf das Klicken eines Buttons sollen die Daten in die DB. Aber Fehlermeldung:"Fehler beim Erstellen des Cursor-Handle"

Delphi-Quellcode:
procedure Tfrm_personeingabe.bbtn_hinzuClick(Sender: TObject);
var
 nr, vorname, nachname: string;
begin
 nr := edt_nr.Text;
 vorname := edt_vorname.Text;
 nachname := edt_nachname.Text;
 
 with DataModule1.qr_spielerliste do
 begin
   Close;
   SQL.Clear;
   SQL.Add ('INSERT INTO spielerdaten (Nr, Vorname) ');
   SQL.Add ('VALUES (nr,vorname)');
   ExecSQL;
   Open;
 end;
 frm_personeingabe.hide;
end;
Woher kommt der Fehler? Er kann gar nicht mehrere anlegen: :wall:

Robert_G 29. Jan 2004 22:12

Re: SQL INSERT Problem
 
Du darfst nur bei Abfragen "open" verwenden.
Insert, Update oder Delete sind DML (Data manipulation language) und werden deshalb keine Ergebnismenge liefern (auch keine leere -> deshalb der Fehler).
Gleiches gilt für DDL - also Erzeugen, Ändern, Löschen von Objekten (nicht Einträgen von Tabellen).

Nachtrag: Ich weiß jetzt nicht so genau wie es sich da mit den Standard DB-kompos (BDE & ADO) verhält, aber bei Abfragen sollte kein ExecSQL verwendet werden, dafür aber für DML & DDL.

trifid 29. Jan 2004 22:12

Re: SQL INSERT Problem
 
ok,
ich habe dir was mit einem Format gezeigt
das was aber Du machst ist, dass Du alle Daten nochmals in sich selber kopierst
dein SQL bekommt nicht mit dass
nr = 1 und vorname = sven
ist.

der nächste Punkt ist, dass ich nicht weiss welche Datenbank du verwendest
somit können beim Format ('VALUES ("%s", "%s")', [nr, vorname])
die " nicht funktionieren
also musst Du ' verwenden
ich weiss es jetzt nicht auswendig und ich probies auch nicht aus
Format ('VALUES (''%s'', ''%s'')', [nr, vorname])

Piro 29. Jan 2004 22:36

Re: SQL INSERT Problem
 
danke für eure hilfe es lang an dem open.

wo kann ich denn mal etwa über die Values erfahren wenn ich Variablen benutzen möchte.

Sven

trifid 29. Jan 2004 22:39

Re: SQL INSERT Problem
 
Zitat:

wo kann ich denn mal etwa über die Values erfahren wenn ich Variablen benutzen möchte
im Handbuch deiner Datenbank
oder allgemein ein Buch über SQL

Leuselator 29. Jan 2004 22:49

Re: SQL INSERT Problem
 
Also, zu Deinem letzten Versuch: mir scheint, Du benutzt die qr_spielerliste auch zum Anzeigen der Spieler, willst dann kurz einen neuen Spieler einfügen, um anschließend wieder die Spielerliste anzuzeigen - wenn ich richtig vermute, und deine qr_spielerliste vor Eintritt in die bbtn_hinzuClick in etwa so aussieht:
SQL-Code:
SELECT * 
  FROM Spielerdaten
dann kommst Du so zum Ziel:
Delphi-Quellcode:
procedure Tfrm_personeingabe.bbtn_hinzuClick(Sender: TObject);
var nr
  , vorname
  , nachname
  , OldSql  : string;
begin
  nr := edt_nr.Text;
  vorname := edt_vorname.Text;
  nachname := edt_nachname.Text;
  with DataModule1.qr_spielerliste do
  begin
    Close;
    OldSql := SQL.Text;
    SQL.Clear;
    SQL.Add ('INSERT INTO spielerdaten (Nr, Vorname) ');
    SQL.Add ('         ( Nr                        ');  
    SQL.Add ('         , Vorname)                  ');
    SQL.Add ('    VALUES                           ');
    SQL.Add ('         ('+QuotedStr(Nr)             );  
    SQL.Add ('         ,'+QuotedStr(Vorname)+')    ');
    ExecSQL; // führt die Insertanweisung aus (Datenmenge bleibt geschlossen, da
             // kein ergebnis zurückgeliefert wird

    SQL.Text := OldSql; // zuweisen der ursprünglichen Select-Anweisung
    Open;   // öffnen der Liste
  end;
  frm_personeingabe.hide;
end;
Gruß

Robert_G 29. Jan 2004 22:50

Re: SQL INSERT Problem
 
Das wurde hier schon oft besprochen Hier im Forum suchenParamByName
zum Bsp. hier
und da gab es sogar eine Menge Fachchinesisch zu den Vorteilen bei der Verwendung von SQL-Variablen

Nachtrag: :wall: hab' ich wohl falsch verstanden...

trifid 29. Jan 2004 22:52

Re: SQL INSERT Problem
 
@Leuselator
das mit dem OldSQL würde ich abraten - das funktioniert
aber irgendwann kommt man damit durcheinander
besser 2 Query's verwenden

Leuselator 29. Jan 2004 22:59

Re: SQL INSERT Problem
 
@trifid: ich bin einverstanden, aber daywalker299 hatte es scheinbar so angehen wollen, und da ich ein netter Mensch bin... :-)

@daywalker299: verwendest Du die TQuery oder was anderes (TADOQuery z.b.) ?

Piro 29. Jan 2004 23:05

Re: SQL INSERT Problem
 
Dankeschön. damit kann ich doch was anfangen. Und mein rahes Wissen erweitern.

Piro 29. Jan 2004 23:08

Re: SQL INSERT Problem
 
TQuery und Paradox 7

wollte mich auch mal mit DBs beschäftigen. ISt nur etwas schwer wenn man nicht soviel Ahnung hat.

Leuselator 29. Jan 2004 23:18

Re: SQL INSERT Problem
 
ok TQuery:
Delphi-Quellcode:
procedure Tfrm_personeingabe.bbtn_hinzuClick(Sender: TObject);
begin
  with TQuery.Create(nil) do try
    Databasename := DataModule1.qr_spielerliste.Databasename; // Connection übernehmen
    SQL.Add ('INSERT INTO spielerdaten');
    SQL.Add ('         ( Nr         ');  
    SQL.Add ('         , Vorname)   ');
    SQL.Add ('    VALUES            ');
    SQL.Add ('         ( :DieNummer '); // Parameter
    SQL.Add ('         , :DerVorName)'); // noch einer
    Prepare;
    ParamByName('DieNummer' ).AsString := edt_nr    .Text; // Parameter Wert zuweisen
    ParamByName('DerVorName').AsString := edt_vorname.Text;
    ExecSQL; // Pepper!
  finally
    Free; // TQuery freigeben
  end;
  frm_personeingabe.hide;
end;
Rest in den o.g. Links nachlesen...
Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:12 Uhr.

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