Delphi TClientDataSet Найдите проблемы - PullRequest
1 голос
/ 27 ноября 2011

Я использую драйверы 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.

Франческо

1 Ответ

5 голосов
/ 27 ноября 2011

Ваш код неверный. :)

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;
...