gpt4 book ai didi

delphi - 如何在 TVarRec 和 Variant 之间进行转换?

转载 作者:行者123 更新时间:2023-12-03 14:53:49 26 4
gpt4 key购买 nike

是否有在 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 数组中的值取决于查询中的参数。调用者知道这些是什么,但使用数组的方法不知道需要多少个或什么类型。 IE。我无法将方法更改为 Read(name: string;age: integer)。
  • 参数的使用顺序不一定与 const 数组中指定值的顺序相同。在示例中,keyFields 指定为“Name,Age”,但查询在 Name 之前使用 Age。这意味着 Params[i].Value := keyValues[i] 将不起作用。我认为无论如何仍然需要 VarRecToVariant,这是我试图避免的)。

最佳答案

替换

procedure Read(keyValues: array of const); 

procedure Read(keyValues: array of Variant); 

那么您将不需要将 TVarRec 转换为 Variant。

关于delphi - 如何在 TVarRec 和 Variant 之间进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3733640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com