1.是不是把table的CachedUpdates属性设成true了??
2.是改变表的结构吧?用SQL的Alter语句
3.BDE应该有设别名的函数吧,具体是什么我也不太清楚?
至于在程序里怎么动态创建数据库,我也非常想知道,希望高人指教
2.是改变表的结构吧?用SQL的Alter语句
3.BDE应该有设别名的函数吧,具体是什么我也不太清楚?
至于在程序里怎么动态创建数据库,我也非常想知道,希望高人指教
解决方案 »
- 用installshield2010做的安装包,如何在安装完后,自动打开网站?
- 请问,网络广播和网络电视如何实现啊?(直播得,不要录播的)
- 画图片
- WideString类型不可以超过256个字符吗?
- 文件的copy/Move
- 怎样显示这样的格式
- 大侠请关注:ADO的UpdataBatch的执行效率问题,谁能将时间控制在1分钟之内,另开贴加分
- 请教,怎么能够在程序中打印条形码(EAN13或其它)?
- 继续请教关于数据刷新速度的问题 急需!!!
- :各位大虾们,,我现在想学delph,,,vc++,c++build的其中一门,请各位给我参考参考,那种实用简单点,(我学过,c语言,pb)?
- Form显示事件过程的问题!!
- 请推荐一个好的关于Delphi编程的邮件列表----不需要注册的。
table.delete;//删除缓存中的记录
table.applyupdates;//更新数据库
table.commitupdates;//清除缓存
如果放弃删除用table.cancelupdates;//放弃提交,清除缓存2.jeaking(空空)说得对,看看BDE的Local SQL Guide帮助,很清楚3.看看BDE的Local SQL Guide帮助,好像是create database...记不清了,自己看吧
改变表结构同意jeaking的说法
想动态设置BDE的参数就建议不用alias,而是调用Tdatabase这个控件吧!
用这个空间你可以用程序随便设置它的参数,包括driverName,连接参数等。
begin
T:=Ttable.create(self);
T.databasename:='';
.....
end;
书上有的是!!!!!!!!!!!!!
通常我们在Delphi外,通过使用Borland数据库引擎(BDE)的设置单元(bdecfg.exe)来建立和设置别名(Alias),但是,实际上用户可以在Delphi或应用程序中用TDatabase Com ponent或其他方法建立和使用别名,而不必在IDAPI.CFG中预先定义。 建立有效的别名是非常重要的,别名详细说明了数据库的定位信息和连接数据库服务器的参数,当发布应用程序时不必担心IDAPI.CFG中是否有某项设置。 利用TDatabase Component建立别名
建立和设置一个使用标准数据库的别名的步骤如下。 1.建立一个新工程(Project)。 2.将组件(Component) TDatabase、TTable、TDataSource、TDBGrid和TButton放在FORM上。 3.双击TDatabase Component 或在TDatabase快速菜单上选择Database Editor 运行Database属性编辑器。 4.将Database Name 设置成‘ZldchAlias’,这个名字将被当作别名,用来设置数据集组件TTable、TQuery、TStoredProc等的DatabaseName属性。 5.将Driver Name设置成STANDARD。 6.单击Defaults按钮,将 PATH= 自动加在 Parameter Overrides
框中。 7.将PATH=设置成PATH=C:,单击OK按钮关闭 Database Editor。 8.单击OK按钮关闭Database Editor。 9.将TTable的DatabaseName 属性设置成‘ZldchAlias’。 10.将TDataSource的DataSet 属性设置成‘Table1’。 11.将DBGrid的DataSource属性设置成‘DataSource1’。 12.在Tbutton的OnClick事件过程中加入下列代码:
procedure TForm1.Button1Click(Sender:Tobject);
begin
Table1.Tablename=‘customer’;
Table1.Active:=true;
end;
13.运行程序。 上面3~12步也可以用以下过程实现:
MyAddStandAlias(AliasN: String;DbLocat: String;DriverN:string );
{AliasN 别名名,DbLocat 数据库定位目录,DriverN 联结驱动类型}
begin
with Form1.Database1 do
begin
DatabaseName:= AliasN;
DriverName:= ‘STANDARD’;
Params.Clear;
Params.Add(‘PATH=’+DbLocat);
Params.Add(‘DEFAULT DRIVER=’+DriverN);
end
end;
procedure TForm1.Button1Click(Sender:Tobject);
begin
MyAddStandAlias(‘ZldchAlias’,‘C:PARADOX’);
Table1.DatabaseName:=‘ZldchAlias’;
DataSource1.DataSet:= Table1;
DBGrid1.DataSource:= DataSource1;
Table1.Tablename=‘customer’;
Table1.Active:=true;
end;
建立使用INTRBASE数据库的别名
建立使用INTRBASE数据库别名的步骤如下。 1~4步同上。 5.将Driver Name 设置为INTRBASE。 6.单击Defaults 按钮,下列内容会自动加在 Parameter Overrides 框中:
SERVER NAME=IB_SERVER:/PATH/DATABASE.GDB
USER NAME=MYNAME
OPEN MODE=READ/WRITE
SCHEMA CACHE SIZE=8
LANGDRIVER=
SQLQRYMODE=
SQLPASSTHRU MODE=NOT SHARED
SCHEMA CACHE TIME =-1
PASSWORD=
7.将以上内容改为:
SERVER NAME=C:\Program Files\Borland\Delphi 3\Demos\Data\EMPLOYEE.GDB
USER NAME=SYSDBA
OPEN MODE=READ/WRITE
SCHEMA CACHE SIZE=8
LANGDRIVER=
SQLQRYMODE=
SQLPASSTHRU MODE=NOT SHARED
SCHEMA CACHE TIME =-1
PASSWORD=masterkey
8.将TDatabase 的属性LoginPrompt设置成‘False’,如用户在Parameter Overrid es框中给出了正确的PASSWORD,连接数据库时将不会提示要求输入口令。请注意:如果在Parameter Overrides 框中给出的PASSWORD不正确,而TDatabase 的属性LoginPrompt设置为‘False’,程序运行时将出错,但并不会提示要求重新输入正确口令。Intrbase安装后,系统唯一授权的用户是SYSDBA,缺省口令是"masterkey",所有其他的用户都必须由SY SDBA添加,所以在Intrbase系统安装后要尽快更改用户SYSDBA的口令。 9、10、12步同上文的8、9、11步。 11.将TDataSource的DataSet 属性设置成‘Query1’。 13.在Tbutton的OnClick事件过程中加入下列代码:
procedure TForm1.Button1Click(Sender:Tobject);
begin
Query1.SQL.Clear;
Query1.SQL.ADD(‘SELECT DISTINCT * FROM CUSTOMER C ,SALES S WHERE (S.CUS T_NO=C.CUST_NO) ORDER BY C.CUST_NO, C.CUSTOMER’);
Query1.Active:=True;
end;
14.运行程序。 过程MyAddStandAlias的参数可以通过各种方式赋值。目录、服务器名、路径、数据库名和其他别名所需的参数都可以通过输入对话框或从.INI文件读入程序中。通过以上方法建立的别名只在程序运行时存在,其他应用程序不能使用。 利用Session建立、修改、删除别名
所有数据库管理应用程序都自动提供一个名为Session的Session组件。每个和数据库程序相关的数据集组件都包含SessionName属性,它决定了和该组件相关的Session组件。因为Session封装了一系列数据库连接特性,大部分Session组件的方法都通过BDE别名工作。每个和Session有关联的数据库组件都有别名(尽管在处理PARADOX和DBASE
数据库时,完整的路径可以取代别名),通过Session可以检测和决定别名的可见性、跟踪别名名和其他连接驱动信息以及建立、修改和删除别名。 Session的设置模式(ConfigMode)属性,决定了什么样的BDE别名对它是可见的。默认设置是cmAll,它可解释成[cfmVirtual or cfmPersistent]。如果设置模式值为cmAll,由Session建立的所有别名、用户系统BDE设置文件中预定义的别名以及BDE在内存中维护的所有别名均可见。 设置模式的主要目的是,允许应用程序详细说明和限定别名在Session级别上的可见性。例如把设置模式设置成[cfmSession],可使Session只可见那些由其建立的别名,所有其他的别名都无效。 当别名在Session存在期间建立后,BDE在内存中建立一个它的拷贝。这个局部拷贝只对建立它的Session有效,除非在同一个应用程序中其他Session的模式设置成cmAll或cf mPersistent。 使用Session的SaveConfigFile方法,可以将内存中的别名写入BDE设置文件中,这样其他BDE允许的应用程序就可以使用该别名。 Session组件有五个方法,允许应用程序跟踪BDE别名的参数和驱动程序等信息:
GetAliasNames:列出Session已经处理过的别名;
GetAliasParams:列出指定的别名的参数;
GetAliasDriverName:返回包含别名使用的驱动程序名的字符串;
GetDriverNames:返回所有有效的BDE驱动程序;
GetDriverParams:返回指定的驱动程序的驱动参数。 Session可以在其存在期间建立、修改和删除别名。方法AddAlias为SQL数据库服务器建立一个新的BDE据工作区。方法AddStandardAlias为PARADOX、DBASE、ASCII表建立一个新的BDE标准别名。 AddAlias 需要三个参数:一个包含别名工作区名的字符串、一个说明SQL连接驱动类型的字符串、一个汇集连接参数的列表字符串,其格式为:
procedure AddAlias(const Name, Driver: string; List: TStrings);
AddStandardAlias 需要三个参数:别名名、PARADOX和DBASE表存放的完整路径、当试图打开一个没有扩展名表时的默认驱动类型,其格式为:
procedure AddStandardAlias(const Name, Path, DefaultDriver: string);
当为Session添加一个别名时,它仅对该Session和其他设置模式值为cfmPersistent 的Session有效。为了使新建的别名对所有的应用程序有效,在建立别名后应该调用Save ConfigFile方法。 修改别名可以调用过程ModifyAlias,它需要二个参数:将要修改的别名名和包含修改后连接参数值的列表串,格式为:
procedure ModifyAlias(Name: string; List: TStrings);
方法DeleteAlias可以使别名对Session无效,但它不会删除写入BDE设置文件的别名。如果要将其从BDE设置文件中删除,需要在调用DeleteAlias后再调用SaveConfigFile。DeleteAlias只需一个参数:别名名。其格式为:
procedure DeleteAlias(const Name: string);
利用Session操作别名具有更大的灵活性,将给编程和发布程序尤其是C/S应用程序带来很大方便。以上例程在Win95、Delphi 3.0下调试通过。 张来东 常虹
《计算机世界报》98年第17期
降低速度,因为DBF实际是一个很简单的文件格式,物理删除
会引起数据文件内容的大搬动,若有10万条记录,你要物理删除
第一条,下面(10万-1)条要向上搬动,多么费时!FOXPRO的DELETE也
是先逻辑删除,PACK才真正删除; 物理删除会引起重新构造数据库
文件,影响了“共享”,所有物理删除要“独占”打开;
2.怎样物理删除?
BDE对DBF仍提供了一个类似FOXPRO的PACK 功能,但要独占方式
打开,这个贴子很多,下面是C++BUILDER5的做法,DELPHI 类似:
void PackDbf(TTable *Table1)
{
bool stat=Table1->Exclusive;
void *CurPos=NULL;
if (!stat) //共享打开时
{
try
{
if (!Table1->IsEmpty())
CurPos=Table1->GetBook();
}
catch(...)
{
CurPos=NULL;
}
Table1->Close();
Table1->Exclusive=true; //重新改成独占打开
try
{
Table1->Open();
}
catch(...)
{
ShowMessage("出错:不能以独占方式打开!");
}
}
if (Table1->Active)
{
DbiPackTable(Table1->DBHandle,Table1->Handle,
NULL,szDBASE,true);
Table1->Refresh();
}
if (!stat)
{ //原来是共享打开时
Table1->Close();
Table1->Exclusive=false;
Table1->Open();
if (CurPos!=NULL)
{
try
{
Table1->GotoBook(CurPos);
}
catch(...){};
Table1->FreeBook(CurPos);
}
}
}
在你的程序退出再执行这个PackTable()子程序,但如果
你的数据库较小,可把它放在Table1.AfterDelete()事件中,
随时物理删除;
不要这样说妹妹。要注意团结群众!
是这种情况下 用 ttablename.delete 后数据并末真正删除。
可以用 ttablename.cancel 恢复数据。如果在ttablename.delete 后
再执行ttablename.post 就真正删除数据了。