传入数据集,生成对应表的sql脚本

delphi的,传入数据集,生成他的sql脚本。

//根据数据源结构创建ACCESS表1:生成脚本
Function CreateAccessTable(dSource:TDataSet;
    sTableName:String; sIgnoreFields:Array of String):String;
Var SQL:TStringList;
    oField:TField;
    i, n:Integer;
    sF:String;
Begin
    Result:=‘‘;
    SQL:=TStringList.Create;
    With SQL do
    Try
        n:=0;
        //
        SQL.Text:=‘Create Table ‘+sTableName+‘ ‘;
        SQL.Add(‘( ‘);
        For i:=0 to dSource.FieldCount-1 do Begin
            oField:=dSource.Fields[i];
            if IndexOfStrArray(oField.FieldName,sIgnoreFields)>=0 then Continue;
            //
            if n>0 then sF:=‘,‘ else sF:=‘‘;
            sF:=sF+oField.FieldName+‘ ‘+GetFieldTypeString(oField)+‘ Null‘;
            SQL.Add(‘    ‘+sF);
            Inc(n);
        End;
        //添加主键
        //sql.add(‘, Primary Key(sStoreID, sItemID) ‘);
        //结束
        SQL.Add(‘) ‘);
        //完成
        Result:=SQL.Text;
        SQL.Free;
    Except
        On E:Exception do Begin
            Try SQL.Free; Except End;
            Raise Exception.Create(‘[CreateAccessTable-1]创建ACCESS表‘+sTableName+‘出错!‘+#13+E.Message);
        End;
    End;
End;
//创建ACCESS表,执行2
Function CreateAccessTable(dSource:TDataSet; Qry_Access:TAdoQuery; sTableName:String;
    sIgnoreFields:Array of String; lTryDropExist:Boolean=True):Boolean;  OverLoad;
label lbl_iProcEnd;
Var Qry:TAdoQuery;                    s, s2, sScript, sError:String;
    i:integer;
    L, lTrans:Boolean;
Begin
    Result:=False;                    Qry:=Qry_Access;
    With Qry do
    Try
        sError:=‘‘;
        //检查是否存在此表
        L:=TableExists(connection, sTableName);
        //删除原表,检查有无此表
        If lTryDropExist then begin
            Close;
            If lTryDropExist And ((Qry.ConnectionString=‘‘) And (Not Qry.Connection.InTransaction)) then Begin
                Connection.BeginTrans;
                lTrans:=True;
            End;
            //找到了,删除
            if L then Try DoSQL(Qry,‘Drop Table ‘+sTableName);  Except On E:Exception do ; End;
          end
        else if L then begin                        //不用删除,已经有表了,忽略
            goto lbl_iProcEnd;
        end;
        //创建表
        sScript:=CreateAccessTable(dSource,sTableName,sIgnoreFields);
        if sScript=‘‘ then Raise Exception.Create(‘[CreateAccessTable-1-2]生成脚本出错!‘);
        SQL.Text:=sScript;
        {$IFDef DebugClipBoard} clipBoard.asText:=sql.text;   {$EndIF}    //调试
        ExecSQL;
        //
    lbl_iProcEnd:
        if lTrans then Connection.CommitTrans;
        Result:=True;
    Except
        On E:Exception do Begin
            if lTrans then Connection.RollbackTrans;
            sError:=‘[CreateAccessTable-2]执行ACCESS表‘+sTableName+‘创建出错!‘+#13+E.Message;
        End;
    End;
    if sError<>‘‘ then Raise Exception.Create(sError);
End;
//创建Access数据库
Function CreateAccessDB(sFileName:String; sPassWord:String=‘‘): Boolean;
Const //默认语言标志Locale Identifier=2057
    sOleLink=‘Provider=Microsoft.Jet.OLEDB.4.0;Locale Identifier=2057;Data Source= %s ;Jet OLEDB:Database Password= %s‘;
Var
    CreateAccess: OleVariant;
Begin
    Result := False;
    Try
        CreateAccess := CreateOleObject(‘ADOX.Catalog‘);
        CreateAccess.Create(Format(sOleLink,[sFileName,sPassWord]));
        CreateAccess:=null;
        Result := True;
    Except
        On E:Exception do Raise Exception.Create(‘[CreateAccessDB]创建MDB数据库‘+sFileName+‘出错!‘+#13+E.message);
    End;
End;
//创建一个新字段
function createNewField(oDB:TDataSet; sFieldName:String; oType:TFieldType; nSize:integer=-1):TField;
var d:TDataSet;
begin
    result:=nil;            d:=oDB;
    case oType of
        ftString    : result:=TStringField.Create(d);
        ftInteger   : result:=TIntegerField.Create(d);
        ftFloat     : result:=TFloatField.Create(d);
        ftBoolean   : result:=TBooleanField.Create(d);
        ftDateTime  : result:=TDateTimeField.Create(d);
    end;
    result.FieldName:=sFieldName;
    if nSize>0 then result.Size:=nSize;
    //result.SetFieldType(oType);
    //result.DefaultExpression:=‘‘;     //默认值
    //必须设置其所在数据集,放在最后一行不易出错
    result.DataSet:=d;
end;
//返回字段的类型字符串
Function GetFieldTypeString(oField:TField):String;
Var n:Integer;    s:String;
Begin
    Result:=‘‘;
    Try
        n:=oField.Size;     s:=‘‘;
        //
        if oField is TStringField then Begin
            if n>nAccessStringMaxLength then
                s:=‘Memo‘
            Else begin
                n:=nAccessStringMaxLength;
                s:=‘VarChar(‘+Inttostr(n)+‘)‘;
            End;
          End
        Else if oField is TLargeintField then
            s:=‘Int‘
        Else if oField is TSmallIntField then
            s:=‘Int‘
        Else if oField is TIntegerField then
            s:=‘Int‘
        Else if oField is TNumericField then
            s:=‘Numeric(20,4)‘
        Else if oField is TBooleanField then
            s:=‘Bit‘
        Else if oField is TBlobField then
            s:=‘Image‘
        Else if oField is TDateTimeField then
            s:=‘DateTime‘
        Else if oField is TBinaryField then
            s:=‘Binary‘
        Else if oField is TMemoField then
            s:=‘Memo‘
        Else
            s:=‘VarChar(50)‘;
        //
        Result:=Trim(s);
    Except
        On E:Exception do Raise Exception.Create(‘[GetFieldTypeString]获取字段类型描述出错‘+#13+E.Message);
    End;
End;

原文地址:https://www.cnblogs.com/HaiHong/p/9363314.html

时间: 2024-10-12 19:26:24

传入数据集,生成对应表的sql脚本的相关文章

MySQL必知必会-官方数据库表及SQL脚本导入生成

最近在复习SQL语句,看的是MySQL必知必会这本书,但是发现附录中只有表设计,没有表的具体数据.所以在学习相应的语句中体验不是很好,去网上查了数据库的内容,自己慢慢导入到了数据库中.把表放出来作为参照,SQL脚本语句放在最后,可以直接导到自己的数据库. customer表 cust_id cust_name cust_address cust_city cust_state cust_zip cust_country cust_contact cust_email 10001 Coyote I

oracle生成多表触发器sql

--将所有HY开头的表都生成一个更新触发器的脚本('/'是为了连续创建多个触发器而不报错)select 'CREATE OR REPLACE TRIGGER '||table_name||' BEFORE UPDATE on '||table_name||' REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW DECLARE BEGIN IF updating THEN :NEW.C_UPDATE_TIME:= SYSDATE; IF :NEW.C_DA

如何通过sql语句快速生成 删除表的sql

select 'drop table '+name tablename from sysobjects where xtype='U' and name like 'ta_bsk%' 备注: 从系统表(sysobjects)中查询类型是用户表(xtype='U')表名以ta_bsk开头的表名(name like '%ta_bsk%'),拼接上'drop table'就生成了我想要的sql语句了.哈哈

MSSQL生成整个数据库的SQL脚本的工具 scptxfr.exe

scptxfr.exe的路径要正确declare @cMd varchar(1000)set @cmd = 'master.dbo.xp_cmdshell ' + '''c:\"Microsoft ' +'SQL Server"' +'\MSSQL\Upgrade\scptxfr.exe ' +' /s YourServerName /p YourSAPassword /I /d YourDBName /f ' +'c:\YourDBName.sql'''exec (@cmd) 工具参

SQL_使用DBMS_METADATA.GET_DDL生成建表语句

原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明以下出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/43988377 今天在群里学来一着,通过DBMS_METADATA.GET_DDL来生成建表或视图的sql语句. (1).生成创建表的sql语句 SQL> set long 20000; SQL> SELECT DBMS_METADATA.GET_DDL('

FineUI之使用SQL脚本从数据库表中生成相应的输入控件

在WEB开发时,经常需要依据数据库表中的字段建立相应的输入控件,来获取输入的数据.每次都需要按字段来敲,显然太低效,而且容易出错.这里提供一个SQL脚本生成相应输入控件的方法. USE DBDemo DECLARE @TEMP_TABLE_NAME NVARCHAR(512) DECLARE @WIDTH NVARCHAR(50) SET @TEMP_TABLE_NAME='Stuff' SET @WIDTH='200' SELECT '<f:'+TOKEN+' runat="server

FineUI之使用SQL脚本从数据库表中生成对应的输入控件

在WEB开发时.常常须要根据数据库表中的字段建立对应的输入控件,来获取输入的数据.每次都须要按字段来敲,显然太低效.并且easy出错.这里提供一个SQL脚本生成对应输入控件的方法. USE DBDemo DECLARE @TEMP_TABLE_NAME NVARCHAR(512) DECLARE @WIDTH NVARCHAR(50) SET @TEMP_TABLE_NAME='Stuff' SET @WIDTH='200' SELECT '<f:'+TOKEN+' runat="serv

(转)SQL SERVER 生成建表脚本

https://www.cnblogs.com/champaign/p/3492510.html /****** Object: StoredProcedure [dbo].[GET_TableScript_MSSQL] Script Date: 06/15/2012 11:59:00 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO/*====================================================

PowerDesigner生成sql脚本

1.打开PowerDesigner->New Project; 2.填写项目名称,选择文件的存放路径: 3.新建一个模型,New Model: 4.选择概念模型,填写模型名称: 5.选择entity,创建实体模型: 6.点击模型图,填写表结构信息: 时间类型的数据格式说明: 对于创建过程中出现相同字段的情况处理: 更改前: 更改后: 7.将表结构创建完成后,进行表之间的关联,点击relationship将表与表直接关联起来: 选择表与表之间的关系: 8.生成物理模型图: 选择数据库类型 软件会自