zoukankan      html  css  js  c++  java
  • (转载)根据数据字典表定义的表结构,生成创建表的SQL语句

    <来源网址:http://www.delphifans.com/infoview/Article_221.html>
    根据数据字典表定义的表结构,生成创建表的SQL语句


    //1.  类名:TJZDbSqlCreate
    //2.  父类:Tcomponent
    //3.  主要属性:
    //         DataBaseName:String //数据源。数据字典存放路径(有大小写区别)
    //         TableName:String  //  欲生成Create Table 语句的表(有大小写区别)
    //         TableType:String   //表类型,从PARADOX,ACCESS,MSSQL中选择
    //                                        (无大小写区别)
    //         Sql;Tstings   //生成的sql语句(不可见)
    //4.  功能:根据数据字典表定义的表结构,生成创建该表的Sql语句,
    //               需要考虑的字段类型包括:字符、整数、数值、日期
    //5.  使用说明:
    //         举例如下:
    //VAR  TJZDbSqlCreate1: TJZDbSqlCreate;
    //TJZDbSqlCreate 1.DataBaseName:='JY';
    //TJZDbSqlCreate1 .TableName:='SCHOOL';
    //TJZDbSqlCreate1.TableType:='MSSQL';
    //在"MSSQL","PARADOX","ACCESS"中取值;
    //TJZDbSqlCreate1.exec;
    //Memo1.lines.assign(TJZDbSqlCreate1.sql);
    //*****************************************************************************
    unit JZDBSqlCreate;
    interface
    uses
     Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Db,
     DsgnIntf, DBTables;
    type
     TJZDBSqlCreate = class(TComponent)
     private
       { Private declarations }
       FDataBaseName:string;
       FTableName:string;
       Fsql:TStrings;
       FTableType:string;
       qry: TQuery;
     protected
       { Protected declarations }
     public
       property sql:TStrings read Fsql write Fsql;  
       { Public declarations }
      constructor Create(AOwner: TComponent); override;
       destructor Destroy;override;
      procedure Exec;
     published
       { Published declarations }
       property DatebaseName:string read FDataBaseName write FDataBaseName;
       property TableName:String read FTableName write FTableName;
       property TableType:String read FTableType write FTableType;
       //ocedure Exec;
     end;

     TTableTypePropEditor = class(TStringProperty)//Property editor for DataBaseName property
     public
       procedure GetValues(Proc:TGetStrProc);override;
       function  GetAttributes:TPropertyAttributes;override;  
     end;  
    TDatebaseNameEditor = class(TStringProperty)//Property editor for DataBaseName property
     public
           procedure GetValues(Proc:TGetStrProc);override;
           function  GetAttributes:TPropertyAttributes;override;
          // function  GetName:string;override;
     end;
    procedure Register;
    implementation
    constructor TJZDBSqlCreate.Create(AOwner: TComponent);
    begin       //创建成员
    inherited Create(AOwner);
    qry:=tquery.create(SELF)
    end;
    destructor TJZDBSqlCreate.Destroy;
    begin       //清空成员
     Qry.Close;
     Qry.Free;
     Fsql.free;
     inherited;
    end;
    procedure TTableTypePropEditor.GetValues(Proc:TGetStrProc);//Get list all uknown databases
    begin
     Proc('MSSQL');
     Proc('PARADOX');
     Proc('ACCESS');
    end;

    function  TTableTypePropEditor.GetAttributes:TPropertyAttributes;
    begin
     Result:=[paValueList,paSortList,paReadOnly];
    end;
    procedure TDatebaseNameEditor.GetValues(Proc:TGetStrProc);//Get list all uknown databases
    var
     List:TStringList;
     i:Integer;
    begin
         Session.Active:=True;
         List:=TStringList.Create;
         Session.GetDatabaseNames(List);
         for i :=0  to List.Count-1 do  Proc(List.Strings[i]);
         List.Free;
         Session.Active:=False;
         Proc('MSSQL');
     Proc('PARADOX');
     Proc('ACCESS');
    end;
    function  TDatebaseNameEditor.GetAttributes:TPropertyAttributes;
    begin
    Result:=[paValueList,paSortList];
    end;
    {function  TDBNameEditor.GetName:string;
    begin
    Result:='DataBaseName';
    end;}
    procedure Register;
    begin
     RegisterPropertyEditor(TypeInfo(String),TJZDBSqlCreate,'DatabaseName',TDatebaseNameEditor);
     RegisterPropertyEditor(TypeInfo(String),TJZDBSqlCreate,'TableType',TTableTypePropEditor);
     RegisterComponents('JZ', [TJZDBSqlCreate]);
    end;
    procedure TJZDBSqlCreate.Exec;
    var SQL1,Sql2,sqlkey,sqlnokey:STRING;
        sql3:string;//字段标注
        sqltype:string;
        sqllength:string;
        sqldegigits:string;
        sqlisnull:string;
        SQLISPKEY:STRING;
        SQLDEFAULT:STRING;
    begin
    SQLISPKEY:='';
    sqlkey:='' ;
    sqlnokey:='';
    Fsql := TSTRINGlist.Create;
    qry:=tquery.create(SELF) ;
    IF (FDataBaseName='') OR  (FTableName='') OR  (FTableType='') THEN
    BEGIN
    Application.MessageBox('属性没有设置','错误提示', MB_OK);
    exit;
    END;
    IF  (trim(UPPERCASE(FTABLETYPE))='ACCESS') OR  (trim(uppercase(FTableType))='MSSQL') OR  (trim(uppercase(FTableType))='PARADOX') THEN
    ELSE
    BEGIN
    Application.MessageBox('TableType属性设置错误!','错误提示', MB_OK);
    exit;
    END;
    try
    try
    Qry.SQl.text:='SELECT Ttables.CTABNAME, Ttables.CTABMEANS, '+
    ' Ttables.CMEM, Tcolumns.CCOLNAME, Tcolumns.CCOLMEANS, Tcolumns.CCOLTYPE,'+
    ' Tcolumns.ICOLLENGTH, Tcolumns.ICOLDIGITS, Tcolumns.ICOLISPKEY, Tcolumns.ICOLISNULL,'+
    ' Tcolumns.CCOLDEFAULT FROM TTABLES.db Ttables'+
    '  INNER JOIN TCOLUMNS.db Tcolumns'+
    '  ON  (Ttables.CTABNAME = Tcolumns.CTABNAME) WHERE  Ttables.CTABNAME=:TABNAME';
    Qry.DatabaseName:=FDataBaseName;
    Qry.ParamByName('TabName').asstring:=FTableName;
    Qry.Open;
    except  ON ed:EDATABASEERROR do
    begin
    Application.MessageBox('数据字典设置错误','错误提示', MB_OK);
    exit;
    end;
    end;
    Qry.First;
    if (not (qry.eof)) and  (not ((QRY.FieldByName('CTABMEANS').asstring)=''))
    AND (NOT(trim(UPPERCASE(FTABLETYPE))='ACCESS')) then
    Sql2:='   /*'+QRY.FieldByName('CTABMEANS').asstring+'*/'+chr(13)+chr(10); //设置标题
    While Not (Qry.Eof) DO
    BEGIN
    if QRY.FieldByName('CCOLMEANS').asstring='' then
    sql3:=''
    else
    IF trim(UPPERCASE(FTABLETYPE))='ACCESS' THEN
      sql3:=''//主要因为ACCESS注释如何写有疑问?
     ELSE
       sql3:='   /*'+QRY.FieldByName('CCOLMEANS').asstring+'*/';
    //--------------------------------------------
    IF trim(UPPERCASE(FTABLETYPE))='MSSQL' THEN      
    BEGIN
    sqldegigits:='';
    //确定字段类型
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='字符' then
    sqltype:='CHAR';
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='整数' then
    sqltype:='int';
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='数值' then
    sqltype:='float';
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='日期' then
    sqltype:='datetime';
    //确定字段是否为空 0为空,1为不空
    if Qry.FieldByName('icolisNull').asinteger=0 then
    sqlisnull:='NULL'
    ELSE
    sqlisnull:='NOT NULL';
    //确定主键
    {IF Qry.FieldByName('iColIsPKey').asINTEGER=0 THEN
    SQLISPKEY:=''
    ELSE
    SQLISPKEY:='primary key';}
    IF Qry.FieldByName('iColIsPKey').asINTEGER=1 THEN
    if SQLISPKEY='' then
    SQLISPKEY:='CONSTRAINT '+Qry.FieldByName('CTABNAME').ASSTRING+ 'constraint primary key ('+Qry.FieldByName('cCOLname').asstring
    else
     SQLISPKEY:= SQLISPKEY+','+Qry.FieldByName('cCOLname').asstring;

    //确定缺省
    IF trim(uppercase(Qry.FieldByName('ccolDefault').asstring))<>'' THEN
    begin
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='字符' then
    SQLDEFAULT:='default '''+ Qry.FieldByName('ccolDefault').asstring+''''
    else
    SQLDEFAULT:='default '+Qry.FieldByName('ccolDefault').asstring;
    end
    else
    SQLDEFAULT:='';
    // 确定字段长度
    IF (trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='整数') or
    (trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='日期') or
     (trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='数值') then
    sqllength:=''
    else
    sqllength:='('+Qry.FieldByName('icollength').asstring+')';
    Sql1:=sql1+' '+Qry.FieldByName('cCOLname').asstring+' '+sqltype+
    ' '+sqllength+
    ' '+sqldegigits+
    ' '+sqlisnull+
    ' '+SQLDEFAULT ;
    Qry.NEXT;
    //
    if not(qry.eof) then
    sql1:=sql1+','+sql3+CHR(13)+chr(10)
    else
    if SQLISPKEY='' then
     sql1:=sql1+sql3+CHR(13)+chr(10)
      else
       sql1:=sql1+','+sql3+CHR(13)+chr(10);
    end;//mssql第一个if
    //------------------------------------
    //paracox
    IF trim(UPPERCASE(FTABLETYPE))='PARADOX' THEN      
    BEGIN

    //确定小数点位置
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='数值' then
     begin
       if  QRY.FieldByName('icoldigits').asstring='' then
             sqldegigits:=',0)'
        else
             sqldegigits:=','+QRY.FieldByName('icoldigits').asstring+')' ;
      end
     else
       IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='字符' then
            sqldegigits:=')'
       else
       sqldegigits:='';
    //确定字段类型
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='字符' then
    sqltype:='character';
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='整数' then
    sqltype:='integer';
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='数值' then
    sqltype:='float';
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='日期' then
    sqltype:='date';
    //确定字段是否为空 0为空,1为不空
    {if Qry.FieldByName('icolisNull').asinteger=0 then  //有疑问
    sqlisnull:='NULL'
    ELSE
    sqlisnull:='NOT NULL';}
    sqlisnull:='';
    //确定主键
    IF Qry.FieldByName('iColIsPKey').asINTEGER=1 THEN
    if SQLISPKEY='' then
    SQLISPKEY:='primary key ('+Qry.FieldByName('cCOLname').asstring
    else
     SQLISPKEY:= SQLISPKEY+','+Qry.FieldByName('cCOLname').asstring;
    //

    SQLDEFAULT:='';
    // 确定字段长度
    IF (trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='整数') or
    (trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='日期') then
    sqllength:=''
    else
    sqllength:='('+Qry.FieldByName('icollength').asstring;
    //
    if Qry.FieldByName('iColIsPKey').asINTEGER=1 THEN
        begin
    Sqlkey:=sqlkey+' '+Qry.FieldByName('cCOLname').asstring+' '+sqltype+
    ' '+sqllength+
    ' '+sqldegigits+
    ' '+sqlisnull+
    ' '+SQLDEFAULT;
        end
    else
       begin
    Sqlnokey:=sqlnokey+' '+Qry.FieldByName('cCOLname').asstring+' '+sqltype+
    ' '+sqllength+
    ' '+sqldegigits+
    ' '+sqlisnull+
    ' '+SQLDEFAULT;
        end ;
    Qry.NEXT;
    //
    if not(qry.eof) then
    begin//11
       IF Qry.FieldByName('iColIsPKey').asINTEGER=1 THEN
             begin if sqlkey<>'' then sqlkey:=sqlkey+','+CHR(13)+chr(10) end
       else
            begin if sqlnokey<>'' then sqlnokey:=sqlnokey+','+CHR(13)+chr(10); end;
    end //11
    else
    begin//2
      if SQLISPKEY='' then
        begin//21
          if (sqlnokey<>'') and (sqlkey<>'') then
          sql1:=sqlkey+','+CHR(13)+chr(10)+sqlnokey
          else
            begin
            if sqlkey='' then sql1:=sqlnokey+CHR(13)+chr(10);
            if sqlnokey='' then sql1:=sqlkey+CHR(13)+chr(10);
            end;
        end//21
     else
       begin//22
          if (sqlnokey<>'') and (sqlkey<>'') then
          sql1:=sqlkey+','+CHR(13)+chr(10)+sqlnokey+','+CHR(13)+chr(10)
          else
            begin
            if sqlkey='' then sql1:=sqlnokey+CHR(13)+chr(10);
            if sqlnokey='' then sql1:=sqlkey+CHR(13)+chr(10);
            end;
       end;//22
    end//2

    {if SQLISPKEY='' then
     sql1:=sql1+sql3+CHR(13)+chr(10)
      else
       if sqlnokey<>'' then
       sql1:=sqlkey+','+sql3+CHR(13)+chr(10); }
    end;//PARADOX第一个if
    //-----------------------------------
    IF trim(UPPERCASE(FTABLETYPE))='ACCESS' THEN      
    BEGIN
    //确定小数点位置
    {IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='数值' then
     begin
       if  QRY.FieldByName('icoldigits').asstring='' then
             sqldegigits:=',0)'
        else
             sqldegigits:=','+QRY.FieldByName('icoldigits').asstring+')' ;
      end
     else }
       IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='字符' then
            sqldegigits:=')'
       else
       sqldegigits:='';
    //确定字段类型
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='字符' then
    sqltype:='char';
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='整数' then
    sqltype:='integer';
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='数值' then
    sqltype:='float';
    IF trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='日期' then
    sqltype:='datetime';
    //确定字段是否为空 0为空,1为不空
    if Qry.FieldByName('icolisNull').asinteger=0 then
    sqlisnull:='NULL'
    ELSE
    sqlisnull:='NOT NULL';
    //确定主键
    IF Qry.FieldByName('iColIsPKey').asINTEGER=1 THEN
    if SQLISPKEY='' then
    SQLISPKEY:='CONSTRAINT '+Qry.FieldByName('CTABNAME').ASSTRING+ 'constraint primary key ('+Qry.FieldByName('cCOLname').asstring
    else
     SQLISPKEY:= SQLISPKEY+','+Qry.FieldByName('cCOLname').asstring;
    SQLDEFAULT:='';
    // 确定字段长度
    IF (trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='整数') or
    (trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='日期') OR
     (trim(Uppercase(QRY.FieldByName('cCOLTYPe').asstring))='数值') then
    sqllength:=''
    else
    sqllength:='('+Qry.FieldByName('icollength').asstring;
    //
    Sql1:=sql1+' '+Qry.FieldByName('cCOLname').asstring+' '+sqltype+
    ' '+sqllength+
    ' '+sqldegigits+
    ' '+sqlisnull+
    ' '+SQLDEFAULT;
    Qry.NEXT;
    //

    if not(qry.eof) then
    sql1:=sql1+','+sql3+CHR(13)+chr(10)
    else
    if SQLISPKEY='' then
     sql1:=sql1+CHR(13)+chr(10)
      else
       sql1:=sql1+','+CHR(13)+chr(10);
    end;//
    //ACCESS第一个if  
    //-----------------------------

    end; //while
    if sql1='' then
    begin
    Application.MessageBox('数据字典记录为空!','错误提示', MB_OK);
    exit ;
    end ;
    if SQLISPKEY<>'' then
      sql1:=sql1+SQLISPKEY+')'+CHR(13)+chr(10);
    IF trim(UPPERCASE(FTABLETYPE))='PARADOX' THEN
      begin
      {if SQLISPKEY<>'' then
      sql1:=sql1+SQLISPKEY+')'+CHR(13)+chr(10);}
     
      sql1:='create table "'+FTableName+'.db"'+CHR(13)+chr(10)+'('+chr(13)+chr(10)+sql1 +')'  
      end
    else
    sql1:='create table '+FTableName+CHR(13)+chr(10)+'('+chr(13)+chr(10)+sql1 +')'  ;
    sql1:=sql2+sql1;
    fsql.ADD(sql1);
    except
    Fsql.FREE;
    qry.FREE;
    end
    end;
    end.
    (出处:www.delphibbs.com)

  • 相关阅读:
    介绍一款能取代 Scrapy 的 Python 爬虫框架
    盘点 Django 展示可视化图表的多种方式(建议收藏)
    阿里最强 Python 自动化工具开源了!
    推荐一款小众且好用的 Python 爬虫库
    该死的端口占用!教你用 Shell 脚本一键干掉它!
    字节跳动实习面经分享(已拿offer附攻略)
    这样给小白讲原码、反码、补码,帮她彻底解决困扰了三天的问题
    并查集是一种怎样的数据结构?
    约瑟夫环问题的三种解法,一文搞定
    数据结构:栈详解
  • 原文地址:https://www.cnblogs.com/angelbd/p/3386510.html
Copyright © 2011-2022 走看看