wie erzeugt bzw. übergibt man vorschriftsmäßig Parameter an ein
ADOCommand-Objekt. Hier ein Beispiel wie es nicht funktioniert:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
iRowsAffected: integer;
begin
ADOCommand1.CommandText :=
'INSERT INTO Artikel (Artikelname) VALUES (:ArtikelName)';
ADOCommand1.CommandType := cmdText;
ADOCommand1.Parameters.CreateParameter('ArtikelName',
ftString, pdInput, 10, 'abc');
ADOCommand1.Execute(iRowsAffected, null);
Edit1.Text := IntToStr(iRowsAffected);
end;
Und auch so gehts nicht:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
iRowsAffected: integer;
p: TParameter;
begin
ADOCommand1.CommandText :=
'INSERT INTO Artikel (Artikelname) VALUES (:ArtikelName)';
ADOCommand1.CommandType := cmdText;
p := ADOCommand1.Parameters.AddParameter;
p.Value := 'abc';
p.DataType := ftString;
p.Direction := pdInput;
ADOCommand1.Execute(iRowsAffected, null);
Edit1.Text := IntToStr(iRowsAffected);
end;
Weitere Versionen hätte ich noch.
Und es wird auch stets ein neuer Datensatz in die Tabelle eingefügt. Nur
der Parameter bleibt ohne Auswirkungen, das entsprechende Feld in der
Datenbank ("Artikelname") ist leer.
Kann jemand helfen?
TIA
Michael
> Hi,
>
> wie erzeugt bzw. uebergibt man vorschriftsmaessig Parameter an ein
> ADOCommand-Objekt. Hier ein Beispiel wie es nicht funktioniert:
>
> procedure TForm1.BitBtn1Click(Sender: TObject);
> var
> iRowsAffected: integer;
> begin
> ADOCommand1.CommandText :=
> 'INSERT INTO Artikel (Artikelname) VALUES (:ArtikelName)';
> ADOCommand1.CommandType := cmdText;
ADOCommand1.Parameters.ParamByName('ArtikelName').Value := 'abc';
// ADOCommand1.Parameters.CreateParameter('ArtikelName',
// ftString, pdInput, 10, 'abc');
> ADOCommand1.Execute(iRowsAffected, null);
> Edit1.Text := IntToStr(iRowsAffected);
> end;
Sollte funktionieren...
HTH,
Steve
--
Meine Nachrichten sind lesbar gestaltet. Ich bin für die Unzulänglichkeiten
Ihres Newsreaders nicht verantwortlich. [Lesnar in einem HTML-Posting]
Steve Rasch wrote:
> > begin
> > ADOCommand1.CommandText :=
> > 'INSERT INTO Artikel (Artikelname) VALUES (:ArtikelName)';
> > ADOCommand1.CommandType := cmdText;
>
> ADOCommand1.Parameters.ParamByName('ArtikelName').Value := 'abc';
> // ADOCommand1.Parameters.CreateParameter('ArtikelName',
> // ftString, pdInput, 10, 'abc');
>
> > ADOCommand1.Execute(iRowsAffected, null);
> > Edit1.Text := IntToStr(iRowsAffected);
> > end;
>
> Sollte funktionieren...
>
Das heißt also:
...
begin
ADOCommand1.CommandText :=
'INSERT INTO Artikel (Artikelname) VALUES (:ArtikelName)';
ADOCommand1.CommandType := cmdText;
ADOCommand1.Parameters.ParamByName('ArtikelName').Value := 'abc';
ADOCommand1.Execute(iRowsAffected, null);
Edit1.Text := IntToStr(iRowsAffected);
end;
Funktioniert net.
Dies war auch eine meiner o.g. Varianten.
Datensatz wird zwar eingefügt, Artikelname bleibt aber leer.
Ohne Parameter gehts übrigens.
Also etwa so:
...
begin
ADOCommand1.CommandText :=
'INSERT INTO Artikel (Artikelname) VALUES ("ArtikelName")';
ADOCommand1.CommandType := cmdText;
ADOCommand1.Execute(iRowsAffected, null);
Edit1.Text := IntToStr(iRowsAffected);
end;
Jetzt gibts jetzt einen neuen Artikeldatensatz mit dem Artikelnamen
"ArtikelName".
<Grübel>
Michael
So mache ich es immer, und bei mir funktioniert es...
Was bedeutet "Null" bei Execute gleich nochmal?
ev. "AsString" testen...
Bye,
Steve
--
Bad command. Bad, bad command! Sit! Stay! Staaay..
Steve Rasch wrote:
> So mache ich es immer, und bei mir funktioniert es...
> Was bedeutet "Null" bei Execute gleich nochmal?
Es gibt eine dreifach überladene Version von Execute. Die, die auch
"RowsAffected" wiedergibt, hat als zweiten Parameter noch einen
OleVariant "Parameters". Hierbei handelt es sich um ein variantes Array,
das ebenso zur Parameterübergabe genutzt werden kann. Es ermöglicht
jedoch nur Input-Parameter. Ich will ggf. auch mal einen
Output-Parameter einer StoredProc auswerten. Kommt also nicht in Frage
(obwohl es funktioniert!).
> ev. "AsString" testen...
Wie?
Ich erinnere mich, daß ich beim *Lesen* eines Parameters .AsString
angeben kann, aber beim Setzen?
Dies geht doch nur über die DataType-Zuweisung entweder beim Create,
etwa wie hier
... Parameters.CreateParameter('Artikelname', ftString, ...);
oder am expliziten Parameter, etwa wie hier
p := TParameter.Create(ADOCommand1.Parameters);
p.Value := 'abc';
p.DataType := ftString;
p.Direction := pdInput;
...
Oder?
Wohl gemerkt, alles im ADO-Umfeld!
Übrigens: Ich verwende derzeit zum Test sowohl eine
MS-Acces-Datenbankdatei als auch eine MS-SQL-Server-Tabelle. Bei beiden
der gleiche Mißerfolg. Kann das sein? Irgendwo mache ich doch was
falsch.
Ich habe das alles auch schon ohne Coding ausprobiert. Also alle Daten
für Connection- und Command-Objekt sauber in den OE eingetragen.
Inklusive Parameter! Mit Wert, Datentyp usw.
Immer wieder das Gleiche: Satz wird eingefügt, ohne Berücksichtigung des
Parameterwertes.
<grübel, grübel>
Michael
--
D5 Enterprise (Update Pack 1, ADOExpress Update2)
NT4.0 SP5
ADO 2.6
"Michael Broede" <"mbr(nospam)"@gecko.de> schrieb im Newsbeitrag
news:3B80FBE1...@gecko.de...
> [...] Immer wieder das Gleiche: Satz wird eingefügt, ohne
> Berücksichtigung des Parameterwertes.
Nur eine Vermutung: ist TADODataSet.ParamCheck = true?
Grüße aus Köln
Robby
Robert Wachtel wrote:
>
> Nur eine Vermutung: ist TADODataSet.ParamCheck = true?
>
Ja