Как конфертировать между TVarRec и Variant? - PullRequest
7 голосов
/ 17 сентября 2010

Существует ли стандартный способ преобразования значений TVarRec и Variant?

Я хочу проанализировать «массив констант» и использовать значения для заполнения параметров в TMSQuery. Для этого я использую список имен столбцов (созданный из TMSQuery.KeyFields) и сопоставляю значения в массиве с именами столбцов в KeyFields (по позиции), затем использую имя столбца для установки соответствующего параметра с помощью ParamByName .

Приведенный ниже код - это то, что я придумал, но VarRecToVariant выглядит не очень элегантно. Есть ли лучшее решение?

  keyFields: TStringList;
    // List of table column names (keyFields.DelimitedText := query.KeyFields;)
    // e.g. Name, Age
  query: TMSQuery;
    // Parametrized query with a parameter for each field in keyFields 
    // SELECT * FROM People WHERE Age=:Age AND Name=:Name

  // If keyValues is ['Bob', 42] the resulting query should be
  // SELECT * FROM People WHERE Age=42 AND Name='Bob'

  procedure Read(keyValues: array of const);
  var
    i: Integer;
    name: string;
    value: Variant;
  begin
    ...
    for i := 0 to keyFields.Count - 1 do
    begin
      name := keyFields[i];
      value := VarRecToVariant(keyValues[i]);
      query.ParamByName(name).Value := value;
    end;
    query.Open
    ...
  end;

  function VarRecToVariant(varRec: TVarRec): Variant;
  begin
    case varRec.VType of
      vtInteger:    result := varRec.VInteger;
      vtBoolean:    result := varRec.VBoolean;
      vtChar:       result := varRec.VChar;
      vtExtended:   result := varRec.VExtended^;
      vtString:     result := varRec.VString^;
      ...
    end;
  end;

Примечания:

  • Значения в массиве const зависят от параметров в запросе. Вызывающая сторона знает, что это такое, но метод, использующий массив, не знает, сколько или какого типа ожидать. То есть Я не могу изменить метод на «Чтение» (имя: строка; возраст: целое число).
  • Параметры не обязательно используются в том же порядке, в котором значения указаны в массиве const. В этом примере ключевые поля указаны как «Имя, Возраст», но в запросе используется «Возраст до имени». Это означает, что Params [i] .Value: = keyValues ​​[i] не будет работать. Я думаю, что VarRecToVariant все равно понадобится, чего я пытаюсь избежать).

1 Ответ

5 голосов
/ 17 сентября 2010

Заменить

procedure Read(keyValues: array of const); 

с

procedure Read(keyValues: array of Variant); 

Тогда вам не нужно будет конвертировать TVarRec в Variant.

...