Wie verwende ich ADO -Parameter zur Laufzeit in Delphi 2006?
-
27-10-2019 - |
Frage
Ich habe damit meinen Kopf gegen den Schreibtisch geschlagen. Ich habe eine einfache Tabelle mit 2 Spalten wie SO:
CREATE TABLE [dbo].[MiscInitializers](
[PKey] [int] IDENTITY(1,1) NOT NULL,
[Value] [text] NULL,
CONSTRAINT [PK_MiscInitializers] PRIMARY KEY CLUSTERED
(
[PKey] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Ich versuche, eine Zeile mit einem solchen Verfahren zu aktualisieren:
function TdmSQL.SetInitializer(Value: string; var Key: string): boolean;
const
UpdateCmd =
'update MiscInitializers set Value = :theValue where PKey = :theKey';
InsertCmd = 'insert into MiscInitializers (Value) values (:Param1)';
var
tmp: integer;
rsTmp: TADODataSet;
foo: TParameter;
sTmp: string;
begin
Result := false;
adoGenericCommand.CommandText := '';
adoGenericCommand.Parameters.Clear;
if Key <> '' then
begin
// attempt update
if not TryStrToInt(Key, tmp) then
exit;
adoGenericCommand.CommandText := UpdateCmd;
adoGenericCommand.Prepared := true;
adoGenericCommand.Parameters.Refresh;
// some debug stuff
sTmp := Format('Num Params: %d', [adoGenericCommand.Parameters.Count]);
ShowMessageBox(sTmp);
for tmp := 0 to adoGenericCommand.Parameters.Count - 1 do
begin
sTmp := Format('Param %d: Name %s',
[tmp, adoGenericCommand.Parameters.Items[tmp].Name]);
ShowMessageBox(sTmp);
end;
// end debug stuff
foo := adoGenericCommand.Parameters.ParamByName('theValue');
foo.Value.AsString := Value;
foo := adoGenericCommand.Parameters.ParamByName('theKey');
foo.Value := Key;
rsTmp.Recordset := adoGenericCommand.Execute;
Result := rsTmp.RecordCount = 1;
exit;
// etc
Was ich sehe (mit diesen Debug -MessageBox -Aufrufen), ist, dass der Aktualisierungsbefehl 2 Parameter erhält, aber ihre Namen sind Param1 und Param2, nicht der Wert und der Kee.
Gibt es eine Möglichkeit, die Parameter zur Laufzeit einzurichten, damit die ParambyName -Anrufe mit den von mir gewünschten Namen funktionieren, anstatt mit dem Paramon* n*, den ich bekomme?
Lösung
Rufen Sie nicht an Refresh
Auf den 'Parametern', nachdem Sie den 'Befehlstext' zugewiesen haben. Wenn Sie "Aktualisieren" aufrufen, wendet sich der VCL an den Anbieter für Parameterinformationen. Wenn die zurückgegebenen Informationen keine Parameternamen enthalten, macht die VCL sie im laufenden Fliegen aus.
Andere Tipps
Sie können Parseql verwenden, um die Parameter zu generieren
const
UpdateCmd = 'update MiscInitializers set Value = :theValue where PKey = :theKey';
var
ds: TADODataSet;
I: Integer;
begin
ds := TADODataSet.Create(nil);
try
ds.CommandText := UpdateCmd;
ds.Parameters.ParseSQL(ds.CommandText, True);
for I := 0 to ds.Parameters.Count - 1 do
ShowMessage(ds.Parameters.Items[I].name);
finally
ds.Free;
end;
end;