How to convert between TVarRec and Variant?

Wil*_*Cau 7 delphi delphi-2006

Is there a standard way to convert between TVarRec and Variant values?

I want to parse an 'array of const' and use the values to populate parameters in a TMSQuery. To do this I'm using a list of column names (generated from TMSQuery.KeyFields), and matching the values in the array with the column names in KeyFields (by position), then using the column name to set the corresponding parameter using ParamByName.

The code below is what I've come up with, but VarRecToVariant doesn't seem very elegant. Is there a better solution?

  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;
Run Code Online (Sandbox Code Playgroud)

Notes:

  • const数组中的值取决于查询中的参数.调用者知道这些是什么,但使用该数组的方法不知道预期的数量或类型.即我无法将方法更改为Read(name:string; age:integer).
  • 参数的使用顺序不一定与在const数组中指定值的顺序相同.在示例中,keyFields被指定为"Name,Age",但查询使用Age before Name.这意味着Params [i] .Value:= keyValues [i]将无效.我认为无论如何仍然需要VarRecToVariant,我试图避免这种情况.

ood*_*ner 5

更换

procedure Read(keyValues: array of const); 
Run Code Online (Sandbox Code Playgroud)

procedure Read(keyValues: array of Variant); 
Run Code Online (Sandbox Code Playgroud)

然后你不需要将TVarRec转换为Variant.