如何用delphi实现对Access数据库的备份(100分)

  • 主题发起人 主题发起人 wsm
  • 开始时间 开始时间
W

wsm

Unregistered / Unconfirmed
GUEST, unregistred user!
后台数据库是Access,前台用delphi开发
1.如何用delphi实现对Access数据库的备份;
2.在Access数据库中删除出记录后,只作了标记,仍然显示出来,如何解决。
 
没人有吗?
 

以下的例子,对你或许有用。
一 . 真 正 删 除 记 录
---- 在Delphi 程 序 中, 用TTable 或TQuery 构 件 的 方 法Delete 执 行 删 除 记 录 的 操 作 时, 执 行 的 是 软 删 除, 即 相 当 于Foxpro 中
的"Set Delete Off" 的 效 果, 仅 将 记 录 用 星 号"*" 标记 为 删 除, 实 际 并 没 有 数 据 库 中 进 行 物 理 上 的 删 除. 要 进 行 真 正
的 删 除, 需 要 进 行Pack Table 的 操 作 .
---- 在Delphi 程 序 中 真 正 删 除 记 录, 需 要 调 用BDE 函 数, 函 数 名 为DbiPackTable, 函 数 原 型 为:
function DbiPackTable ( hDb : hDBIDb;hCursor :
hDBICur;
pszTableName : PChar;
pszDriverType : PChar;
bRegenIdxs : Bool ): DBIResult;
---- 其 中,hDb 为 数 据 库TDatabse 的 句 柄,hCursor 为 数 据 表
TTable 的 句 柄,pszTableName 为 要 删 除 记 录 的 数 据 表 的 名 称
,pszDriverType 为 要 删 除 记 录 的 数 据 表 的 类 型,bRegenIdxs 表
示 是 否 在 删 除 记 录 后 自 动 更 新 索 引 文 件 .
---- 在 上 面 前 四 个 参 数 中,hDb 不 能 为NULL .hCursor、
pszTableName、pszDriverType 可 以 为 NULL, 但 必 须 提 供 足 够 的
信 息 来 标 识 数 据 表 的 文 件 名 称 和 类 型, 当hCursor 不 为 空
时, pszTableName 和pszDriverType 可 以 为NULL; 当pszTableName 为 数
据 表 的 路 径 和 文 件 名 时,hCursor 和pszDriverType 可 以 为NULL.

---- 值 得 注 意 的 是, 在 删 除 记 录 时, 如 果 用Table 来 实 现,
则Table 必 须 以Exclusive=True 的 方 式 打 开 . 下 面 就 是 一 个 典
型 的 例 子 .
首先,应在uses语句加上DbiTypes,DbiProcs,DbiErrs.
{ Pack一个DBF数据表,DbfTable包含了数据表的信息 }
function PackDbfTable( DbfTable : TTable ) : boolean;
var
errResult : DBIResult;
begin
if not DbfTable.Exclusive then

{如果不是以独占方式,操作失败 }
begin
result := false;
exit;
end;
{进行删除操作 }
errResult := DbiPackTable( DbfTable.dbHandle,
DbfTable.handle, NIL, NIL, true );
{根据返回结果,返回成功与否的标志 }
if errResult = DBIERR_NONE then
{没有错误,操作成功 }
result := true
else
{没有错误,操作失败 }
result := false;
end;

二 . 显 示 或 不 显 示 被 软 删 除 记 录
---- 当DBF 数 据 库 中 的 记 录 被 软 删 除 后, 缺 省 情 况 下 在
TDBGrid 等 数 据 库 构 件 中 是 看 不 见 这 些 记 录 的 . 我 们 可
以 用BDE 函 数 来 控 制 是 否 显 示DBF 数 据 库 中 被 软 删 除 的 记
录, 就 象 在Foxpro 中 利 用 语 句 Set Delete ON/OFF 那 样 .
----     要 用 到 的 函 数 名 为DbiSetProp, 函 数 原 型 为
function DbiSetProp ( hObj : hDBIObj;
iProp
: Longint;
iPropValue : Longint): DBIResult;
---- 该 函 数 用 来 设 置DBI 对 象 中 某 个 属 性 的 值. 其 中,hObj
为DBI 对 象 名 称, 我 们 这 里 为 数 据 表TTable 的 句 柄;iProp 为
属 性 名 称, 我 们 用 的 是 软 删 除 属 性curSOFTDELETEON;
iPropValue 为 属 性 值, 我 们 用True 或False 表 示 是 否 使 软 删 除
的 记 录 被 显 示 .
----     下 面 就 是 一 个 典 型 的 例 子 .
----     同 样, 应 在uses 语 句 加 上DbiTypes,DbiProcs,DbiErrs.
{显示DBF数据表中的软删除记录,
DbfTable包含了数据表的信息,DeleteOn
表示是否显示,True表示显示 }
function SetDbfDelete( DbfTable :
TTable ;
DeleteOn : boolean ) : boolean;
var
errResult : DBIResult;
begin
result := false;
{操作失败时,返回False }
{如果数据表没有打开,则操作失败 }
if ( not DbfTable.active ) then
exit;
{进行设置显示操作 }
errResult := DbiSetProp( hDBIObj(DbfTable.Handle),
curSOFTDELETEON,
LongInt( DeleteOn ));
if errResult = DBIERR_NONE then
{没有错误,则操作成功 }
begin
result := true;
DbfTable.refresh;
end;
end;

