8

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"として指定されていますが、クエリはAgebeforeNameを使用しています。これは、Params [i] .Value:=keyValues[i]が機能しないことを意味します。とにかくVarRecToVariantはまだ必要だと思いますが、これは避けようとしています)。
4

1 に答える 1

6

交換

procedure Read(keyValues: array of const); 

procedure Read(keyValues: array of Variant); 

その後、TVarRecをVariantに変換する必要はありません。

于 2010-09-17T08:58:16.440 に答える