我的一个朋友问我如何在运行时创建一个“映射”数据库表的类。他正在使用ADO连接到数据库。
我的回答是,他可以用“从table_name中选择第一行”填充ADOQuery,设置与数据库的连接,打开查询,然后在ADOQuery.Fields上使用一个循环,然后获取所有的FieldName和FieldType。表中的字段。这样,他就可以将表中的所有字段及其类型作为类的成员。
还有其他解决方案可以解决他的问题吗?
最佳答案
@RBA,一种方法是将要映射的类的属性定义为“已发布”,然后使用RTTI循环遍历属性并将数据集行分配给每个属性。
例:
TMyClass = class
private
FName: string;
FAge: Integer;
published
property Name: string read FName write FName;
property Age: Integer read FAge write FAge;
end;
现在,执行查询:
myQuery.Sql.Text := 'select * from customers';
myQuery.Open;
while not myQuery.Eof do
begin
myInstance := TMyClass.create;
for I := 0 to myQuery.Fields.Count - 1 do
SetPropValue(myInstance, myQuery.Fields[I].FieldName, myQuery.Fields[I].Value);
// now add myInstance to a TObjectList, for example
myObjectList.Add(myInstance);
Next;
end;
仅当查询返回的所有字段在类中具有完全匹配的情况下,此简单示例才有效。
一个更优美的示例(由您自己决定)应首先获取类中的属性列表,然后检查返回的字段是否在类中存在。
希望这可以帮助,
莱昂纳多。