五、动态创建应用程序
在实际的应用中,有些表要我们在运行过程中创建,BDE完全可以轻松的做出这些。
第一篇中我们已经已经讨论过创建与删除表的方法,这里对有些内容再做一点补充。
1、数据表的类型
TableType属性缺省时为ttDefault。当TableType属性为ttDefault时,BDE从文件名的扩展名确定数据表的类型。下面列出TableType属性值:
值 数据表类型
ttDefault 由BDE自动决定数据表类型
ttParadox Paradox
ttDBase dBASE
ttFoxPro FoxPro
ttASCII 以逗号分开的ASCII
2、索引属性
Options用来指定对参数F列出的字段必须满足的要求。它是一个集合类型变量,可以取ixPrimary、ixUnique、ixDescending、ixExpression、ixCaseInsensitive和ixNonMaitained等几个值。
ixPrimary:主要索引;
ixUnique:唯一键值,不允许有重复值存在;
ixDescending:索引顺序由大到小(默认值是由小到大);
ixExpression:复合索引,复合字段与字段之间以加号隔开;
ixCaseInsensitive:索引字段区分大小写字母(默认不区分大小写);
ixNonMaitained:当字段数据有变化时,BDE不会自动帮数据表重建索引(默认会自动重建)。
3、动态创建别名
对于BDE建立的应用程序来说,别名特别重要,许多方法都需要传递一个数据库的别名作为参数。好在TSession提供了管理BDE别名的功能。并且所有的数据库应用程序都会自动地包括一个缺省的session.
在编程的过程中我们都遇到过这种情况,程序原来好好的,但是等到要发布时才发现,程序由于找不到别名而无法运行,所以你必须在一台已经装了BDE管理程序的机上才能用,你一定非常失望。 其实你完全可以在程序中加入以下语句,你的程序就又可以执行了。
AddAlias方法为一个SQL数据库服务器创建一个新的BDE别名。它有三个参数:一个包含了别名名称的字符串、一个指定要使用的SQL Links驱动程序名称的字符串和一个包含别名参数的字符串列表。
AddStandardAlias为Paradox\dBASE或ASCII表创建一个新的BDE别名。它也有三个参数:别名的名称、要存取Paradox\dBASE表的完整路径名称和用来尝试打开一个没有扩展名的表的缺省驱动程序的名称。
为存取一个InterBase服务器到缺省session中,下面的语句使用AddAlias方法加入一个新的别名:
TStringList *AliasParams=new TStringList();
try
{
AliasParams->Add(“OPEN MODE=READ”);
AliasParams->Add(“USER NAME=MYNAME”);
AliasParams->Add(“SERVER NAME=IB_SERVER:/PATH/DATABASE.GDB”);
Session->AddAlias(“WORKNAME”,”INTRBASE”,AliasParams);
……
}
catch(...)
{
delete AliasParams;
trow;
}
delete AliasParams;
为存取一个表,我们可以用AddStandardAlias方法来创建一个新的别名。
Session->AddStandardAlias(“MYTABLE’,”C:\\PATH\\TABLE\\”,”Paradox”);
要说明的是,调用AddStandardAlias或AddAlias函数创建的别名只存在于内存中, 程序关闭后就没有了,要把别名永远的保存到BDE配置文件中,请调用SaveConfigFile函数。
通过这些说明我想你已经能够动态创建表了,对于可视化组件,其实用好new也完全可以动态创建,但组件的位置设定不太直观,最好还是不要那样来做,当然你有兴趣,可以自己试一下。
限于篇幅这里就不在多说了。
六、DBGrid、TQuery组件使用时的技巧
(一)、DBGrid控件
1.设置DBGrid的字段显示宽度属性
为了在DBGrid中建立较小的列,你必须建立一个显示标题,它等于或小于字段值。例如,你希望建立一个只有三个字符宽的列,你的列标题显示必须只有三个字符或更少。
2.改变DBGrid的显示字段及日期显示格式
(1)双击DBGrid对应的Table1,进入字段编辑器。注意进入的是Table1的编辑器。
(2)点右键出现选单选“Add Fields…" ,出现添加字段对话框,选择要添加的字段(该字段将在运行时由DBGrid显示)然后点OK按钮。
(3)假设添加了“日期”字段,点该字段,在属性表中的:DisplayLabel中填入你希望DBGrid显示的字段名。如果原来字段名是英文的,这里用中文名后DBGrid将显示中文名。在DisplayFormat中填入:yyyy-mm-dd,以后日期将按1999-05-28格式显示。
当然在BCB6中我们通过对象树状窗口(Object TreeView),先找到Table1,再找到她下面的Fields,然后右击它,通过快捷菜单同样我们可以完成这些操作。
(二)TQuery控件
TQuery 控件是数据库编程中非常重要的一个控件,它负责通过BDE与数据库建立联系,通过SQL语句方便的建立查询。Query必须建立相应的SQL才能生效。
TQuery的参数设置如下:
(1)在SQL属性中:Select * from 表名 where 字段名=:变量名
跟在“ : "后面的是变量。这样写后,在参数属性中就可以修改该变量的数据类型等。
(2)对变量的赋值:
Query1-〉Active=false;
Query1-〉Params-〉Items[0]-〉AsString=Edit1-〉Text;
Query1-〉Active=true;//查找符合变量的记录
(3)用DBGrid显示结果
DBGrid的DataSource与DataSource1连接,而DataSource1的DataSet与TQuery1 连接。
(三)应用范例
通过Query控件嵌入SQL语句建立的查询比Table更简单、更高效。
用一个简单的代码来说明如何建立查询程序:
例如,要建立一个在表中姓名列中查询为myname的程序则在表单上放置DBGrid、DataSource、Query三个控件加入以下代码:
DBGrid1-〉DataSource=DataSource1;
DataSource1-〉DataSet=TQery1;
Query1-〉Close();
Query1-〉SQL-〉Clear();
Query1-〉SQL-〉Add(″Select * From 表 Where (姓名=′myname′ ″);
Query1-)Open();
对返回结果集(Result Set)的查询,换句话说就当有一项以上的数据,如Select命令,你要使用Active属性或Open方法,但只在数据表上执行一个操作而不返回结果集的查询,如Insert 、Udate等命令时,你可以使用ExecSQL方法来运行。不过,BCB并没有硬性规定在何种情况下,一定要用何种方法,所以在什么时候都可以用Open,所以弄不清楚时,用她就一定没错了。
其它一些可视化组件大同小异,不在多言了。
七、数据库独立运行所需文件
BCB程序员都知道,在数据库应用程序开发完成后,要发布程序需要同时发布BDE(Borland Database Engine),否则会引起错误“A Error occurred while at temping to initilize Borland Database Engine(Error $2109)”。当觉得程序太大而辛辛苦苦精简自己的程序到满意时,却发现BDE管理程序器需要17.4M之巨,不由感到沮丧,所以有很多人不喜欢BDE,但是只要动脑还是有办法来压缩BDE的。
首先来看看BDE目录中的文件,所有文件确实有近17.4M大吧。不过有些可能是用不到的.下面是各个文件的作用:
(一)不可缺少的文件
blw32.dll:语言驱动函数库。
idapi32.dll:BDE基本函数库。
fareast.btl、usa.btl:远东语言及美国语言驱动程序,对中文软件不可缺少。
idr20009.dll:错误信息库。
(二)数据库驱动程序(根据需要选择一个或多个)
idasci32.dll:Ascii文本数据库驱动程序函数库,如果不用Ascii文本数据库,可以不要。
iddao32.dll:Access数据库驱动程序函数库,如果不用Access数据库,可以不要。
iddbas32.dll:dBase数据库驱动程序函数库,如果不用dBase数据库,可以不要。
idodbc32.dll:ODBC数据库驱动程序函数库,如果不用ODBC数据库,可以不要。
idpdx32.dll:Paradox数据库驱动程序函数库,如果不用Paradox数据库,可以不要。
(三)其它驱动程序和配置文件(根据需要选择一个或多个)
idbat32.dll:批操作驱动程序函数库,如果不用TBatchMove控件或DbiBatchMove类函数,可以不要。
iddr32.dll:Data Repository驱动程序函数库,如果不用Data Repository功能,可以不要。
idprov32.dll:BDE DataSet provide驱动程序函数库,如果不用TProvider控件,可以不要。注意:在BCB6中,没有这个文件,她只是早版本中出现过的文件。
idqbe32.dll:QBE驱动程序函数库,如果不用Query By Example,可以不要。
idsql32.dll:SQL查询驱动程序函数库,如果不用TQuery进行查询,可以不要。
idapi32.cfg:BDE配置文件,如程序中没特殊要求,可不要。也可在BDE管理器中设置正确后再分发。
(四)其它文件(一般不用)
BDE32.HLP、BDE32.CNT:BDE帮助文件,可以不要。
BdeAdmin.exe、BdeAdmin.HLP、BdeAdmin.CNT:BDE管理器及帮助文件,如果不会发生要求软件用户自己配置BDE的情况时,可以不要。
其它*.BLL:其它国家和地区的语言驱动程序,可以不要。
DataBump.EXE、DataBump.HLP、DataBump.CNT:数据库数据转移工具及帮助文件,可以不要。
Localsql.HLP、Localsql.CNT:SQL查询语句帮助文件,可以不要。
Sqllnk32.HLP、Sqllnk32.CNT:SQL连接帮助文件,可以不要。
在根据需要选择文件后,还要写注册表文件。这个应该不成问题,可以手工设置,但最好在程序中设置,在发现注册表中没有相应键值时写入,用TRegFile对象用不了几行代码的。需要设置的注册表键值有(在调用数据库操作前需要有正确的键值存在):
数据驱动程序所在目录的设置:
HKEY_LOCAL_MACHINE\Software\Borland\Database Engine\DLLPATH(字符串值)
语言驱动程序所在目录的设置:
HKEY_LOCAL_MACHINE\Software\Borland\BLW32\BLAPIPATH(字符串值)
语言驱动程序文件名:
HKEY_LOCAL_MACHINE\Software\Borland\BLW32\LOCALE_LIB#(字符串值)
其中#为编号,按顺序为0、1、2、3......如:
HKEY_LOCAL_MACHINE\Software\Borland\BLW32\LOCALE_LIB0="fareasst.bll"
HKEY_LOCAL_MACHINE\Software\Borland\BLW32\LOCALE_LIB1="usa.bll"
这样就可以大大减少BDE驱动程序的,例如只用TTable控件操作Paradox数据库,则只要idapi32.dll、blw32.dll、idr20009.dll、fareast.bll、usa.bll、idpdx32.dll六个文件即可。
这些文件可放在任何一个目录,只要在注册表指明即可。OK,BDE由17.4M瘦身后仅仅有2M,ZIP一下就700多K了,比原来的应用系统减少了不少吧。
当然上述内容完全可以在打包程序时做到,你只要能看明白英语不会有什么问题的,如果在Advanced选项卡中出现了你认为多余的BDE文件,那你的设置一定不太正确,没办法,重来一次,再省一些,越小越好,对吧J
此处的打包不可能完全一样,实践是我们最好的老师,在实践中压缩你的文件吧 J
BDE的幽雅在于她与BCB的完美结合,她可以纯动态的创建,可以用很少的组件的完成更多的功能,可以与其它(非BDE)组件的更好结合……。今天BDE变成这个样子,宝兰也是有原因的,不清楚他们是如何想的,在数据库开发软件光芒四射的今天,如果宝兰在这上面没有一点自己的东西,那我们这些喜欢BCB的可能不会有什么“钱”图了。没办法,可能真的如人所骂,BDE成了没人用的垃圾了L
本想把本文写得更细一些,象Tabel瘦身、主从表的快速建立、BDE中实现BLOB字段的读写、BDE中的SQL应用、BDE与QR等,并且今天这篇写得也有点太略,没办法,实在不敢再写了,因为这一次如果再不结束,那些骂我可真的受不了了L让人骂可不是一件好事,很多人甚至连这篇都不希望我写了,但没有结尾总觉得是个问题,好在到这里就借机会结束了。
(全文完)