我正在使用Delphi7
,MS Vista
和Devart's dbExpress
驱动程序(版本4.70)。我放弃了TSQLConnection
,TSQLTable
(tabA
),TDataSetProvider
,TClientDataSet
(cdsA
),DataSource
和DBGrid
。
我通过图形设计工具进行了所有设置。一切正常,当我打开cdsA
时,我可以看到网格中的所有数据。这是我的代码:
procedure TForm1.Button1Click(Sender: TObject);
var
fields, values: string;
begin
cdsA.Close;
cdsA.Open;
fields := 'fielda;fieldb';
values := Edit1.Text+';'+Edit2.Text;
cdsA.SetKey;
cdsA.Locate(fields, values, [loCaseInsensitive]);
end;
fieldA
和fieldB
存在于表格中,也在cdsA.Fields
中定义。当我执行此代码时,Locate
指令会生成异常EVariantInvalidArgError ... Invalid argument
。我想知道什么是错的。 TIA。
弗朗西斯
答案 0 :(得分:5)
你的代码错了。 :)
procedure TForm1.Button1Click(Sender: TObject);
var
fields, values: string;
begin
// Closing the CDS and opening it every time is foolish. Just
// open it if it's not already open.
if not cdsA.Active then
cdsA.Open;
// List of column names. Since column (field) names are always
// strings, can just use semicolon-separated values
fields := 'fielda;fieldb';
// Values for columns. Since these could be any type, you can't
// simply use semicolon-separated strings. You have to pass an
// array of Variants. The easiest way is to just create it and
// populate it, and let reference counting release it when it's
// out of scope
values := VarArrayOf([Edit1.Text, Edit2.Text]);
// No call to SetKey here. SetKey is used with FindKey, not Locate
cdsA.Locate(fields, values, [loCaseInsensitive]);
end;