如何转换TVarRec和Variant?

时间:2010-09-17 08:11:04

标签: delphi delphi-2006

是否有标准方法在TVarRec和Variant值之间进行转换?

我想解析'const数组'并使用这些值来填充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数组中的值取决于查询中的参数。调用者知道这些是什么,但使用该数组的方法不知道预期的数量或类型。即我无法将方法更改为Read(name:string; age:integer)。
  • 参数的使用顺序不一定与const数组中指定值的顺序相同。在示例中,keyFields被指定为“Name,Age”,但查询使用Age before Name。这意味着Params [i] .Value:= keyValues [i]将无效。我认为无论如何仍然需要VarRecToVariant,我试图避免这样做。

1 个答案:

答案 0 :(得分:5)

替换

procedure Read(keyValues: array of const); 

procedure Read(keyValues: array of Variant); 

然后您不需要将TVarRec转换为Variant。