3) Access文件 使用VBA来访问数据库,其实就是通过一定方法借助数据库引擎来访问,关键是使用什么方法来使用引擎。目前访问ACCESS数据库常用的有DAO和ADO方法,DAO就是Database Access Object(数据库访问对象)的英文缩写,DAO是老式的, 它目前还在使用的原因是向下兼容和ADO在一些地方还没有取代DAO的功能。ADO是ActiveX Data Object(数据控件对象)的英文缩写,是目前较新和功能较强的方法。 通过DAO或ADO可以访问多种类型的数据库,包括Access、SQL Server、Oracle等,也可访问应用程序的文件,如Excel文件、文本文件及Email和NEWS的文件。实际上利用控件来链接数据库,其概念大致相同,首先都需创建链接,其后用Open方法产生各种类型的数据集对象,再对数据集对象操作来使用数据库内容。 3.1 DAO使用的步骤及方法 (1) 引用DAO类型库 从VBE的”工具/引用”菜单中选择可引用“Microsoft DAO 3.6 Object Library”项. (2) 定义DAO对象 1) Dim db As Database, Database (数据库)变量对应于Access数据库. 2) Dim rs As RecordSet, RecordSet (记录集)变量对应于Access数据库的一个表或子表. (3) 打开数据库 Set db = OpenDatabase (Thisworkbooks.path & "\数据库名称.mdb" ) 如果数据库有密码则下面格式打开 Set dbTemp = OpenDatabase("数据库路径及文件名", False, False, ";PWD=12345") (4) 打开表 Set RS = DB.OpenRecordset("表名", dbOpenDynaset) Opendatabase 方法是打开数据库并返回此数据库的database对象,其语法如下: Set database的对象变量=opendatabase ([路径及数据库名称],[除外性],[只读]) 除外性:由true和false值所构成,当值为true时代表仅允许唯一的使用者使用数据库。 只读:由true和false值所构成,为true代表数据库仅提供读取的服务 Openrecordset方法用来创建一个新的recordset对象,语法为: Set recordset 对象变量=数据库变量.openrecordset(来源,种类) recordset种类有5种,分别为:表(table)、动态集(dynaset)、快照集(snapshot)、动态(dynamic)、正向(forward-only),其中常用的时动态集(dynaset)实际上是引用一个或多个表中数据记录的集合,是功能最强的数据记录集合类型,也是默认值。 (5) 操作数据库记录 对记录的操作就是使用记录集的对象方法和属性来实现,特附录常用属性和方法如下。 记录集对象的属性和方法: rs.Recordcount属性 用来记录目前数据记录的数量,如判断数据库是否为空 rs.EOF 属性 是否是记录的尾 rs.BOF 属性 是否是记录的头 rs.Nomatch 属性 返回上次查找成功与否 rs.Move n 方法 移动到第n 条记录 rs.Movenext 方法 移动到下一条记录 rs.MovePrevious 方法 移动到上一条记录 rs.Movefirst 方法 移动到第一条记录 rs.Lastfirst 方法 移动到最后一条记录 rs.Delete 方法 删除当前记录 rs.Edit 方法 修改当前记录 (步骤为三步: 1. 用edit方法设置为修改状态;2. 将数据分别赋到记录的各字段;3.用Updata方法,把记录更新到数据库中) rs.AddNew 方法 添加记录 (添加记录分三步:1. 用AddNew方法添加一个新的空白记录;2. 将数据分别赋到记录的各字段;3.用Updata方法,把记录更新到数据库中去) rs.Updata 方法 更新内容到数据库中 rs.Findfirst "字段名= ' " & “查找内容” & " ' " 方法 查找记录中字段与内容相配的首条记录 rs.Findnext 方法 查找下一个匹配记录 rs.FindLast 方法 查找最后一个匹配记录 rs.FindPrevious方法 查找前一个匹配记录 rs.Close 方法 关闭 记录集关闭链接 字段集的属性方法: rs. Fields.Count 属性 字段数目 rs. Fields(n) 第n+1个字段, Fields(0) 表示第一个字段 rs. Fields.Delete(Name As String) 方法 删除字段 rs. Fields.Append (Object As Object) 方法 添加字段 rs. Fields.Refresh 方法 更新 字段的属性方法: rs. Fields(n).Name rs. Fields(n).Size rs. Fields(n).Type rs. Fields(n).Fieldsize rs. Fields(n).value 示例: 打开一个数据库,建立浏览, 查询, 修改, 删除, 添加等功能。 Option Explicit Public totalRecs As Long, curRecNo As Long '用于记住 总记录数 和 当前记录号 Public DB1 As Database, RS1 As Recordset Private Sub UserForm_Initialize() '窗口显示 Set DB1 = OpenDatabase(ThisWorkbook.Path & "\pallet.mdb") Set RS1 = DB1.OpenRecordset("pallet", dbOpenDynaset) If RS1.EOF And RS1.BOF Then MsgBox "Database is Null." cmdExit_Click Else RS1.MoveLast '指针移动到最后记录,以便统计记录总数 RS1.MoveFirst totalRecs = RS1.RecordCount curRecNo = 1 SetData '设置窗口参数,按钮是否可用 End If End Sub Private Sub cmdFirst_Click() '第一条记录 RS1.MoveFirst curRecNo = 1 SetData End Sub Private Sub cmdLast_Click() '最后一条记录 RS1.MoveLast curRecNo = totalRecs SetData End Sub Private Sub cmdPrevious_Click() '前一条记录 RS1.MovePrevious curRecNo = curRecNo - 1 SetData End Sub Private Sub cmdNext_Click() '下一条记录 RS1.MoveNext curRecNo = curRecNo + 1 SetData End Sub Private Sub cmdAdd_Click() '增加一条记录 Dim i As Integer RS1.AddNew For i = 1 To 5 RS1.Fields(i) = Me.Controls("txt" & i) Next i RS1.Update totalRecs = totalRecs + 1 curRecNo = totalRecs RS1.MoveLast SetData End Sub Private Sub cmdDelete_Click() '删除当前记录 RS1.Delete RS1.MoveNext If RS1.EOF = True Then RS1.MovePrevious '指针到底就朝前移 curRecNo = totalRecs - 1 End If totalRecs = totalRecs - 1 SetData End Sub Private Sub cmdModify_Click() '修改当前记录 Dim i As Integer RS1.Edit For i = 1 To 5 RS1.Fields(i) = Me.Controls("txt" & i) Next i RS1.Update End Sub Private Sub cmdFind_Click() '查找记录,与第一个文本框内容相等 RS1.FindFirst "palletno='" & txt1.Text & "'" If RS1.NoMatch Then MsgBox "Sorry, find Nothing!" Else curRecNo = RS1.AbsolutePosition + 1 SetData End If End Sub Private Sub cmdClear_Click() '清除显示内容 Dim i As Integer For i = 1 To 5 Me.Controls("txt" & i) = "" Next i End Sub Private Sub cmdExit_Click() '退出窗口 RS1.Close DB1.Close Unload Me End Sub Sub SetData() '窗口数据设置 Dim i As Integer txtCurRecNo.Text = curRecNo cmdFirst.Enabled = curRecNo > 1 cmdPrevious.Enabled = curRecNo > 1 cmdLast.Enabled = curRecNo < totalRecs cmdNext.Enabled = curRecNo < totalRecs For i = 1 To 5 Me.Controls("txt" & i).Text = RS1.Fields(i) Next End Sub
[此贴子已经被作者于2006-7-21 16:05:45编辑过] |