本页内容是《VB5.0 中远程数据库的访问》同时我们还提供济宁地区的网站建设,百度,雅虎,google的推广,点金,商友,等营销软件
请输入关键字:

标题搜索 内容搜索  

你现在所在的位置->首页->vb编程->VB5.0 中远程数据库的访问

VB5.0 中远程数据库的访问

时间:[2007-11-1 22:45:23]     作者:作者不详

国防大学研究生院 许蔓舒
  在 VB5.0 中,用 Microsoft Jet 数据库引擎和数据访问对象 DAO(Data Access Object)可以创建功能强大的客户/服务器应用程序。对远程数据库的访问是开发这类应用程序的关键环节,本文将介绍在 VB5.0 中用 DAO 通过 Miscrosoft Jet 数据库引擎访问远程数据库的方法。

  用 DAO 访问远程数据库大体上可以通过三步来实现, 即数据连接、数据处理和断开连接。下面主要介绍数据连接和数据处理的具体操作。

一、数据连接

  DAO 一般通过链接远程表的方式来进行数据连接。这样,数据虽然驻留在远程数据源上,但在本地的 Microsoft Jet 数据库中可以存储与远程数据的永久性连接,同时缓存链接的表结构信息,从而在下一次访问该表时, 不用再次从服务器中检索这些结构信息,加快了连接速度。一旦链接了一个表,该链接便会保留在各会话 期间,直到连接断开。链接远程表的具体操作是:

用 OpenDatabase 方法打开将要包含该链接的本地 Microsoft Jet 数据库

用 CreateTableDef 方法在该数据库中创建一个新的 TableDef 对象

将 TableDef 对象的 Connect 属性设置为一个合法的连接字符串,标识要访问的远程数据库类型、数据文件的路径以及用户名和远程数据源密码等。

将 TableDef 对象的 SourceTableName 属性设置为远程数据库中要访问的表的名称。

添加 TableDef 对象到 TableDefs 集合中。
  实现链接远程表操作的过程如下:

Public Sub LinkTable(strDB As String, strRoDB As String, _
strCn As String, strTdf As String, linkTdfName As String)
  Dim linkTdf As New TableDef
  Set dbs = OpenDatabase(strDB)
  linkTdf.Name = linkTdfName
100
  tempTable = UCase(linkTdf.Name)
  For i = 0 To dbs.TableDefs.Count - 1
    If UCase(dbs.TableDefs(i).Name) = tempTable Then
      If MsgBox(linkTdfName + " 已存在,是否删除 ?", _
      vbQuestion + vbYesNo) = vbYes Then
        dbs.TableDefs.Delete linkTdf.Name
        Exit For
      Else: MsgBox "重新输入新表名"
      linkTdfName = InputBox(" 新表名")
      GoTo 100
      End If
    End If
  Next i
Set linkTdf = dbs.CreateTableDef(linkTdfName)  ’链接远程表
  linkTdf.Connect = ";database=" + strCn
  linkTdf.SourceTableName = strTdf
  dbs.TableDefs.Append linkTdf
End Sub

  上述过程用来实现远程表的连接,它有 5 个参数,其中 strRoDB 是要访问的远程数据库名(包括路径);strTdf 是该数据库中的表名;strDB 是要链接的本地数据库(包括路径);linkTdfName 是本地数据库的一个新表名,用来建立远程表的链接;strCn 是指定连接信息的字符串。需要特别注意的是,除了在访问远程 Microsoft Jet 数据库时,连接字符串要以分号(;)开头外,指定连接信息的字符串都必须以所访问的远程数据库类型开头。DAO 可以访问的远程数据源有以下三类:

Microsoft Jet 数据源,如:Access 数据。

IISAM(可安装的索引化顺序访问方法)格式数据源,如:FoxPro、Paradox、dBASE 数据。

ODBC 数据源,如:SQL Server 数据、Oracle 数据。
  例如:设网络服务器名为server,共享目录为 C:\Sales 的 FoxPro 3.0 数据库,连接字符串应为

  strCn="FoxPro3.0;database=\\server\c$\Sales\Region1"

  此外,DAO 通过 Microsoft Jet 数据库引擎访问远程数据时,还可以用 OpenDatabase 方法直接打开远程表。在本地数据库中并未存储与远程数据源建立连接所需要的信息。如果使用链接方式访问数据,则不必在每次会话开始时提供连接信息,从而可以提高效率。

