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;