使用 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;

原文地址:https://www.cnblogs.com/bjxsky/p/2816995.html