根据数据字典表定义的表结构,生成创建表的SQL语句 |
日期:2004年12月12日 作者:jackgao 人气:4236 查看:[大字体 中字体 小字体] |
//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. |