VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 数据库实用技巧操作(什么导入呀、导出呀都有了)
发表评论(0)作者:影子, 平台:VB6.0+Win98, 阅读:54223, 日期:2000-12-22
数据库实用技巧操作
作者:影子

(1)程序启动时自动判断 MDB文件是否损坏并自动修复
概述:现在的许多数据库程序都是使用的 MDB 数据库,如果由于异常关机等操作,造成 MDB 文件被损坏,那么当运行程序时,便会出现以下错误讯息:
Can`t open database `name`. It may not be a database that your application recognizes, or the file may be corrupt. (Error 3049)
如果在程序中没有加入错误判断,那么程序就会中断退出,这会给使用者留下非常不好的印象,如果使用者会用 OFFICE97 还会使用 Access 的数据库修复功能,呵呵,如果不会那就只有叫天了。
那么如果在程序中对 MDB 的错误进行判断和修复呢?
实现方法:
Private Sub Form_Load()
Dim db As Database
On Error GoTo error1
Set db = OpenDatabase("c:\test.mdb") `假设使用这个数据库
On Error GoTo 0
: `正常程序开始
:
Exit Sub

error1:
If Err = 3049 Then `判断MDB文件损坏
DBEngine.RepairDatabase "C:\test.mdb" `自动修复 MDB 文件
Resume `在错误处理程序结束后,恢复原有的运行
Else
MsgBox Err & Error(Err) `显示其他的错误,你也可根据其他的错误,执行不同的语句
End If
End Sub

(2) 处理加了密码的MDB文件
当 MDB 文件加了密码,直接由 Access 打印MDB文件时,会出现密码对话框,询问密码。但是若要由 VB 程序中打印,必須更改 VB 程序中打开MDB文件的指令,否则会出现错误信息!以下针对各种情况,分別加以说明:
1、 使用 DAO 命令打开MDB文件:OpenDatabase
若要由程序中打开,命令如下:
Set DB = OpenDatabase(DatabaseName, False, False, ";Pwd=密码")
实例:
Dim db As Database
Set db = OpenDatabase("C:\db1.mdb", False, False, ";Pwd=1")
若要使用 Data 控件,设定方法如下:
①设定 DatabaseName 属性 (MDB文件名称 / 含路径)
②设定 Connect 属性,將预设的字串 "Access" 改成 ";Pwd=密码" (不含双引号)
③设定 RecordSource 属性  
2、使用 ADO 命令打开MDB文件:
在使用 ADODC 或 DataEnvironment 设定好之后,直接利用属性窗口修改 ConnectionString 属性(附属于 ADODC) 或 ConnectionSource 属性(附属于 DataEnvironment 的 Connection 控件),修改的方法是在属性之后增加以下参数:
;Jet OLEDB:Database Password=密码
除了 ADODC 及 DataEnvironment 之外, 直接使用 ADO 控件來打开含有密码的 mdb MDB文件,设定参数的方法也是相同的。 
3、压缩加了密码的MDB文件:CompactDatabase
DBEngine.CompactDataBase "原MDB文件", "新MDB文件", , , ";pwd=密码"
实例例如:
DBEngine.CompactDatabase "C:\Db1.mdb", "C:\Db2.mdb", , , ";pwd=1"  
4、修复加了密码的MDB文件: RepairDatabase
不必理会MDB文件设定的密码!
DBEngine.RepairDataBase "MDB文件"
实例例如:
DBEngine.RepairDataBase "C:\Db1.mdb"

(三)用 DAO 或 ADO 正确访问 Access 2000
当你使用 DAO 访问 Access 2000 时,是否会出現以下的错误信息?
"Run-time error 3343 Unrecognized Database Format XXX"
这个错误信息有二个解決的方法:
1、如果你是使用 Data Control 来连結 Access 2000 的数据库时:
你必须在设定 Data Control 的 Source 前先加上一行
Set Data1.Recordset = rsDAO36 `rsDAO36 is a DAO 3.6
2、如果你是引用「Microsoft DAO 3.51 Object Library」来访问 Access 2000 的数据库时:
请加入【工程】【部件】「Microsoft DAO 3.6 Object Library」
如果你是使用 ADO 访问 Access 2000
以往在 VB6 中利用 ADO OLEDB Provider 3.51 使用 Access 97 数据库,程序都能正常的运行。但是自从将 Access 97 升级到 Access 2000 之后,就无法順利的使用 Access 2000 数据库了,不知道您是否也曾遇到这样的情形呢?
其实这种事情在 Microsoft 已经是思空见惯的事情了!任何软件只要有了新的版本,就会有和旧版本不相容的问题产生!
而这一次是因为 Access2000 己经使用 Jet 4.0 Engine,所以解決方法如下:
在您的 ADO 的 Connect String 中的 Provider 必须修改为:"PROVIDER=Microsoft,Jet.OLEDB.4.0"

