根据SQL语句生成类代码
//根据SQL生成类代码
function TdmImg.GenClassFromSQL(vSQL: string; vZTCode: string = ''; vTypeName: string = ''): string;
var
qryTemp: TOnedataSet;
iField, iLen: integer;
lField: TField;
lFieldType: string;
lPrivateDefs: TStringList;
lPublishedDefs: TStringList;
lResult :TStringList;
begin
Result := '';
qryTemp := TOneDataSet.Create(self);
if vTypeName = '' then
begin
if Pos('where', vSQL) > 0 then
vTypeName := 'T' + Trim(Copy(vSQL, Pos('from', vSQL) + 4, Pos('where', vSQL) - Pos('from', vSQL) - 4))
else
vTypeName := 'T' + Trim(Copy(vSQL, Pos('from', vSQL) + 4, Length(vSQL) - Pos('from', vSQL) - 3));
end;
if vZTCode <> '' then
qryTemp.DataInfo.ZTCode := vZTCode;
qryTemp.SQL.Text := vSQL;
if not qryTemp.OpenData then
begin
Result := qryTemp.DataInfo.ErrMsg;
qryTemp.Free;
Exit;
end;
lResult := TStringList.Create;
lPrivateDefs := TStringList.Create;
lPublishedDefs := TStringList.Create;
try
for iField := 0 to qryTemp.Fields.Count - 1 do
begin
lField := qryTemp.Fields[iField];
case lField.DataType of
ftString, ftMemo, ftFmtMemo, ftWideString, ftFixedWideChar, ftWideMemo, ftGuid, ftOraInterval:
begin
lFieldType := 'string';
end;
ftBoolean:
begin
lFieldType := 'boolean';
end;
ftSmallint, ftInteger, ftWord, ftAutoInc, ftShortint, ftLongWord:
begin
lFieldType := 'integer';
end;
ftLargeint:
begin
lFieldType := 'int64';
end;
ftFloat, ftCurrency, ftBCD, ftFMTBcd, ftExtended, ftSingle:
begin
lFieldType := 'double';
end;
ftBytes, ftVarBytes, ftBlob, ftGraphic, ftTypedBinary, ftOraBlob, ftOraClob:
begin
lFieldType := 'string';
end;
ftTimeStamp, ftDateTime:
begin
lFieldType := 'TDateTime';
end
else
begin
lFieldType := 'string';
end;
end;
lPrivateDefs.Add(lField.FieldName + '_: ' + lFieldType + ';');
lPublishedDefs.Add('property ' + lField.FieldName + ': ' + lFieldType +
' read ' + lField.FieldName + '_' + ' write ' + lField.FieldName + '_' + ';');
end;
lResult.Add('//SQL:'+vSQL);
lResult.Add('//ZTCode:'+vZTCode);
lResult.Add('T'+vTypeName+' = class');
lResult.Add('private');
for iLen := 0 to lPrivateDefs.Count - 1 do
begin
lResult.Add(' ' + lPrivateDefs.Strings[iLen]);
end;
lResult.Add('published');
for iLen := 0 to lPublishedDefs.Count - 1 do
begin
lResult.Add(' ' + lPublishedDefs.Strings[iLen]);
end;
lResult.Add('end;');
finally
result := lResult.Text;
qryTemp.Free;
lResult.Free;
lPrivateDefs.Free;
lPublishedDefs.Free;
end;
end;
发表评论 取消回复