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?

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top