<来源网址: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)

(转载)根据数据字典表定义的表结构,生成创建表的SQL语句的更多相关文章

  1. Mysql下在某一列后即表的某一位置添加新列的sql语句

    Mysql简介 MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司.MySQL被广泛地应用在Internet上的中小型网站中.由于其体积小.速度快.总体拥有成本低,尤 ...

  2. Oracle常用操作——创建表空间、临时表空间、创建表分区、创建索引、锁表处理

    摘要:Oracle数据库的库表常用操作:创建与添加表空间.临时表空间.创建表分区.创建索引.锁表处理 1.表空间 ■  详细查看表空间使用状况,包括总大小,使用空间,使用率,剩余空间 --详细查看表空 ...

  3. 查询某张表被哪些存储过程或者视图用到的sql语句

    /*查询某张表被哪些存储过程或者视图用到的sql语句*/select distinct object_name(id) from syscomments where id in (select id ...

  4. activiti自己定义流程之自己定义表单(二):创建表单

    注:环境配置:activiti自己定义流程之自己定义表单(一):环境配置 在上一节自己定义表单环境搭建好以后,我就正式開始尝试自己创建表单,在后台的处理就比較常规,主要是针对ueditor插件的功能在 ...

  5. 【VBA】EXCEL通过VBA生成SQL,自动生成创建表结构SQL

    原文:https://blog.csdn.net/zutsoft/article/details/45441343 编程往往与数据库密不可分,一个项目往往有很多的表,很多时候通过excel来维护表结构 ...

  6. SQL语句创建数据库,SQL语句删除数据库,SQL语句创建表,SQL语句删除表,SQL语句添加约束,SQL语句删除约束

    创建数据库: CREATE DATABASE Test --要创建的数据库名称 ON PRIMARY ( --数据库文件的具体描述 NAME='Test_data', --主数据文件的逻辑名称 FIL ...

  7. 基于ORACLE建表和循环回路来创建数据库存储过程SQL语句来实现

    一个.概要 在实际的软件开发项目.我们经常会遇到需要创造更多的相同类型的数据库表或存储过程时,.例如.假设按照尾号点表的ID号,然后,你需要创建10用户信息表,的用户信息放在同一个表中. 对于类型同样 ...

  8. C语言实现顺序表的基本操作(从键盘输入 生成线性表,读txt文件生成线性表和数组生成线性表----三种写法)

    经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1. 线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2. 采用的实现方式:一段地 ...

  9. activiti自定义流程之自定义表单(二):创建表单

    注:环境配置:activiti自定义流程之自定义表单(一):环境配置 在上一节自定义表单环境搭建好以后,我就正式开始尝试自己创建表单,在后台的处理就比较常规,主要是针对ueditor插件的功能在前端进 ...

随机推荐

  1. 在Linux里读取UBOOT环境变量

    转载:http://falloutmx.blog.163.com/blog/static/39236020201211145010154/ 可以通过mtd方式读取,也可以用ioremap方式.不过这些 ...

  2. Eclipse配置C/C++开发环境

    开发环境:Eclipse3.2.CDT3.1.MinGW5.1 1.Eclipse及CDT的安装到Eclipse的官方网站http://www.eclipse.org上下载Eclipse.安装CDT. ...

  3. python学习笔记 class

    在这段时间中学习python在里面绕来绕去晕了. class和其他的语言都差不多,但是我理解中其实class和function差不多,只是将function封装起来. 在python中第一个class ...

  4. 炼数成金hadoop视频干货05

    视频地址:http://pan.baidu.com/s/1dDEgKwD 这一节是讲师助教带着动手操作写简单的开发环境的部署和两个实例 开发环境的部署:http://www.cnblogs.com/a ...

  5. Asp.Net 之 网页快照

    此文做法不是 Control.DrawToBitmap ,而是直接QueryInterface 浏览器Com对象的 IViewObject 接口,用它实现的Draw方法,画到图像上. 首先,定义IVi ...

  6. C语言第四节数据类型、常量、变量

    数据 什么是数据 生活中时时刻刻都在跟数据打交道,比如体重数据.血压数据.股价数据等.在我们使用计算机的过程中,会接触到各种各样的数据,有文档数据.图片数据.视频数据,还有聊QQ时产生的文字数据.用迅 ...

  7. Cable master

    Description Inhabitants of the Wonderland have decided to hold a regional programming contest. The J ...

  8. C#动态引用DLL的方法

    C#编程中,使用dll调用是经常的事,这样做的好处是非常多的,比如把某些功能封装到一个dll中,然后主程序动态调用这个dll. 废话不多说,举例说明如下. 首先,我们需要封装一个dll,vs2008下 ...

  9. template和templateUrl区别与联系

    templateUrl其实根template功能是一样的,只不过templateUrl加载一个html文件,template后面根的是html的标签. .state('menu.about', { u ...

  10. saltstack实战2--远程执行之模块(Modules)

    本来转自http://www.cnblogs.com/MacoLee/p/5753640.html  版权归原作者所有 说明 salt '*' sys.list_modules #列出当前版本支持的模 ...