二、数据处理

  数据连接建立后,可以用 OpenRecordset 方法打开一个记录集,并可用 DBGrid 控件和 Data 控件方便地浏览整个记录集。如果使用表类型(Table-type)记录对象,则对应的是一个实际存在的数据库表,在多用户环境下,其它用户对数据的修改会立即反映到表中;如果使用动态集类型(Dynaset-type)记录对象,则对应的既可以是一个表中全部记录,又可以是一个查询的结果,并且可以更新记录集中的记录;如果使用快照类型(Snapshot-type)记录对象,则对应的可以是表中的全部记录,也可以是一个查询结果,但不能进行记录的增加、删除和修改操作。此外,还可以建立其它类型的记录对象,如仅向前型(ForwardOnly-type)记录对象和动态型(Dynamic-type)记录对象。

  下面是打开动态集记录对象并显示记录的过程:

Public Sub rst_display(strDB As String, strRst As String, strForm As Form)
  Set dbs = OpenDatabase(strDB)
  Set rst = dbs.OpenRecordset(strRst, dbOpenDynaset)
  strForm!Data1.DatabaseName = dbs.Name
  strForm!Data1.RecordSource = rst.Name
  strForm!Data1.Refresh
  strForm!DBGrid1.ReBind
End Sub

  上述过程有三个参数,其中 strDB 用来指定本地数据库名(包括路径),linkTdfName 是在本地数据库中新建的链接远程表的表名,strForm 是网格控件和数据控件所在的窗体名。调用此过程可以基于新表建立一个动态集类型的记录对象,并可在网格中浏览各个记录。
  断开连接可以通过关闭应用程序或设置连接超时来实现。注意:如果对数据库对象使用 Close 方法,则由于在 Miscrosoft Jet 数据库引擎内部缓存了连接,实际上连接并未取消。

三、应用举例

  以上介绍了用 DAO 访问远程数据库的具体操作,下面通过一个例子说明链接远程表和建立记录集对象的方法。
  首先建立一个新工程,在窗体上画 5 个命令按钮,1 个数据控件和 1 个数据网格控件(DBGrid),各对象的属性设置见表1。

表1 窗体1对象属性设置

对象 标题(Caption) 名称(Name)
窗体 远程数据访问 Form1
命令按钮1 链接远程表 cmd链接
命令按钮2 添加 cmdAdd
命令按钮3 删除 cmdDel
命令按钮4 修改 cmdModify
命令按钮5 结束 cmdEnd
数据控件 Data1 Data1
数据网格   DBGrid1

  其中DBGrid1 中的DataSource 属性设为Data1,命令按钮2,3,4 的Visible 属性设为False。

  编写如下事件过程:

Private Sub cmdAdd_Click() ’添加记录子过程
  On Error GoTo errHandler
  With rst
   .AddNew
   For i = 0 To .Fields.Count - 1 ’遍历记录集中的每个字段
  ’在输入框中输入各字段的数据
    .Fields(i).Value = InputBox("输入记录信息" & vbCr + _
             "字段名:" + .Fields(i).Name)
   Next i
   .Update
  End With
  Data1.Refresh
  DBGrid1.ReBind
errHandler:     ’错误处理
  Select Case Err
    Case 3022, 3421
      MsgBox (Error + vbCr + "输入无效")
      Exit Sub
    Case Else
      Response = 0
      Exit Sub
  End Select
End Sub

Private Sub cmdDel_Click() ’删除记录过程
  On Error GoTo errHandler
  BeginTrans     ’事务处理
  With Data1.Recordset
  If .BOF And .EOF Then Exit Sub ’如果没有记录,退出过程
  .Delete    ’删除
  If .BOF And .EOF Then  ’如果没有记录,退出过程
     Exit Sub
  ElseIf .EOF Then .MoveLast
   ’如果删除的是最后一条记录,光标移至最后一记录
  Else: .MoveNext  ’移至下一条记录
  End If
  End With
  If MsgBox("确实要删除这一记录?",vbQuestion + vbYesNo) = vbYes Then
   CommitTrans  ’确认
   Data1.Refresh
  Else
   Rollback         ’撤消改动
   Data1.Refresh
  End If
errHandler:     ’错误处理
  Select Case Err
   Case 3021 ’无当前记录
    MsgBox "无当前记录,请选择要删除的记录"
    Exit Sub
   Case Else
    MsgBox Error
    Exit Sub
  End Select
End Sub

Private Sub cmdEnd_Click()
  End     ’结束应用程序
End Sub

Private Sub cmdModify_Click()
  DBGrid1.AllowUpdate = True ’允许修改
End Sub

Private Sub cmd链接_Click()
  Form1.Hide
  Form2.Show
End Sub

Private Sub DBGrid1_After
  ColUpdate(ByVal ColIndex As Integer)
  ’数据修改后触发该事件
  On Error GoTo err1
  Data1.Refresh
err1:
  Select Case Err
    Case 0
      Response = 0
    Case Else
      Exit Sub
  End Select
End Sub

Private Sub DBGrid1_BeforeColUpdate(ByVal ColIndex As Integer, _
   OldValue As Variant, Cancel As Integer)
  ’数据修改前触发该事件
  On Error GoTo errHandler:
  BeginTrans
  If MsgBox("确实要修改这一内容?",vbQuestion + vbYesNo) = vbYes Then
    CommitTrans
  Else
    Rollback
    Data1.Refresh
  End If
errHandler:
  Select Case Err
    Case 0
      Response = 0
    Case Else
      MsgBox (Error)
      Exit Sub
  End Select
End Sub

Private Sub Form_Load()
’在窗体装入时,网格中的数据不可添加,修改
  DBGrid1.AllowAddNew = False
  DBGrid1.AllowUpdate = False
End Sub

Private Sub Form_Resize()
  On Error Resume Next
  ’当窗体调整时会调整网格
  DBGrid1.Height = Me.ScaleHeight - Data1.Height - cmd删除.Height - 30
End Sub

  在工程中添加一个窗体,在窗体上画6个标签,1个命令按钮(标题为"确认",名称为 cmd 确认),3个文本框和1个组合框在窗体的声明部份输入以下代码:
  ’声明窗体层变量

Dim rodbs As Database
Dim strDB As String, strRoDB As String, strCn As String, strTdf As String
Dim linkTdfName As String

编写如下事件过程:
Private Sub cmd确认_Click()
  On Error GoTo errHandler:
  strDB = text2.Text ’本地数据库名及路径
  linkTdfName = Text3.Text
  ’本地数据库中新建的链接远程表的表名
  strCn = strRoDB ’连接字符串
  strTdf = Combo1.Text
  ’指定远程数据库中要访问的表
  ’调用LinkTable过程
  Call LinkTable(strDB,strRoDB, strCn, strTdf, linkTdfName)
  ’调用rst_display过程
  Call rst_display(strDB, linkTdfName, Form1)
  Form2.Hide
  Form1.Show
  Form1.Caption = "远程数据:" + strCn + "-" + strTdf
  ’显示"添加","删除","修改"控件
  Form1.cmdAdd.Visible = True
  Form1.cmdDel.Visible = True
  Form1.cmdModify.Visible = True
errHandler:
  Select Case Err
    Case 0
      Response = 0
    Case Else
      MsgBox (Error + vbr + "重新输入")
      Exit Sub
  End Select
End Sub

Private Sub Combo1_GotFocus()
  strRoDB = text1.Text
   ’指定远程数据库名及路径
  Set rodbs = OpenDatabase(strRoDB)
   ’打开远程数据库
   ’删除combo1中的内容
  If Combo1.ListCount >= 1 Then
    For i = Combo1.ListCount - 1 To 0 Step -1
      Combo1.RemoveItem i
    Next i
  End If
  ’把数据库中的表名加到combo1中
  For i = 0 To rodbs.TableDefs.Count - 1
    Combo1.AddItem rodbs.TableDefs(i).Name
  Next i
End Sub

【声明】本站刊载的《VB5.0 中远程数据库的访问》一文如果有侵害你权益的情况,请联系我们。我们将及时采取措施。
QQ:44637339 Email:just6@163.com Tel:13355163107 Lining studios

友情链接

本页内容是《VB5.0 中远程数据库的访问》 返回顶部
© 2001-2024 Lining studios 济宁速创科技有限公司, All Rights Reserved
 Processed Time:62.500ms
中华人民共和国信息产业部网站备案号: 鲁ICP备09103015号-1