Delphi 2006の実行時にADOパラメーターを使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/4854463

質問

私はこれで机に頭を叩いてきました。私は2つの列のあるシンプルなテーブルを持っています。

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]

私はこのような手順で行を更新しようとしています:

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

私が起こっているのは(これらのデバッグメッセージボックス呼び出しで)起こっていることです。更新コマンドは2つのパラメーターを取得しますが、それらの名前はPARAM1とPARAM2であり、ValueやKeyではありません。

実行時にパラメーターをセットアップする方法はありますか。パラメンタミーコールは、私が取得しているパラメーション* n*ではなく、実際に必要な名前で動作しますか?

役に立ちましたか?

解決

電話しないでください Refresh 「コマンドテキスト」を割り当てた後の「パラメーター」。 「更新」を呼び出すと、VCLはパラメーター情報のプロバイダーに頼り、返された情報にパラメーター名が含まれていない場合、VCLはその場でそれらを構成します。

他のヒント

ParsESQLを使用してパラメーターを生成できます

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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top