(转载)根据数据字典表定义的表结构,生成创建表的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)