我的一个朋友问我如何在运行时创建一个“映射”数据库表的类。他正在使用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;


仅当查询返回的所有字段在类中具有完全匹配的情况下,此简单示例才有效。

一个更优美的示例(由您自己决定)应首先获取类中的属性列表,然后检查返回的字段是否在类中存在。

希望这可以帮助,
莱昂纳多。

08-19 22:24