我的一个朋友问我如何在运行时创建一个"映射"数据库表的类.他正在使用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;
Run Code Online (Sandbox Code Playgroud)
现在,做一个查询:
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;
Run Code Online (Sandbox Code Playgroud)
此简单示例仅在查询返回的所有字段在类中具有完全匹配时才有效.
更优秀的示例(由您决定)应首先获取类中的属性列表,然后检查返回的字段是否存在于类中.
希望这会有所帮助,莱昂纳多.