还是关于数据库中数据的真正删除(50分)

  • 主题发起人 主题发起人 carnation
  • 开始时间 开始时间
C

carnation

Unregistered / Unconfirmed
GUEST, unregistred user!
我看了半天Delphi的帮助,说是可以用DbiDoResturcture()来真正删除Paradox数据库
的内容,Help上并给了一个例子PackTable()

我的问题是:
我将这个例子放入我的程序中作为一个函数,一编译机器就说:
[Error] MainUnit.pas(397): Undeclared identifier: 'CURProps'
[Error] MainUnit.pas(398): Undeclared identifier: 'hDBIDb'
[Error] MainUnit.pas(399): Undeclared identifier: 'CRTblDesc'
。。。
WHY?少引用了什么Unit?
 
dbf文件记录删除时不是真正的删除,Delphi没有象foxpro下的Pack这种命令,dbf文件久了将越来越大
 
不是dbf文件,是db文件,肯定是可以真正删除的(前面已有许多类似的文章)
不过我不清楚这几个数据类型(CURProps ,hDBIDb, CRTblDesc)在哪儿定义
 
????
procedure PackDBF(Tabla: TTable);
begin
Check(DbiPackTable(Tabla.DBHandle, Tabla.Handle, nil, szDBASE, True))
end;
 
TO WEICONG
如果直接将你这段话放入我的frmMain中,编译出错:
[Error] MainUnit.pas(772): Undeclared identifier: 'DbiPackTable'
我就是想知道为什么会有编译错误!

还有,你这是操作DBASE的,我在操作Paradox
 
DbiPackTable,这个函数在哪?
 
自己的例子,给你看看(编译通过的):

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, ActnList, ExtCtrls, StdCtrls, DBCtrls, jpeg, Mask, Grids,
DBGrids, Clipbrd, Menus,bde, Buttons;
。。。。。。。。
。。。。。。。。
procedure PackTable(Table: TTable);
var
Props: CURProps; //bde.pas
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
// Make sure the table is open exclusively so we can get the db handle...
if not Table.Active then
raise EDatabaseError.Create('Table must be opened to pack');
if not Table.Exclusive then
raise EDatabaseError.Create('Table must be opened exclusively to pack');
// Get the table properties to determine table type...
Check(DbiGetCursorProps(Table.Handle, Props));
// If the table is a Paradox table, you must call DbiDoRestructure...
if Props.szTableType = szPARADOX then begin
// Blank out the structure...
FillChar(TableDesc, sizeof(TableDesc), 0);
// Get the database handle from the table's cursor handle...

Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
// Put the table name in the table descriptor...
StrPCopy(TableDesc.szTblName, Table.TableName);
// Put the table type in the table descriptor...
StrPCopy(TableDesc.szTblType, Props.szTableType);
// Set the Pack option in the table descriptor to TRUE...
TableDesc.bPack := True;
// Close the table so the restructure can complete...
Table.Close;
// Call DbiDoRestructure...

Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));
end
else
// If the table is a dBASE table, simply call DbiPackTable...
if (Props.szTableType = szDBASE) then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True))
else
// Pack only works on PAradox or dBASE; nothing else...
raise EDatabaseError.Create('Table must be either of Paradox or dBASE ' +
'type to pack');
Table.Open;
end;
 
你的问题应该是没有加上:uses bde 吧!
 
谢谢,找的就是BDE!
BTW:你怎么知道该Use BDE,我看了半天Help也没发现
 
接受答案了.
 
后退
顶部