(四)如何 OPEN 一个 XLS 文件。
Option Explicit
Dim Db As Database
Dim Rs As Recordset
Private Sub Form_Load()
Set Db = OpenDatabase("c:\temp\book1.xls", False, False, "Excel 8.0;")
Set Rs = Db.OpenRecordset("sheet1$")
End Sub
Private Sub Form_Unload(Cancel As Integer)
Rs.Close
Db.Close
End Sub

(五)MDB文件的导出 ---- 使用 DAO
在很多 VB 的MDB文件书籍中,都会很完整的提到:如何由其他种类的文件中將资料导入MDB文件,但是却很少有书提到:如何將MDB文件中的资料,导出到各种不同的文件类型的文件中,连 VB 的 Help 中也是这样!
或许是大家都认为MDB文件主题的重点是在MDB文件本身吧!
但是,在实际的MDB文件程式運用中,却常常需要將MDB文件导出到各种不同的文件类型的文件中,这些文件可能是 DBase文件、文本文件 (.Txt)、Excel 文件、Html 文件、Access 文件或其他类型的MDB文件文件 (ODBC)...等。
在本主题中,考虑到並不是每一个人都有 Oracle 或 SQL Server 的环境,为了让大家都能夠实行,我们將以 Access MDB文件来作练习,而练习的文件也使用 VB 本身提供的 Biblio.mdb (位于各版本 VB 的目录下)。
预计要练习导出的文件类型有五种:DBase文件、文本文件 (.Txt)、Html 文件、Excel 文件、Access 文件。除了这五种之外,下面的命令可以將MDB文件导出到任一种 VB 支持的MDB文件或文件中。
在练习之前,要將导出文件的 SQL 命令先说明一下:
SELECT Table.Fields INTO [dbms type;DATABASE=path].[unqualified filename] FROM [Table or Tables]
SELECT Table.Fields INTO [MDB文件种类;DATABASE=MDB文件路径].[MDB文件文件名称] FROM [Table or Tables]
至于【MDB文件种类】及【MDB文件路径】,视MDB文件或文件类型之不同而异,详见【注一】。
如果上面说的都清楚了,那我们要开始这一个练习了!
在 Form 上放置一个 CommandButton,加入 Microsoft DAO 3.51 Object Library,我们將使用 Biblio.mdb 的 authors Table,在 Command1_Click 中加入以下程序代码:
Dim db As Database
Set db = Workspaces(0).OpenDatabase(App.Path & "\biblio.mdb")
`db.execute "SELECT Table.Fields INTO [dbms type;DATABASE=path].[unqualified filename] FROM [Table or Tables]"
在以上程式中,db.execute 指令行之指令依MDB文件或文件的种类说明如下:
一、DBase文件
SQL 命令:SELECT * INTO [dBase III;DATABASE=MDB文件路径].[dbase文件名称] FROM [authors]
db.Execute "SELECT * INTO [dBase III;DATABASE=C:\test].[authors.DBF] FROM [authors]"
注意事項:
1、authors.DBF 事先不可存在,否则会产生错误!
2、若您沒有 Dbase,您可以使用 Access 来连結这个 Table,以便观察結果!
二、文本文件 (.Txt)
SQL 命令:SELECT * INTO [Text;DATABASE=文本文件路径].[文本文件名称] FROM [authors]
db.Execute "SELECT * INTO [Text;DATABASE=C:\test].[authors.TXT] FROM [authors]"
注意事項:
1、authors.TXT 事先不可存在,否则会产生错误!
2、此命令会产生的文件有二个,第一个就是文本文件 authors.TXT,第二个是 Schema.ini。
3、文本文件之格式为 CSV 之文件格式,以逗点分开,实际呈现方式如下:
  "Au_ID","Author","Year Born"
  1,"Jacobs, Russell",1950
  2,"Metzger, Philip W.",1942
4、Schema.ini 若事先不存在会新产生一个,若已存在,则会在原文件后面直接 Append。
5、至于 Schema.ini 的內容为此次导出的相关资讯,格式同一般的 Ini 档,详細內容如下:
  [authors.TXT]
  ColNameHeader=True
  CharacterSet=OEM
  Format=CSVDelimited
  Col1=Au_ID Integer
  Col2=Author Char Width 50
  Col3="Year Born" Short
三、Html 文件
SQL 命令:SELECT * INTO [Excel 8.0;DATABASE=Html文件路径].[Html文件名称] FROM [authors]
db.Execute "SELECT * INTO [HTML Export;DATABASE=C:\test].[authors.HTM] FROM [authors]"
注意事項:
1、authors.HTM 事先不可存在,否则会产生错误!
2、此命令会产生的文件有二个,第一个就是文本文件 authors.HTM,第二个是 Schema.ini。
3、Schema.ini 若事先不存在会新产生一个,若已存在,则会在原文件后面直接 Append。
4、至于 Schema.ini 的內容为此次导出的相关资讯,格式同一般的 Ini 档,详細內容如下:
  [authors.HTM]
  ColNameHeader=True
  CharacterSet=ANSI
  Format=HTML
  Col1=Au_ID Integer
  Col2=Author Char Width 50
  Col3="Year Born" Short
四、Excel 文件
SQL 命令:SELECT * INTO [Excel 8.0;DATABASE=文件路径+档名].[工作表名称] FROM [authors]
db.Execute "SELECT * INTO [Excel 8.0;DATABASE=C:\test\authors.XLS].[authors] FROM [authors]"
注意事項:
1、authors.XLS 可事先存在,也可以不存在,会自动产生一个。
2、工作表 authors 事先不可存在,否则会产生错误!
五、Access 文件
SQL 命令:SELECT * INTO [新MDB文件路径+档名][新表名称] FROM [authors]
`导出到同一MDB文件 ( 新 Table 为 authors1 )
`新 Table authors1 事先不可存在,否则会产生错误!
db.Execute "SELECT * INTO [authors1] FROM [authors]"
`导出到不同的MDB文件 ( 新MDB文件为 db1,新 Table 为 authors )
`新MDB文件 db1事先必須存在,否则会产生错误!
`但是其中新 Table authors 事先不可存在,否则会产生错误!
db.Execute "SELECT * INTO [C:\test\db1.mdb].[authors] FROM [authors]" 

