玉管通地理,朱笔点天文
        欢迎光临文天软件之家
 
全站搜索
联系方式


网 址:文天软件之家

    www.jh-lzf.com

联系人:文天(刘中甫)

邮 箱:jh-lzf@21cn.com

地 址:湖北·武汉

    中国石化·江汉油田

    石油工程技术研究院

    信息中心

  

天气信息
新闻详情
在VB中检测与修复Access数据库
来源:━━━━《软件报》2003第23期作者:刘中甫网址:http://www.jh-lzf.com浏览数:12

在VB中检测与修复Access数据库

在VB系统中读写Access数据库时,常常出现的故障有:数据库文件丢失、数据表丢失、表字段丢失等。针对上述故障,本文以“档案”数据库为例,介绍在VB系统中检测与修复Access数据库的程序设计方法。

假设“档案”数据库中有“职工信息”及“单位信息”两个表。其中“职工信息”表的字段及类型为:[姓名]TEXT(4),[性别]TEXT(1),[籍贯]TEXT(8),[出生年月]DATE,[所属部门)TEXT(10);“单位信息”表的字段及类型为:[部门名称]TEXT(10),[通讯地址]TEXT(20),[联系电话]TEXT(8),[邮政编码]TEXT(6)。

为了检测数据库的完整性,并在数据库受损时对其进行相应的修复处理,我们必须在主程序或其它适当的位置引入数据库检测与修复程序,如:

Public DataPath As String         '在公式模块部分申明公用变量(程序运行路径)

Public Sub Main()

   If Right(App.Path, 1) = "\" Then

      DataPath = App.Path

   Else

      DataPath = App.Path + "\"

   End If

   ……                          '其它程序代码

If Dir(DataPath + "Archives.MDB") = "" Then

NewMDB               '若不存在“档案”数据库,则建立之

   Else

ExistMDB             '若存在“档案”数据库,则检测其完整性,否则修复之

   End If

   ……                   '其它程序代码

End Sub

其中,NewMDB为建立“档案”数据库文件的子程序,而ExistMDB为“档案”数据库的检测与修复程序。它们的代码如下:

Public Sub NewMDB()            '建立“档案”数据库

   On Error Resume Next

   Set File_db = CreateDatabase(DataPath + "Archives.MDB", dbLangGeneral) '建立档案库

   SQL = "create table[职工信息]([姓名]TEXT(4),[性别]TEXT(1),[籍贯]TEXT(8),[出生年月]DATE,[所属部门]TEXT(10))"

   File_db.Execute SQL                                  '建立“职工信息”表

   Set PersonDB = File_db.OpenRecordset("职工信息")     '打开“职工信息”表

   SQL = "create table[单位信息]([部门名称]TEXT(10),[通讯地址]TEXT(20),[联系电话]TEXT(8),[邮政编码]TEXT(6))"

   File_db.Execute SQL                                  '建立“单位信息”表

   Set UnitDB = File_db.OpenRecordset("单位信息")       '打开“单位信息”表

End Sub

Public Sub ExistMDB()                        '检测与修复“档案”数据库

On Error GoTo ErrDo

