Как конвертировать между TVarRec и Variant?
существует ли стандартный способ преобразования между значениями 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 зависят от параметров в запросе. Вызывающий знает, что это такое, но метод, который использует массив, не знает, сколько или какой тип ожидать. Т. е. Я не могу изменить метод для чтения(name: string; age: integer).
- параметры не обязательно используются в том же порядке, что и значения указывается в массиве const. В Примере ключевые поля задаются как "имя, возраст", но запрос использует возраст перед именем. Это означает Params[i].Значение: = keyValues[i] не будет работать. Я думаю, что VarRecToVariant все равно будет нужен, чего я пытаюсь избежать).
1 ответов
заменить
procedure Read(keyValues: array of const);
С
procedure Read(keyValues: array of Variant);
тогда вам не нужно будет конвертировать TVarRec в Variant.