65.9K
CodeProject 正在变化。 阅读更多。
Home

修复因断电而损坏的 DBF 文件

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.67/5 (3投票s)

2007年8月21日

viewsIcon

55840

downloadIcon

2020

修复因任何原因损坏的 DBF 文件。

Screenshot - Screen2.jpg

引言

修复因任何原因损坏的 DBF 文件,例如电源故障或电脑异常关机。

背景

通常,当电源故障时,并且 DBF 文件正在使用中,DBF 文件就会损坏,当你尝试打开文件时,会显示“不是数据库文件”的消息。

使用代码

在开始之前,将 OpenFileDialog 组件和 Activex Data Component 引用添加到你的项目中。并在窗体级别分配以下局部变量。

Dim byteArray As Variant
Dim dblNoOfRecords As Double
Dim dblHeaderLength As Double
Dim dblRecordLength As Double
Dim dblActualRecords As Double

在 OpenDialog 的 Open 点击事件中编写以下代码。代码将首先检查 DBF 文件是否损坏。如果损坏,则“修复 DBF”按钮将设置为 True。否则,屏幕上将显示“数据库没有错误”消息。

Private Sub cmdOpen_Click()
  DialogBox.DialogTitle = "Select DBF File"
  DialogBox.Filter = "DBF Files|*.dbf"
  DialogBox.DefaultExt = "dbf"
  
  DialogBox.ShowOpen
  If Trim(DialogBox.FileName) <> "" Then
    txtFileName.Text = DialogBox.FileName
    Dim objStream As New ADODB.Stream

    objStream.Type = adTypeBinary
    objStream.Open

    objStream.LoadFromFile Trim(DialogBox.FileName)
    byteArray = objStream.Read()

    dblNoOfRecords = byteArray(4) + byteArray(5) * 256 + byteArray(6) * 256 ^ 2 + byteArray(7) * 256 ^ 3
    dblHeaderLength = byteArray(8) + byteArray(9) * 256
    dblRecordLength = byteArray(10) + byteArray(11) * 256

    dblActualRecords = Int((objStream.Size - dblHeaderLength) / dblRecordLength)

    If dblNoOfRecords > dblActualRecords Then
      cmdRepair.Visible = True
      Label2.Caption = "Error Found... Click on Repair Database"
    Else
      'cmdRepair.Enabled = False
      'cmdRepair.Caption = "No Error in Database"
      Label2.Caption = "No Error in Database"
    End If
    Set objStream = Nothing
  End If
'showerror:
'  MsgBox "Error Description : " & Err.Description & Chr(13) & _
'         "Error Number : " & Err.Number
End Sub

将以下代码复制到“修复”点击事件中。

Private Sub cmdRepair_Click()
  Dim objStream As New ADODB.Stream
  objStream.Type = adTypeBinary
  objStream.Open
  
  byteArray(4) = dblActualRecords Mod 256
  byteArray(5) = Int(dblActualRecords / 256) Mod 256
  byteArray(6) = Int(dblActualRecords / 256 ^ 2) Mod 256
  byteArray(7) = Int(dblActualRecords / 256 ^ 3) Mod 256

  objStream.Write byteArray
  objStream.SaveToFile Trim(DialogBox.FileName), adSaveCreateOverWrite
  objStream.Close
  cmdRepair.Visible = False
  Set objStream = Nothing
  Label2.Caption = "Repair Succesfully Completed"
End Sub

摘要

一个非常有用的工具,可以在任何时候恢复你的数据。

关于 Bhaskar Shetty

计算机应用学士 (BCA),拥有超过 8 年的软件开发/分析/实施经验。

© . All rights reserved.