请教BDE引擎下的dbf文件记录行如何永久删除? 请各位大侠指点一二. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.enet.com.cn/eschool/inforcenter/A20040320296088.html 1. 对于dBase和Paradox库,其Pack原理是不同的:如果是Paradox 表, 必须调用 DbiDoRestructure,重建数据库结构;如果是 dBASE 表, 只需要调用DbiPackTable。 2. 在做Pack删除时,必须以独占方式打开数据库时。具体请参考一下的例子。 (为了节省篇幅,例子中只给出关键性的程序段) implementation uses BDE;//做PACK必须引用次单元里的函数 {$R *.DFM} procedure TfrmPack.FormCreate(Sender: TObject); var DBName:String; begin DBName:=ExtractFilePath(Application.ExeName);//得到数据库的位置 {设置Table} tblDBASE.DatabaseName:=DBName; tblParadox.DatabaseName:=DBName; tblDBASE.TableName:='dbsTest.dbf'; tblParadox.TableName:='pdxTest.db'; tblDBASE.Active:=True; tblParadox.Active:=True; end; {物理删除数据库记录Pack a Paradox or dBASE table} // The table must be opened execlusively before calling this procedure... procedure TFrmPack.PackTable(FTable: TTable); var Props: CURProps; hDb: hDBIDb; TableDesc: CRTblDesc; begin FTable.Active := False; {当数据库打开失败时,这个循环语句能够让用户重试} repeat try FTable.Exclusive := True; FTable.Active := True; {如果正常打开数据库,则退出循环} Break; except on EDatabaseError do if Application.MessageBox( '以独占方式打开数据库时,出现错误---重试否?', '数据库错误', MB_OKCANCEL + MB_DEFBUTTON1) < > IDOK then Exit; end; until False; try {Check()用于校正和报告DBI底层错误;DbiGetCursorProps()用于取表光标属性} Check(DbiGetCursorProps(FTable.Handle, Props));// 获得表的属性已得到表的类型 {如果是Paradox 表, 必须调用 DbiDoRestructure,重建数据库结构} if (Props.szTableType = szPARADOX) then begin FillChar(TableDesc, sizeof(TableDesc), 0); 从数据表光标获取数据库句柄} Check(DbiGetObjFromObj(hDBIObj(FTable.Handle), objDATABASE, hDBIObj(hDb))); {设置表的描述结构的Name/Type/bPack属性} StrPCopy(TableDesc.szTblName, FTable.TableName); StrPCopy(TableDesc.szTblType, Props.szTableType); TableDesc.bPack := True; {关闭表并调用api} FTable.Close; Application.ProcessMessages; Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False)); Application.ProcessMessages; FTable.Open; end { 如果是 dBASE 表, 只需要调用DbiPackTable...} else if (Props.szTableType = szDBASE) then begin Application.ProcessMessages; Check(DbiPackTable(FTable.DBHandle, FTable.Handle, nil, szDBASE, True)); Application.ProcessMessages; end {不是dBase和Paradox表} else raise EDatabaseError.Create('数据库必须是 Paradox 或者 dBASE 类型,才能进行物理删除操作!!'); finally FTable.Active := False; FTable.Exclusive := False; FTable.Active := True; end; end; procedure TfrmPack.BitBtndBaseClick(Sender: TObject); begin if OpenPictureDlg.Execute then DBImage1.Picture.LoadFromFile(OpenPictureDlg.FileName); end; procedure TfrmPack.BitBtnParadoxClick(Sender: TObject); begin if OpenPictureDlg.Execute then DBImage2.Picture.LoadFromFile(OpenPictureDlg.FileName); end; procedure TfrmPack.BitBtnPackdBASEClick(Sender: TObject); begin PackTable(tbldBASE);//物理删除dDBSE库 end; procedure TfrmPack.BitBtnPackParadoxClick(Sender: TObject); begin PackTable(tblParadox);//物理删除Paradox库 end; 如何richedit在特定行显示不同颜色,并能把光标定位在最后一行 如何加载和卸载带有窗口的DLL delphi7中的Sql语句问题 多线程中使用ADO查询数据库,内存不能释放,怎么办 怎样使一段视频文件播完后延时5秒钟,急!急!急!! 求教图像缩小问题。 请教问题。 菜鸟问题! 我的odbc出问题了 一个简单问题,大家快来—— 有介绍delphi属性的书吗? 怎样改变鼠标状态?
1. 对于dBase和Paradox库,其Pack原理是不同的:如果是Paradox 表, 必须调用 DbiDoRestructure,重建数据库结构;如果是 dBASE 表, 只需要调用DbiPackTable。 2. 在做Pack删除时,必须以独占方式打开数据库时。具体请参考一下的例子。 (为了节省篇幅,例子中只给出关键性的程序段) implementation uses BDE;//做PACK必须引用次单元里的函数 {$R *.DFM} procedure TfrmPack.FormCreate(Sender: TObject); var DBName:String; begin DBName:=ExtractFilePath(Application.ExeName);//得到数据库的位置 {设置Table} tblDBASE.DatabaseName:=DBName; tblParadox.DatabaseName:=DBName; tblDBASE.TableName:='dbsTest.dbf'; tblParadox.TableName:='pdxTest.db'; tblDBASE.Active:=True; tblParadox.Active:=True; end; {物理删除数据库记录Pack a Paradox or dBASE table} // The table must be opened execlusively before calling this procedure... procedure TFrmPack.PackTable(FTable: TTable); var Props: CURProps; hDb: hDBIDb; TableDesc: CRTblDesc; begin FTable.Active := False; {当数据库打开失败时,这个循环语句能够让用户重试} repeat try FTable.Exclusive := True; FTable.Active := True; {如果正常打开数据库,则退出循环} Break; except on EDatabaseError do if Application.MessageBox( '以独占方式打开数据库时,出现错误---重试否?', '数据库错误', MB_OKCANCEL + MB_DEFBUTTON1) < > IDOK then Exit; end; until False; try {Check()用于校正和报告DBI底层错误;DbiGetCursorProps()用于取表光标属性} Check(DbiGetCursorProps(FTable.Handle, Props));// 获得表的属性已得到表的类型 {如果是Paradox 表, 必须调用 DbiDoRestructure,重建数据库结构} if (Props.szTableType = szPARADOX) then begin FillChar(TableDesc, sizeof(TableDesc), 0);