zoukankan      html  css  js  c++  java
  • 使用 VCL BDE 组件动态创建数据库表 北极星

    delphi 数据库的动态建立

    下面以最常见的Dbase数据库为例来配置Delphi的数据库引擎BDE。
    1. 进入Delphi的集成开发环境IDE(Integrated Development Environment),在Database菜单下选择Explore,出现SQL Explorer窗体,在Object菜单下选择BDE Administrator。
    2. 出现BDE Administrator窗体后在Database页上选择Dbase,在Definition页中将Type项设为Standard;将Default Driver项设为Dbase;将Path项设为一工作目录名(如:D:\MYNAME)。以上过程即为数据库的别名(Aliases)设置,这在以后Delphi的程序开发过程
    中要经常用到。
    3. 选择Configration页,在Drivers的Native项中选择Dbase,在Definition页中将Type项设为File;将Langdriver项设为DBASE CHS CP936;将Level项设为5。这一步最重要,不然中文字段会是乱码。
    4. 完成上述工作后,在Object菜单中选择Save as Configration,按出现的对话框要求将以上的设置保存好。至此,数据库的基本配置工作就完成了,我们就可以进行下面的工作了。

    定义标准数据库:

          定义数据库时,数据库文件信息和数据库结构信息是必需的,如数据库文件的完整路径,数据库类型,数据库的字段名、类型、长度等。在delphi程序中可以定义标准类型的数据库,DBASE数据库、FOXPOR 数据库、Paradox数据库、ASCII数据库。

     ***************************************************************************************************************************************************************************

     方法一  使用:TTable 建立。

    VCL 中有一个 TtableCreat 的方法 ,调用它就可以创建一个数据库表。操作步骤如下 :

     1)  创建一个 T Ta b l e  实例。

     2)  将其 D a t a b a s e N a m e  属性设为一个目录或已有的数据库别名。

     3)  通过 Ta b l e N a m e  属性来指定数据库表的名称 ,要求是唯一的。

     4)  设置 TableType  属性以指明要创建的数据库表类型。如果此属性设为 ttDefault,表示数据库表的类型对应于 TableName  属性中给出的扩展名。例如 ,.DB  后缀表示是 Paradox  表 ,.DBF  后缀表示是 dBASE  表。

     5)  调用 T Ta b l e . F i e l d D e f s  对象的 A d d ( ) 方法 ,向数据库表中添加字段 ,A d d ( ) 方法有 4  个参数 :

     ·   一个字符串类型的参数 ,用于指定字段名称。

     ·   一个 T F i e l d Ty p e  类型的参数 ,用于指定字段类型。

     ·   一个 Wo r d  类型的参数 ,用于指定字段的尺寸。要注意 ,此参数只对 S t r i n g  类型和 M e m o  类型的字段适用 ,而整型、时期等类型字段的大小通常是固定的 ,所以不需要定义指定字段的尺寸。

     ·   一个布尔型的参数 ,用于表明字段的值是否必须非空。对于强制非空的字段来说 ,在把记录提交到数据库表中时 ,都必须有值。

     6)  如果要为数据库表建立一个索引 ,则需要调用 Ta b l e . I n d e x D e f s  对象的 A d d ( ) 方法来定义索引字段。 I n d e x D e f s . A d d ( ) 方法需要传递以下三个参数 :

     ·   一个字符串类型的参数 ,用于指定索引的名称。

     ·   一个字符串类型的参数 ,用于指定索引字段的名称。如果是复合索引 ,可以用分号把多个字段隔开。

     ·   一个 T I n d e x O p t i o n s  类型的参数 ,用于指定索引类型。

     7)        调用 T Ta b l e  的 C r e a t e Ta b l e ( ) 。

     示例如下:

     procedure CreateDB();

      var table1:TTable;

     begin

         table1:=ttable.create(self);

         with table1 do

         begin

             active:=false;

             DatabaseName:='c:\';{预定义的别名数据库工作区名}

             tablename:='ljh1.db'; {将定义的数据库名}

             tabletype:=ttparadox;

             {数据库类型,可为

              ttDefault=tabletype(0),

              ttParadox=tabletype(1),

              ttDbase=tabletype(2),

              ttFoxpro=tabletype(3),

              ttASCII=tabletype(4)}

             {tabletype属性为ttDefault表示数据库类型与TableName指定值的扩展名对应}

             with fielddefs do {数据库结构信息:此方法为ljh.db增加字段}

             {调用TTable.FidldDefs对象的Add方法向数据库表中添加字段。

         Add有4个参数:

         字段名:string。

         字段类型:TfieldType。

         TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord,
        ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime,
        ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo,
        ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString,
        ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob,
        ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd);

         字段大小:Word。一般只对String和Memo类型使用。

         字段是否NotNull: Boolean。

              }

             begin

                 clear;

                 add('yj',ftdate,0,false);

                 add('zp', ftstring,10,false); {增加具体的字段名、类型}

                 add('zdm',ftinteger,0,false);

             end;

             With indexdefs do {此方法为ljh.db增加索引字段}

             {使用TTable.IndexDefs.Add()方法定义索引。Add有三个参数:

         索引名:string;

         索引字段名:string;

         索引类型:TIndexOptions;

     TIndexOption = (ixPrimary, ixUnique, ixDescending, ixCaseInsensitive,

         ixExpression, ixNonMaintained);

          TIndexOptions = set of TIndexOption;

          ixPrimary : 建 立 的 索 引 为 主 索 引( 不 适 用 于dBase 数 据 表).
      ixUnique : 不 允 许 重 复 值 的 索 引.
      ixDescending: 按 降 序 索 引.
      ixCaseInsensitive: 索 引 排 序 时 按 忽 略 大 小 写( 不 适 用 于dBase 数 据 表).
      ixExpression: 建 立 表 达 式 索 引( 适 用 于Delphi3.0, 仅 适 用 于dBase 数 据 表).
      ixNonMaintained: 是 否 不 需 要BDE 自 动 维 护( 适 用 于Delphi1.0).  

           }

             Begin

                 Clear;

                 Add('yjindex','yj',[ixprimary]);

             end;

             createtable;

         end;

     end;

     ..........................................................................................................................................................................................................................................

     方法二  使用 Tquery 建立:

       query1.close;
       query1.sql.text:='create table "mytable.dbf" (n1 char(10))';
       query1.execsql;
       会在当前目录下生成数据库文件。

     ..........................................................................................................................................................................................................................................

     方法三 使用ado创建:(例子如下)

    //ado创建dbf
    procedure TForm1.Button1Click(Sender: TObject);
    var
    DBPath: String;
    begin
    DBPath:='e:/dfwtest/test7';//你的数据库路径目录;
    ADOConnection1.ConnectionString:='Provider=MSDASQL.1;'
                                     +'Persist Security Info=False;'
                                     +'Extended Properties='
                                     +'"Driver={Microsoft Visual FoxPro Driver};'
                                     +'UID=;'
                                     +'SourceDB='+ DBPath + ';'
                                     +'SourceType=DBF;'
                                     +'Exclusive=No;'
                                     +'BackgroundFetch=Yes;'
                                     +'Collate=Machine;'
                                     +'Null=Yes;'
                                     +'Deleted=Yes;"';
    AdoConnection1.Open;
    AdoQuery1.Sql.Text := 'create table "aaa.dbf" (aaa char(2))';
    //AdoQuery1.Sql.Text := 'create table "ddd.dbf" (aaa char(2)),fff float(3),eee numeric (4,1),torf boolean ,rdate date)';
    AdoQuery1.ExecSql;
    end;

      会在当前目录下生成数据库文件。要想指定表的位置在 SQL 语句指定。如:AdoQuery1.Sql.Text := 'create table "C:\aaa.dbf" (aaa char(2))';


    //ado打开dbf
    procedure TForm1.Button3Click(Sender: TObject);
    var
    DBPath: String;
    begin
    DBPath:='e:/dfwtest/test7';//你的数据库路径;
    ADOConnection1.ConnectionString:='Provider=MSDASQL.1;'
                                     +'Persist Security Info=False;'
                                     +'Extended Properties='
                                     +'"Driver={Microsoft Visual FoxPro Driver};'
                                     +'UID=;'
                                     +'SourceDB='+ DBPath + ';'
                                     +'SourceType=DBF;'
                                     +'Exclusive=No;'
                                     +'BackgroundFetch=Yes;'
                                     +'Collate=Machine;'
                                     +'Null=Yes;'
                                     +'Deleted=Yes;"';
    AdoQuery1.close;
    AdoQuery1.sql.clear;
    AdoQuery1.sql.Text := 'select * from ddd.dbf';
    adoquery1.Open;
    end;

    ************************************************************************************************************************************************************************** * 

    TTable.GetTableType

     function TTable.GetTableType: TTableType;
    var
      Name, Extension: string;
      FDb: Boolean;
    begin
      Result := ttDefault;
      FDb := SetDBFlag(dbfDatabase, True);
      try
        if not Database.IsSQLBased then
          if TableType = ttDefault then
          begin
            Extension := ExtractFileExt(TableName);
            if CompareText(Extension, '.DB') = 0 then Result := ttParadox
            else if CompareText(Extension, '.DBF') = 0 then
            begin
              Name := GetFileName;
              if FileExists(ChangeFileExt(Name, '.FPT')) or
                 FileExists(ChangeFileExt(Name, '.CDX')) then
                Result := ttFoxPro else
                Result := ttDBase;
            end
            else if CompareText(Extension, '.TXT') = 0 then Result := ttASCII
          end else Result := TableType;
      finally
        if not FDb then SetDBFlag(dbfDatabase, False);
      end;
    end;

  • 相关阅读:
    Oracle查询错误分析:ORA-01791:不是SELECTed表达式
    Java中DESKeySpec类
    linux发布项目
    mac下搭建cocos2d-x2.2.1版本android编译环境教程
    使用Eigen求解线性方程组
    视觉SLAM十四讲课后答案-ch1
    costmap_2d: obstacle_layer中关于激光雷达障碍物清除不干净的解决
    ch4 激光的前端配准算法一 —— ICP方法
    Project 'cv_bridge' specifies '/usr/include/opencv' as an include dir, which is not found.
    ch3 传感器数据处理II: 激光雷达运动畸变去除
  • 原文地址:https://www.cnblogs.com/bjxsky/p/2816995.html
Copyright © 2011-2022 走看看