📄 028.htm
字号:
lang="ZH-CN">,这样才能保证数据表在独占方式下被打开。</font>DbiGetCursorProps<font
lang="ZH-CN">()是一个读取数据表的属性的底层函数调用,返回了大部分通用的数据表属性。</font>Check</font><font
lang="ZH-CN" color="#000000">()函数可以简单的处理数据库的出错提示和异常处理,如果出现函数调用错误会自动显示出错信息。</font></span><font
lang="ZH-CN"></p>
<p align="justify"></font><span style="font-size: 9pt"><font color="#000000" lang="ZH-CN">说了</font><font
color="#000000">pack<font lang="ZH-CN">那么与之对应的</font>Undelete<font
lang="ZH-CN">也就更要解释了,同样我找到了将软删除的数据恢复的函数,不过这个函数隐藏的更深,连</font>C</font><font
lang="ZH-CN" color="#000000">代码都没有,所以以下的代码完全由我自己摸索出来,仅在上面说到的环境中测试通过。</font></span><font
lang="ZH-CN"></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">首先介绍一下相应的底层函数调用:</span></font></p>
</font><p align="justify"><font color="#000000"><span style="font-size: 9pt">DBIResult
DBIFN DbiUndeleteRecord (hCursor);</span></font></p>
<font lang="ZH-CN"><p align="justify"></font><span style="font-size: 9pt"><font
color="#000000" lang="ZH-CN">这个函数仅有的参数就是关联的数据表的游标,您可以在</font><font
color="#000000">BDE.int<font lang="ZH-CN">的文件中找到它的声明,但是具体的使用说明含糊不清,到底是恢复当前被删记录还是将数据表内所有被软删除的记录全部恢复?由于缺少相应的代码分析,我参照</font>FoxPro</font><font
lang="ZH-CN" color="#000000">的经验进行了多次实验,在十几种方案的对比下得出了结论,这条函数调用仅仅恢复当前的被软删除的记录。因此必需首先将数据表的游标移动到被删除的记录上,然后调用这条函数,才会有所反应。要知道在默认的情况下,数据库控件是不会将游标移动到被删除的记录上的,所以必需首先将数据表的读写属性修改,打开软删除的属性,使得遍历数据表时可以访问到被标记为删除的记录。下面是一段实现将数据表中所有被软删除的记录恢复的源代码。其它形式的反删除可以参照这段代码。</font></span><font
lang="ZH-CN"></p>
</font><p align="justify"><font color="#000000"><span style="font-size: 9pt">procedure
Ttablepro.undelete;</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">var</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">CProps: CurProps;</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">rslt: DBIResult;</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">bm:TBookmark;</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">rp:pRECProps;</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">begin</span></font></p>
<p align="justify"><span style="font-size: 9pt"><font color="#000000">Check(DbiGetCursorProps(self.Handle,
CProps));//</font><font lang="ZH-CN" color="#000000">取得数据表的属性</font></span><font
lang="ZH-CN"></p>
</font><p align="justify"><span style="font-size: 9pt"><font color="#000000">if
(StrIComp(CProps.szTableType, szDBASE) <> 0) then//<font lang="ZH-CN">如果不是</font>Dbase<font
lang="ZH-CN">或</font>Foxpro</font><font lang="ZH-CN" color="#000000">则退出</font></span><font
lang="ZH-CN"></p>
</font><p align="justify"><font color="#000000"><span style="font-size: 9pt">raise
EDBEngineError.Create(DBIERR_NOTSUPPORTED);</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">rslt:=DbiValidateProp(hDBIObj(self.Handle),
curSOFTDELETEON, True);</span></font></p>
<p align="justify"><span style="font-size: 9pt"><font color="#000000">//</font><font
lang="ZH-CN" color="#000000">可否设置软删除?</font></span><font lang="ZH-CN"></p>
</font><p align="justify"><font color="#000000"><span style="font-size: 9pt">if (rslt =
DBIERR_NONE) then</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">Check(DbiSetProp(hDBIObj(self.Handle),
curSOFTDELETEON, Longint(true)));</span></font></p>
<p align="justify"><span style="font-size: 9pt"><font color="#000000">//</font><font
lang="ZH-CN" color="#000000">设置为可以软删除</font></span><font lang="ZH-CN"></p>
</font><p align="justify"><font color="#000000"><span style="font-size: 9pt">Check(DbiGetCursorProps(self.Handle,
CProps));</span></font></p>
<p align="justify"><span style="font-size: 9pt"><font color="#000000">//</font><font
lang="ZH-CN" color="#000000">更新数据表的属性</font></span><font lang="ZH-CN"></p>
</font><p align="justify"><font color="#000000"><span style="font-size: 9pt">if
(CProps.bDeletedOn = False) then</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">raise
EDatabaseError.Create('<font lang="ZH-CN">软删除没有设置!</font>');</span></font></p>
<p align="justify"><span style="font-size: 9pt"><font color="#000000">//</font><font
lang="ZH-CN" color="#000000">取得当前的记录位置</font></span><font lang="ZH-CN"></p>
</font><p align="justify"><font color="#000000"><span style="font-size: 9pt">bm:=self.GetBookmark;</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">//<font lang="ZH-CN">将游标移动到第一个记录以前!</font>Not
Table.First!</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">Check(DbiSetTobegin(self.handle));</span></font></p>
<p align="justify"><span style="font-size: 9pt"><font color="#000000">//</font><font
lang="ZH-CN" color="#000000">不断移动,直到到数据表的最后记录</font></span><font
lang="ZH-CN"></p>
</font><p align="justify"><font color="#000000"><span style="font-size: 9pt">while
(DBIGETNEXTRECORD(self.handle,dbinolock,nil,nil)=DBIERR_NONE) do</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">begin</span></font></p>
<p align="justify"><span style="font-size: 9pt"><font color="#000000">//<font lang="ZH-CN">请关闭</font>Delphi</font><font
lang="ZH-CN" color="#000000">的异常响应,以便执行下面的语句!</font></span><font
lang="ZH-CN"></p>
</font><p align="justify"><font color="#000000"><span style="font-size: 9pt">try</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">check(DbiUndeleteRecord(self.Handle));</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">except</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">//Do somthing here !</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">end;</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">end;</span></font></p>
<p align="justify"><span style="font-size: 9pt"><font color="#000000">//</font><font
lang="ZH-CN" color="#000000">取回原先记录的位置,重新定位</font></span><font
lang="ZH-CN"></p>
</font><p align="justify"><font color="#000000"><span style="font-size: 9pt">self.GotoBookmark(bm);</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">self.FreeBookmark(bm);</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">self.Refresh;</span></font></p>
<p align="justify"><font color="#000000"><span style="font-size: 9pt">end;</span></font></p>
<font lang="ZH-CN"><p align="justify"></font><span style="font-size: 9pt"><font
color="#000000" lang="ZH-CN">(注:如果可以,请在刊登时删去</font><font
color="#000000">“Self.refresh”<font lang="ZH-CN">一行,对于原理的介绍无需此行,仅在我的控件的属性中需要,以上代码来自我制作的</font>Delphi<font
lang="ZH-CN">控件</font>TTablePro</font><font lang="ZH-CN" color="#000000">)</font></span><font
lang="ZH-CN"></p>
<p align="justify"></font><span style="font-size: 9pt"><font color="#000000" lang="ZH-CN">在这段代码中已经有了详细的解释,应该可以比较容易的了解</font><font
color="#000000">undelete<font lang="ZH-CN">的技巧了。当然如果能够不必与源代码打交道是最好的,因此我制作了一个</font>Delphi<font
lang="ZH-CN">的控件</font>TtablePro<font lang="ZH-CN">在</font>Table<font lang="ZH-CN">的基础上增加了两个方法</font>PackTable<font
lang="ZH-CN">和</font>Undelete;</font><font lang="ZH-CN" color="#000000">包含了上面介绍的功能。您可以到我的主页免费下载试用,测试版可以免费使用无限制。</font></span><font
lang="ZH-CN"></p>
<p align="justify"></font><span style="font-size: 9pt"><font color="#000000" lang="ZH-CN">如果这篇文章有何问题请与我联络修改。谢谢。另外我可以提供防止应用程序重复加载的技术文章,同样可以提供相应我制作的免费控件。在任务栏显示图标并直接与弹出式菜单的关联的控件与完整技术资料,还可以实现动态图标,目前的免费控件仅支持与指定的菜单关联,就象</font><font
color="#000000">dataset<font lang="ZH-CN">与</font>datasource<font lang="ZH-CN">一样。我可以提供不少我制作的控件的实现技巧、技术的文章。另外我可以提供围棋自动提子的算法和技巧的文章,代码来自我制作的自由软件-围棋打谱软件</font>2.0b…</font></span></p>
</TD>
</TR>
</table>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -