VB中远程数据库的访问(3)应用举例

2026-02-07
应用举例
  以上介绍了用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
  privatev sub cmd 链 接_click()
  form1.hide
  form2.show
  end sub private sub dbgrid1_aftercolupdate(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 fo
  您正在看的VB教程是:VB中远程数据库的访问(3) 应用举例。rm_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