三 . 获 取 当 前 记 录 号
---- 在 用Foxpro 时,RecNo() 函 数 用 惯 了, 在Delphi 程 序 没 有 这
样 的 函 数 觉 得 别 扭 . 下 面 我 们 可 以 用BDE 函 数 获 取 当 前
记 录 在 数 据 集 中 的 记 录 号 .
---- 要 用 到 的 函 数 名 为DbiGetRecord, 函 数 原 型 为
function DbiGetRecord (hCursor : hDBICur;
eLock : DBILockType;
pRecBuff : Pointer;
precProps : pRECProps ): DBIResult;
---- 该 函 数 用 来 取 得 当 前 记 录 的 一 些 属 性 . 其 中,
hCursor 可 为 数 据 集 的Handle,eLock 为 对 记 录 加 锁 的 类 型,
pRecBuff 存 放 记 录 的 缓 冲 区, precProps 为 记 录 属 性 集 .
----     下 面 就 是 一 个 典 型 的 例 子 .

  同样,应在uses语句加上
DbiTypes,DbiProcs,DbiErrs. {取得当前记录的记录号 }
function RecNo( ADbfTable : TTable ) : LongInt;
var
RecordProps: RecProps;
begin
Result := 0;
{返回0表示函数执行失败 }
with ADbfTabledo
begin
{如果数据集处于非活动状态,则执行失败 }
if not active
then
exit;
{使数据集的当前记录与实际 的当前记录的位置一致 }
UpdateCursorPos;
{取得当前记录的属性, 主要是记录的位置 }
if DBIERR_NONE < > DbiGetRecord (Handle, dbiNOLOCK, nil,
@RecordProps)
then
exit;{发生错误,则操作失败 }
Result := RecordProps.iPhyRecNum;
{ 取得记录号 }
end;
end;


四 . 设 置 查 询 匹 配 方 式( 精 确 匹 配/ 非 精 确 匹 配)
---- 在 用Foxpro 时,Set Exact ON/OFF 对 数 据 查 询 影 响 很 大 .
在Delphi 中, 我 们 同 样 可 以 进 行 这 样 的 设 置 .
----     要 用 到 的 函 数 名 为DbiSetProp, 这 次 用 的 属 性 名
称iProp 为curINEXACTON, 属 性 值iPropValue 为 True 或False,True 表
示Set Exact OFF .
----     下 面 就 是 一 个 典 型 的 例 子 .
同样,应在uses语句加上DbiTypes,DbiProcs,DbiErrs.
{设置匹配方式,DbfTable
包含了数据表的信息,ExactOn
表示是否精确匹配,True表示是 }
function SetDbfExact( DbfTable :
TTable ;
ExactOn : boolean ) : boolean;
var
errResult : DBIResult;
begin
{如果没有打开,则操作失败 }
if ( not DbfTable.active ) then
begin
result := false;
exit;
end;

{进行设置显示操作 }
errResult := DbiSetProp( hDBIObj(DbfTable.Handle),
curINEXACTON,
LongInt( not ExactOn ));
if errResult = DBIERR_NONE then
{没有错误,操作成功 }
result := true
else
{发生错误,操作失败 }
result := false;
end;

五 . 恢 复 被 软 删 除 的 记 录
---- 在Delphi 应 用 程 序 中, 对DBF 数 据 表 执 行 的 删 除 操 作 为
软 删 除 操 作 . 由 于 物 理 记 录 并 没 有 从 数 据 表 中 删 除,
我 们 就 可 以 恢 复 被 软 删 除 的 记 录, 只 要 去 掉 删 除 标 志
即 可 .
---- 要 用 到 的 函 数 名 为DbiUndeleteRecord, 函 数 原 型 为:
function DbiUndeleteRecord
( hCursor : hDBICur ): DBIResult;
---- 其 中,hCursor 可 为 数 据 集 的Handle .
----     下 面 就 是 一 个 典 型 的 例 子 .
  同样,应在uses语句加上DbiTypes,DbiProcs,DbiErrs.
{恢复被软删除的记录 }
function UndeleteRecord
( DbfTable : TTable ) : boolean;
begin
Result := false;
{返回false表示函数执行失败 }
with DbfTabledo
begin
{如果数据集处于非
活动状态,则执行失败 }
if not active then
exit;
{使数据集的当前记录与
实际的当前记录的位置一致 }
UpdateCursorPos;
{恢复被软删除的记录 }
if DBIERR_NONE < > DbiUndeleteRecord( Handle ) then
exit;{发生错误,操作失败 }
result := true;
{操作成功 }
end;
end;
 
接受答案了.
 
后退
顶部