Dim Tab_Num As Integer                   '库中表的个数

   Dim Tab1 As Boolean                      '是否存在“职工信息”表

   Dim Tab2 As Boolean                      '是否存在“单位信息”表

   Dim Ws1(4) As Boolean  '是否存在职工信息表各字段姓名性别籍贯出生年月所属部门

   Dim Ws2(3) As Boolean   '是否存在单位信息表各字段(部门名称,通讯地址,联系电话,邮政编码)

   Set File_db = OpenDatabase(DataPath+"Archives.MDB") '打开“档案”数据库

   Tab_Num = File_db.TableDefs.Count         '获取“档案”数据库中表的个数

   Tab1 = False

   Tab2 = False

   For i = 0 To Tab_Num - 1      '库中是否存在“职工信息、单位信息”两个表

       If File_db.TableDefs(i).Name = "职工信息" Then Tab1 = True

       If File_db.TableDefs(i).Name = "单位信息" Then Tab2 = True

   Next

   If Not Tab1 Then                      '库中不存在“职工信息”表时建立之

     SQL = "create table[职工信息]([姓名]TEXT(4),[性别]TEXT(1),[籍贯]TEXT(8),[出生年月]DATE,[所属部门]TEXT(10))"

      File_db.Execute SQL

   End If

   If Not Tab2 Then                      '库中不存在“单位信息”表时建立之

     SQL = "create table[单位信息]([部门名称]TEXT(10),[通讯地址]TEXT(20),[联系电话]TEXT(8),[邮政编码]TEXT(6))"

      File_db.Execute SQL

   End If


   '“职工信息”中不存在“姓名,,性别,籍贯,出生年月,所属部门”等字段时建立之

   Set PersonDB = File_db.OpenRecordset("职工信息")

   Ws_Num = PersonDB.Fields.Count            '获取表中的字段数

   For i = 0 To 4

       Ws1(i) = False

   Next

   For i = 0 To Ws_Num - 1

       If PersonDB.Fields(i).Name = "姓名" Then Ws1(0) = True    '表中是否有"姓名"字段

       If PersonDB.Fields(i).Name = "性别" Then Ws1(1) = True    '表中是否有"性别"字段

       If PersonDB.Fields(i).Name = "籍贯" Then Ws1(2) = True    '表中是否有"籍贯"字段

       If PersonDB.Fields(i).Name = "出生年月" Then Ws1(3) = True  '表中是否有"出生年月"字段

       If PersonDB.Fields(i).Name = "所属部门" Then Ws1(4) = True  '表中是否有"所属部门"字段

   Next

   PersonDB.Close                   '关闭打开的“职工信息表”表,以便向表中添加字段

   If Not Ws1(0) Then File_db.Execute ("alter table 职工信息 add column 姓名 Text(4)")       '若“职工信息”表中无"姓名"字段则添加之

   If Not Ws1(1) Then File_db.Execute ("alter table 职工信息 add column 性别 Text(1)")       '若“职工信息”表中无"性别"字段则添加之

   If Not Ws1(2) Then File_db.Execute ("alter table 职工信息 add column 籍贯 Text(8)")       '若“职工信息”表中无"籍贯"字段则添加之

   If Not Ws1(3) Then File_db.Execute ("alter table 职工信息 add column 出生年月 DATE")      '若“职工信息”表中无"出生年月"字段则添加之

   If Not Ws1(4) Then File_db.Execute ("alter table 职工信息 add column 所属部门 Text(10)")  '若“职工信息”表中无"所属部门"字段则添加之

   

   '“单位信息”中不存在“部门名称,通讯地址,联系电话,邮政编码”等字段时建立之

Set UnitDB = File_db.OpenRecordset("单位信息")

   Ws_Num = UnitDB.Fields.Count

   For i = 0 To 3

       Ws1(i) = False

   Next

   For i = 0 To Ws_Num - 1

       If UnitDB.Fields(i).Name = "部门名称" Then Ws2(0) = True    '表中是否有"部门名称"字段

       If UnitDB.Fields(i).Name = "通讯地址" Then Ws2(1) = True    '表中是否有"通讯地址"字段

       If UnitDB.Fields(i).Name = "联系电话" Then Ws2(2) = True    '表中是否有"联系电话"字段

       If UnitDB.Fields(i).Name = "邮政编码" Then Ws2(3) = True    '表中是否有"邮政编码"字段

   Next

   UnitDB.Close

   If Not Ws2(0) Then File_db.Execute ("alter table 单位信息 add column 部门名称 Text(10)")       '若“单位信息”表中无"部门名称"字段则添加之

   If Not Ws2(1) Then File_db.Execute ("alter table 单位信息 add column 通讯地址 Text(20)")       '若“单位信息”表中无"通讯地址"字段则添加之

   If Not Ws2(2) Then File_db.Execute ("alter table 单位信息 add column 联系电话 Text(8)")        '若“单位信息”表中无"联系电话"字段则添加之

   If Not Ws2(3) Then File_db.Execute ("alter table 单位信息 add column 邮政编码 Text(6)")        '若“单位信息”表中无"邮政编码"字段则添加之

   Exit Sub

ErrDo:

   MsgBox Error(Err), vbCritical, "数据库错误信息"

Resume Next

End Sub