注一:各种可能的MDB文件种类 Connect 属性設定方式:
MDB文件种类 MDB文件宣告方式 MDB文件路径 (或加上档名)
Microsoft Jet Database [database]; drive:\path\filename.mdb
dBASE III dBASE III; drive:\path
dBASE IV dBASE IV; drive:\path
dBASE 5 dBASE 5.0; drive:\path
Paradox 3.x Paradox 3.x; drive:\path
Paradox 4.x Paradox 4.x; drive:\path
Paradox 5.x Paradox 5.x; drive:\path
Microsoft FoxPro 2.0 FoxPro 2.0; drive:\path
Microsoft FoxPro 2.5 FoxPro 2.5; drive:\path
Microsoft FoxPro 2.6 FoxPro 2.6; drive:\path
Microsoft Visual FoxPro 3.0 FoxPro 3.0; drive:\path
Microsoft Excel 3.0 Excel 3.0; drive:\path\filename.xls
Microsoft Excel 4.0 Excel 4.0; drive:\path\filename.xls
Microsoft Excel 5.0 or Microsoft Excel 95 Excel 5.0; drive:\path\filename.xls
Microsoft Excel 97 Excel 8.0; drive:\path\filename.xls
Lotus 1-2-3 WKS and WK1 Lotus WK1; drive:\path\filename.wk1
Lotus 1-2-3 WK3 Lotus WK3; drive:\path\filename.wk3
Lotus 1-2-3 WK4 Lotus WK4; drive:\path\filename.wk4
HTML Import HTML Import; drive:\path\filename
HTML Export HTML Export; drive:\path
Text Text; drive:\path
ODBC ODBC;
DATABASE=database;
UID=user;
PWD=password;
DSN= datasourcename;
[LOGINTIMEOUT=seconds;] None
Microsoft Exchange Exchange 4.0;
MAPILEVEL=folderpath; [TABLETYPE={ 0 | 1 }];[PROFILE=profile;]
[PWD=password;]
[DATABASE=database;] drive:\path\filename.mdb

