VB 版 (精华区)
发信人: zxfsnow (最近睡眠太少), 信区: VB
标 题: VB中兼容非ACCESS格式数据库4
发信站: 哈工大紫丁香 (2000年06月07日19:14:43 星期三), 转信
发信人: eren (怕谁啊..), 信区: VB
标 题: VB中兼容非ACCESS格式数据库-4
发信站: 虎踞龙蟠 (Sat May 6 20:15:43 2000), 转信
三、调用数据存取对象对非Access数据库编程的方法及其实例
VB专业版中使用数据库存取对象变量(DAO)的方法最具有功能强大、编程灵
活的特点。它能够在程序中存取ODBC 2.0的管理函数;可以控制多种记录集类型:
Dynaset,Snapshot 及Table记录集合对象;可以存储过程和查询动作;可以存取
数据库集合对象,例如 TableDefs,Fields,Indexes及QueryDefs;具有真正的事
物处理能力。这种方法对数据库处理的大多数情况都非常适用。
从VB的程序代码的角度来看,提供给VB程序员的记录集对象(RecordSet)同所使
用的数 据库格式及类型是相互独立的。即对FoxPro等数据库仍然可以使用众多的
数据库存取对象变量,这就为非Access数据库的访问提供了最重要的前提和方法。
在VB中从一种数据库类型转化为另一种数据库类型几乎不需要或只需要很少的代码
修改。而且,尽管dBASE、Paradox本身的DDL(Data Definition Language,即数
据定义语言)和DML(Data Manipulation Language,即数据操纵语言)是非结构
化查询的,但它们仍然可以使用VB的SQL语句和JET引擎来操纵。
因而对FoxPro等非Access数据库而言,调用数据库存取对象的方法同样也是一种最
佳的选择。
(一)非Access数据库的新建及库结构的修改
VB专业版中的数据库存取对象变量可以分为两类,一类用于数据库结构的维护
和管理,另一类用于数据的存取。其中表示数据库结构时可以使用下面的对象:
DataBase、TableDef、Field、Index,以及三个集合(Collection):TableDefs、
Fields和Indexes。每一个集合都是由若干个对象组成的,这些数据对象的集合可以
完全看作是一个数组,并按数组的方法来调用。一旦数据库对象建立后,就可以用它
对数据库的结构进行修改和数据处理。对于非Access数据库,大部分都是对应于一个
目录,所以可以使用VB的MkDir语句先生成先生成一个目录,亦即新建一个数据库。
而每一个非Access数据库文件可看作是此目录下的一个数据表(Table),但实际上
它们是互相独立的。
下面是新建一个FoxPro 2.5格式数据库的程序实例。
Sub CreateNew ( )
Dim Db1 As database, Td As TableDefs
Dim T1 As New Tabledef,F1 As New Field, F2 As New Field, F3 As New Field
Dim Ix1 As New Index
Dim Path As String
Const DB_TEXT = 10,DB_INTEGER = 3
ChDir "\"
Path$ = InputBox( "请输入新路径名:", "输入对话框" )
MkDir Path$ '新建一个子目录
Set Db1 = OpenDatabase(Path$, True, False, "FoxPro 2.5;")
Set Td = Db1.TableDefs
T1.Name = "MyDB" '新建一个数据表,数据表名为MyDB
F1.Name = "Name", F1.Type = DB_TEXT, F1.Size = 20
F2.Name = "Class", F2.Type = DB_TEXT, F2.Size = 20
F3.Name = "Grade", F3.Type = DB_INTEGER
T1.Fields.Append F1 '向数据表中添加这些字段
T1.Fields.Append F2
T1.Fields.Append F3
Ix1.Name = "Name" ,Ix1.Fields = "Name", Ix1.Primary = True '新建索引
T1.Indexes.Append Ix1 '向数据库的Indexes集合中添加新的索引
Td.Append T1 '向TableDefs集合中添加新表
Db1.Close '必须先关闭数据库对象再退出
End Sub
在此段程序中值得注意的是,对非Access数据库的新建不用CreateDatabase函
数,而是用OpenDatabase函数,这点与Access数据库大不一样,但也仅仅是针对非
Access数据库而言才能用OpenDatabase函数来新建一个数据库对象。
在VB中,外来数据库的不同格式只在OpenDatabase函数的最后一个参数Connect中
有所体现,不同格式的外来数据库其Connect参数值也不同,除此以外,在VB专业版
中其编程的方法和步骤及技巧是基本相同的。新建子目录后,不能用ChDir语句进入
它,否则会出现"'MyDB' is not a valid path" 的错误。同时,对F1、F2、F3等新
建字段对象的定义也必须分别定义,否则会出现 "Element not defined"(变量未
定义)的错误。通过一定的编程技巧还可以实现非Access数据库的库结构的拷贝,
下面是一段相应的程序。
Function GetPos( TFname$ )
'此自定义函数完成对带路径文件名中最后一个"\" 符号的定位
Dim I As Integer,Tmp As String
Tmp$ = TFname$
For I = 0 To 255
Pos% = Pos% + InStr( 1, Tmp$, "\" )
E1% = InStr( 1, Tmp$, "\" )
Tmp$ = Right$( Tmp$, Len(TFname$) - Pos% )
1% = 0 Then '找到最后一个"\"符号的位置,并记下来
GetPos = Pos%
Exit For
End If
Next I
End Funtion
Sub CopyStruc( )
Dim Db1 As database, Ds1 As Dynaset,Td As TableDefs, Fld As Fields
Dim Fname,SourceF,DestF,Path As String,Pos1 As Integer
CMD1.Filter = "FoxPro数据库文件(*.DBF)|*.DBF|所有文件|*.*"
'CMD1为一个对话框的控制名
CMD1.DialogTitle = "调入Ms FoxPro数据库文件"
CMD1.FilterIndex = 1
CMD1.Action = 1
DestF$ = InputBox$( "请输入目标文件名:", "输入对话框" )
If CMD1.FileName = " "Or DestF$ = " " Then
MsgBox "源文件或目标文件名为空"
Exit Sub
Else
SourceF$ = CMD1.Filename
End If
FileCopy SourceF$, DestF$
Pos1% = GetPos( SourceF$ )
Path$ = Left$( SourceF$, Pos1% ) '获得源文件所在的路径名
Fn$ = Left$( DestF$, InStr(1, DestF$, ".") - 1 ) '获得新文件的数据库名
'Fn$为实际的Foxpro数据库名,也即CreateDynaset函数内的source属性值
Set Db1 = OpenDatabase( Path$, True, False, "FoxPro 2.5;" )
Set Ds1 = Db1.CreateDynaset( Fn$ )
If Ds1.EOF And Ds1.BOF Then '数据库内的无记录则退出
TotalNum% = 0
MsgBox "此数据表为空表!"
Exit Sub
End If
'删除记录,保留库结构
Ds1.MoveFirst
Ds1.MoveFirst
Do
Ds1.Delete
Ds1.MoveNext
Loop Until Ds1.EOF
End Sub
可见,拷贝库结构的方法在于把一个已存在的数据库拷贝到一个新文件中,然
后再删除新文件内的所有记录,保留其库结构,得到的就是一个新建的库结构完整
的空库。
(二)非Access数据库的动态调入
在实际应用的很多情况下,经常需要在对一些事先并不知道其具体库结构的数
据库进行调入、显示及打印其记录。因而实现未知格式数据库的动态调入也是评价
VB数据库应用程序兼容性的一个重要标志。
在VB中,网格控件非常适合用于浏览数据库中的数据,只需把数据放入网格即可。
在使用网格时动态调入的关键在于记录(Colume)内容和字段(Row)内容(包括
字段的名称、类型、值等)的读取,因而生成一个可以对应于一个或多个数据表中
的全部或部分记录的Dynaset对象是非常必要的。Dynaset对象还可以是一个动态查
询的结果,能进行记录的增加、删除和修改等操作。下面是一段用网格显示FoxPro
数据库的程序。
Sub DBLoad( )
Dim Db1 As database, Ds1 As Dynaset,Td As TableDefs,Fld As Fields
Dim Fname,Tmp,Path ToTalNum As String,I,J,Pos1 As Integer
Dim MyNum '定义一个变体型数据
CMD1.Filter = "FoxPro数据库文件(*.DBF)|*.DBF|所有文件|*.*"
CMD1.DialogTitle = "调入Ms FoxPro数据库文件"
CMD1.FilterIndex = 1
CMD1.Action = 1
Fname$ = CMD1.Filename
Pos1% = GetPos( Fname$ )
Path$ = Left$( Fname$, Pos1% )
Tmp$ = Right$( Fname$, Len(Fname$)-Pos1)
Fn$ = Left$( Tmp$, Instr( 1,Tmp$,".") - 1 )
Set Db1 = OpenDatabase( Path$, True, False, "FoxPro 2.5;" )
Set Ds1 = Db1.CreateDynaset( Fn$ )
If Ds1.EOF And Ds1.BOF Then '数据库表内无记录则退出
TotalNum = 0
MsgBox "此数据表为空表!"
Exit Sub
Else '显示数据库表内的实际记录数
Ds1.MoveLast
TotalNum = Ds1.RecordCount
Grid1.Rows = TotalNum + 1 '置网格的实际行数
Total.Caption = Str$(TotalNum)
End If
'置网格的实际列数并置每列的宽度
Set Td = Db1.TableDefs
Set Fld = Td( Fn$ ).Fields
Grid1.Cols = Fld.Count + 1
Grid1.ColWidth(0) = 600
For I = 1 To Fld.Count
Grid1.ColWidth(I) = 1500
Next I
'在网格的第一行内填入字段名
Grid1.Row = 0, Grid1.Col = 0
Grid1.Text = "序号"
For I = 1 To Fld.Count
Grid1.Col = I
Grid1.Text = Fld(I - 1).Name
Next I
'在网格中填入相应的数据
Ds1.MoveFirst
I = 1
Do While Not Ds1.EOF
Grid1.RowHeight(I) = 300
Grid1.Row = I
Grid1.Col = 0
Grid1.Text = I
For J = 1 To Fld.Count
Grid1.Col = J
MyNum = Ds1.Fields(J - 1).Value
'对记录的数据类型进行判断后做相应的处理
If IsNumeric( MyNum ) Or IsDate( MyNum ) Then
Grid1.Text = Str$( Ds1.Fields(J - 1).Value )
Else If VarType( MyNum ) = 8 Then
Grid1.Text = Ds1.Fields(J - 1).Value
Else If VarType( MyNum ) = 0 Or VarType( MyNum ) = 1 Then
Grid1.Text = " "
End If
On Error Resume Next
Next J
Ds1.MoveNext
Ds1.MoveNext
I = I + 1
Loop
Ds1.Close
Db1.Close
Exit Sub
最后应记住,在VB的数据库应用程序运行之前,一定要在AUTOEXEC.BAT文件中
加入一句SHARE.EXE /L:500。
以上所有程序均在Pentium/166机、中文Windows95下用VB4调试通过。
四、结束语
对非Access数据库的兼容是VB数据库编程中不可分割的重要部分。因而熟练掌
握使用DAO方法对非Access数据库的编程是极为重要的。并且,一定编程技巧的应用
也有助于弥补VB对外来数据库支持的不足。
参考文献
1 【美】Que CorPoration 《开放数据库互连-ODBC 2.0使用大全》
清华大学出版社 1995;18:255~276
2 美 Darwin Boyle等 《 Visual Basic 4 Developer's Guide 》
北京:机械工业出版社 1997.1
3 美 Stefano Maruzzi 《The Microsoft Windows 95 Developer's Guide》
北京:机械工业出版社 1997.1
(来信请寄:西安第四军医大学生物医学工程系电子学教研室 焦纯 收
联系电话:029-3251347 邮编:710032) 1998年9月27日
--
※ 修改:·eren 於 May 6 20:42:21 修改本文·[FROM: 202.119.27.47]
--
以科计为本,以产业报国!
超越自我,飞跃无限!
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.235.249]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.529毫秒