根据SQL语句生成类代码


E0J75S5%FNG$B9LLR94~}TQ

)IP$OENVQ8((Z)KJK_JN)PH


//根据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;



点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部