(六)如何將 Excel 的文件导入 Access文件?
下面我已將程序代码做成模块,只要导入必要之参数即可!
此一模块共有四个参数:
1、sSheetName:要导出数据的文件名称 (Sheet name),例如 Sheet1
2、sExcelPath:要导出数据的 Excel 文件路径名称 (Workbook path),例如 C:\book1.xls
3、sAccessTable:要导入的 Access Table 名称,例如 TestTable
4、sAccessDBPath:要导入的 Access 文件路径名称,例如 C:\Test.mdb
在声明中加入以下:
Private Sub ExportExcelSheetToAccess(sSheetName As String, _
sExcelPath As String, sAccessTable As String, sAccessDBPath As String)
Dim db As Database
Dim rs As Recordset
Set db = OpenDatabase(sExcelPath, True, False, "Excel 5.0")
Call db.Execute("Select * into [;database=" & sAccessDBPath & "]." & _
sAccessTable & " FROM [" & sSheetName & "$]")
MsgBox "Table exported successfully.", vbInformation, "Yams"
End Sub
使用范例如下:將 C:\book1.xls 中的 Sheet1 导入 C:\Test.mdb 成为 TestTable
ExportExcelSheetToAccess "Sheet1", "C:\book1.xls", "TestTable", "C:\Test.mdb"

(七)主題: 如何使用 ADO 來压缩或修复 Microsoft Access 文件?
以前使用 DAO 時,Microsoft 有提供 CompactDatabase Method 來压缩 Microsoft Access 文件,RepairDatabase Method 來修复损坏的 Microsoft Access 文件,。可是自从 ADO 出來之后,好像忘了提供相对的压缩及修复 Microsoft Access 文件的功能。

