![]() |
Datenbank: MS ACCESS • Version: 2003 • Zugriff über: ADO Komponenten
ADO: ein simples INSERT
Hallo DP!
Eine klitzekleine test.mdb hat nur 2 Felder: ID und text. Das ID Feld ist der PK und hat einen auto-inkrement. Gebastelt hab ich folgende Funktion:
Delphi-Quellcode:
Der Aufruf der Funktion soll so aussehen:
function insert_test(wert1: string):boolean;
begin insert_test := true; try Fmain.ADOCommand1.CommandType := cmdText; Fmain.ADOCommand1.CommandText := 'INSERT INTO test VALUES (' + '' + ', ' + wert1 + ');'; Fmain.ADOCommand1.Execute; Except insert_test := FALSE; end; End;
Delphi-Quellcode:
Dann müsste bei jedem Aufruf das ID Feld hochgezählt werden und im Text Feld steht immer Hallo Welt.
insert_test('Hallo Welt');
Ich habe schon ettliche Beispiele durch die Suchfunktion gefunden, aber ich werd einfach nicht aus den vielen Klammern und Hochkommatas schlau. Ich bekomme durch meine experimente verschiedene Fehlermeldungen. Wie lautet denn nun die richtige Syntax zu
Delphi-Quellcode:
Fmain.ADOCommand1.CommandText := 'INSERT INTO test VALUES (' + '' + ', ' + wert1 + ');';
|
Re: ADO: ein simples INSERT
Hi,
meine Meinung:
Delphi-Quellcode:
Bei dem AutoID-Feld bin ich mir nicht sicher, könnte daher auch so:Fmain.ADOCommand1.CommandText := 'INSERT INTO test VALUES ("", ' + QuotedStr(wert1) + ')';
Delphi-Quellcode:
Soviel zu meinem Halbwissen, kann ich im Moment nicht testen ...Fmain.ADOCommand1.CommandText := 'INSERT INTO test (text) VALUES (' + QuotedStr(wert1) + ')'; MJ |
Re: ADO: ein simples INSERT
Hallo Maja Jessica!
Beim Test deiner 1. Variante bekomm ich den Fehler: Datentypen in Kriterienausdruck unverträglich und bei der 2. Variante ein Syntaxfehler in der INSERT INTO Anweisung :| Ich danke dir trotzdem für deine Antwort ! |
Re: ADO: ein simples INSERT
Zitat:
Ich benutze kein ADO sondern mache alles mit AbsoluteDB. Sollte aber von SQL-Syntax her etwa gleich sein. Wie war das noch bei einem Insert und Auto-ID ... :gruebel: ich komm' jetzt nicht darauf... Schliesslich füllt die DB das Feld ja selbst mit einem Wert. Muss ich den jetzt angeben oder nicht? Schonmal mit einer Übergabe von 0 an das AutoID-Feld versucht? Oder warten auf die Profis im Forum :? MJ |
Re: ADO: ein simples INSERT
[quote="Ajin"]Eine klitzekleine test.mdb hat nur 2 Felder: ID und text. [delphi]
Das ist schon mal schlecht: "text" ist ein reserviertes Wort und kann einen Syntaxfehler verursachen! :warn: Ich würde beide Feldnamen ändern, denn "ID" ist auch sehr allgemein. |
Re: ADO: ein simples INSERT
Also den Wert für das ID (autoinkrement) Feld kann man mit leer angeben, das Hochzählen macht die DB dann selbst. Dennoch kann ich keinen einzigen Datensatz anlegen.
|
Re: ADO: ein simples INSERT
Ein wenig googlen auf SwissDeplhi ergab
Delphi-Quellcode:
Ist also so, daß man die ID-Spalte links liegen lässt. Punkt.
// Insert a new Record...
var LastID: Integer; // Query: TADOQuery; // oder // Query: TQuery; begin Query.Active := False; Query.SQL.Clear; Query.SQL.Append('INSERT INTO Table (Spalte) VALUES (Value)'); Query.ExecSQL; end; Du bekommst keine Fehlermeldung? :gruebel: |
Re: ADO: ein simples INSERT
warum nicht
Delphi-Quellcode:
oder
Query.sql.Text := 'INSERT INTO Tabelle (Feld) VALUES (:Feld)';
Query.ParamByName('Feld').Value := 'Hallo DB'; Query.Execute; // oder ExecSQL?? Die Code-Vervollständigung weiß es
Delphi-Quellcode:
Query.sql.Text := 'SELECT * FROM Tabelle WHERE id=0';
Query.Open; Query.Append; Query.FieldByName('Feld').Value := 'Hallo DB'; Query.Post; Query.Close; |
Re: ADO: ein simples INSERT
Moin Ihr!
Ich hab die Lösung nun:
Delphi-Quellcode:
Mfg
procedure TFmain.Button1Click(Sender: TObject);
var wert1, wert2: string; begin Fmain.ado_query.Active:= FALSE; Fmain.ado_query.SQL.Clear; wert1:='Hallo Du'; Fmain.ado_query.SQL.Append('INSERT INTO test (w1,w2) VALUES ("' + wert1 + '",'+ '"' + Wert1 + '")'); try Fmain.ado_query.ExecSQL; except Messagebox(handle,'Duplikat?','',0); end; end; Ajin |
Re: ADO: ein simples INSERT
Hi,
schön das es jetzt klappt! :thumb: Du hast nun aber in Spalte w1 und w2 den gleichen Eintrag 'Hallo Du'. Funktioniert auch die AutoID? MJ |
Re: ADO: ein simples INSERT
Um es ganz deutlich zu sagen:
1.) Stringliterale werden unter SQL/92 in einfache Hochkommas (nicht doppelte Anführungszeichen) gesetzt. 2.) Man sollte keinesfalls die Hochkommas selbst hinschreiben, sondern immer die Funktion QuotedStr oder noch besser Parameter benützen Angenommen die Variable wert1 aus dem Beispiel enthielte den Text Wayne's World; die Folge wäre bei Nichtbeachtung dieser Regel eine Syntaxfehler 3.) Niemals in einer Klasse (z.B. von TForm abgeleitet) auf die Instananzvariable zugreifen!!!
Delphi-Quellcode:
4.) Finger weg von "try...except", wenn man das Prinzip nicht verstanden hat!
procedure TFmain.Button1Click(Sender: TObject);
begin // ganz böser Fehler: es wird die Variable FMain angesprochen Fmain.ado_query.Active:= FALSE; // richtig: ado_query.Active:= FALSE;
Delphi-Quellcode:
try
ado_query.ExecSQL; except // Ganz schlecht: es wird nur eine Meldung mit dem völlig aussagelosen Text "Duplikat?" ausgegeben // der Fehler könnte aber völlig andere Ursachen haben // der Programmfaden wird fortgefüht, obwohl ein Fehler vorliegt Messagebox(handle,'Duplikat?','',0); end;
Delphi-Quellcode:
try
ado_query.ExecSQL; except // Richtig: vernünftige Fehlermeldung on E:Exception do begin E.Message := 'Fehler bein Einfügen in Tabelle <test>'#13#10+ '(evtl. Duplikat)'#13#10+ E.Message; // orginale Fehlermeldung anhängen raise; // Exception erneut auslösen end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 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 by Thomas Breitkreuz