1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
type
RFieldDef=Record
FieldName: String;
FieldType: TFieldType;
FieldSize: Integer;
end;
type
AFieldDef= Array of RFieldDef;
function TForm2.GetFieldType(sSelect:WideString):AFieldDef;
var
DSet: TADODataSet;
MyAFieldDef: AFieldDef;
i: Integer;
begin
SetLength(MyAFieldDef,0);
DSet:=TADODataSet.Create(Owner);
DSet.Connection:=ADOConnection1;
DSet.CommandText:=sSelect;
DSet.Open;
SetLength(MyAFieldDef,DSet.FieldCount);
for i := 0 to DSet.FieldCount- 1 do
begin
MyAFieldDef[i].FieldName:=DSet.Fields.Fields[i].FieldName;
MyAFieldDef[i].FieldType:=DSet.FieldDefs.Items[i].DataType;
MyAFieldDef[i].FieldSize:=DSet.FieldDefs.Items[i].Size;
end;
DSet.Close;
RESULT:=MyAFieldDef; {RESULT}
SetLength(MyAFieldDef,0);
end;
procedure AddMyField2(DSet: TADODataSet; MyFieldDef: RFieldDef); overload;
var
T: TStringField;
TW: TWideStringField;
begin
case MyFieldDef.FieldType of
ftString, ftFixedChar:
begin
T :=TStringField.Create(nil);
T.FieldName := MyFieldDef.FieldName;
T.Size:=MyFieldDef.FieldSize;
T.Name := DSet.Name + T.FieldName;
T.Index := DSet.FieldCount;
T.DataSet := DSet;
DSet.FieldDefs.UpDate;
end;
ftWideString, ftFixedWideChar:
begin
TW := TWideStringField.Create(nil);
TW.FieldName := MyFieldDef.FieldName;
TW.Size:=MyFieldDef.FieldSize;
TW.Name := DSet.Name + TW.FieldName;
TW.Index := DSet.FieldCount;
TW.DataSet := DSet;
DSet.FieldDefs.UpDate;
end;
end;
end;
procedure AddMyField2(DSet: TADODataSet; CSet: TClientDataSet; MyFieldDef: RFieldDef); overload;
var
T: TStringField;
TC: TStringField;
TW: TWideStringField;
TWC: TWideStringField;
begin
case MyFieldDef.FieldType of
ftString, ftFixedChar:
begin
T:=TStringField.Create(nil);
T.FieldName := MyFieldDef.FieldName;
T.Size:=MyFieldDef.FieldSize;
T.Name := DSet.Name + T.FieldName;
T.Index := DSet.FieldCount;
T.DataSet := DSet;
DSet.FieldDefs.UpDate;
TC:=TStringField.Create(nil);
TC.FieldName := MyFieldDef.FieldName;
TC.Size:=MyFieldDef.FieldSize;
TC.Name := CSet.Name + TC.FieldName;
TC.Index := CSet.FieldCount;
TC.DataSet := CSet;
CSet.FieldDefs.UpDate;
end;
ftWideString, ftFixedWideChar:
begin
TW:= TWideStringField.Create(nil);
TW.FieldName := MyFieldDef.FieldName;
TW.Size:=MyFieldDef.FieldSize;
TW.Name := DSet.Name + TW.FieldName;
TW.Index := DSet.FieldCount;
TW.DataSet := DSet;
DSet.FieldDefs.UpDate;
TWC:= TWideStringField.Create(nil);
TWC.FieldName := MyFieldDef.FieldName;
TWC.Size:=MyFieldDef.FieldSize;
TWC.Name := CSet.Name + TWC.FieldName;
TWC.Index := CSet.FieldCount;
TWC.DataSet := CSet;
CSet.FieldDefs.UpDate;
end;
end;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
MyAFieldDef: AFieldDef;
i: Integer;
begin
if ClientDataSet1.Active then ClientDataSet1.Close;
MyAFieldDef:=GetFieldType('SELECT code,val,description FROM app_info LIMIT 1;');
for i:=0 to length(MyAFieldDef)- 1 do
begin
AddMyField2(ADODataSet1,ClientDataSet1,MyAFieldDef[i]);
end;
ClientDataSet1.Open;
end; |
Partager