现在 Microsoft 发现了这个问题了,也提供了解決方法,不过有版本上的限制!限制说明如下:
ActiveX Data Objects (ADO), version 2.1
Microsoft OLE DB Provider for Jet, version 4.0
这是 Microsoft 提出的 ADO 的延伸功能:Microsoft Jet OLE DB Provider and Replication Objects (JRO)
这个功能在 JET OLE DB Provider version 4.0 (Msjetoledb40.dll) 及 JRO version 2.1 (Msjro.dll) 中第一次被提出!
这些必要的 DLL 文件在您安裝了 MDAC 2.1 之后就有了,您可以在以下的网页中下载 MDAC 的最新版本!
Universal Data Access Web Site
在下载之前先到 VB6 中检查一下,【工程】【引用】中的 Microsoft Jet and Replication Objects X.X library 如果已经是 2.1 以上的版本,您就可以不用下载了!
在您安裝了 MDAC 2.1 或以上的版本之后,您就可以使用 ADO 來压缩或修复 Microsoft Access 文件,下面的步骤告訴您如何使用 CompactDatabase Method 來压缩 Microsoft Access 文件:
1、新建一個新表单,选择功能表中的【控件】【引用】。
2、加入 Microsoft Jet and Replication Objects X.X library,其中 ( X.X 大于或等于 2.1 )。
3、在适当的地方加入以下的程序代码,记得要修改 data source 的內容及目地文件的路径:
Dim jro As jro.JetEngine
Set jro = New jro.JetEngine
jro.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\nwind2.mdb", _ `來源文件
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\abbc2.mdb;Jet OLEDB:Engine Type=4" `目的文件
在 DAO 3.60 之后,RepairDatabase Method 已经无法使用了,以上的程序代码显示了 ADO CompactDatabase Method 的用法,而它也取代了 DAO 3.5 時的 RepairDatabase method!

(八)主题: 如何删除整个 Access 资料库內的资料?
当一个资料库用了一陈子之后,您可能必須清除数据库中所有的资料,例如:我在开发一个新系统时,使用一个 Access 数据库,里面可能有二、三十个 Table,中间经过系统的测试,系统完成后,系统系统上线时,必须將所有的测试资料删除!
当然,要完成这件事情有很多种作法,例如:
1、在 Access 中逐一打开所有数据库的每一个 Table → 选取所有资料 → 删除。
2、在 Access 打开一个新资料库 → Import 原数据库的所有 Table (只有 Structure)。
3、写一段 VB 小程序去删除所有资料!
前二种作法是人工的作法,当 Table 越多时就越烦琐,不在我们讨论之列,至于第三种作法,我已经写了一个小小的模块,您只要导入数据库的名称、路径就可以自动帮您完成了! 程序代码如下:
Function DeleteAllRecords(ByVal dbpath As String)
Dim db As Database
Dim X As Integer
Dim TDF As TableDef
Set db = opendatabase(dbpath)
For X = 0 To db.TableDefs.Count - 1
Set TDF = db.TableDefs(X)
If (TDF.Attributes And dbSystemObject) = 0 Then `关闭系统的 Table
db.Execute "Delete * From [" & db.TableDefs(X).Name & "]"
End If
Next X
End Function
在 Access 资料库中,除了您自己建立的 Table 之外,还隐藏了一些系统的 Table,判断 dbSystemObject 就是为了要关闭这些系统的 Table。
程序中实际使用时,方法如下:
Private Sub Command1_Click()
DeleteAllRecords "c:\Test.mdb" `c:\Test.mdb 要修改成您自己的数据库
End Sub
注:Access 数据库有个缺点,当您写资料进去时,文件会变大,但是删除除数据库中的数据后,数据库文件並不会变小,所以,如果您使用以上的程序來清空 Access 数据库內的数据后,原來已经 10MB 的数据库,处理完之后文件大小仍然还是 10MB!
注:建议在清空数据库中之数据后,再使用 CompactDataBase 來处理,它会將您的数据库再还原成只有几十k 或几百k 的大小。CompactDataBase 之语法如下:
DBEngine.CompactDataBase "原数据库名称", "新数据库名称", , , ";pwd=密码"
例子:
DBEngine.CompactDatabase "C:\Db1.mdb", "C:\Db2.mdb", , , ";pwd=1"

好了,有关数据库实用技巧先跟大家介绍到这里(呵呵,希望有机会再介绍),如果大家对数据库方面还有什么问题,可到 http://www.d1vb.com 来,我们一起讨论。