发信人: r_hayes(Hayes) 
整理人: winsy(2003-09-02 09:03:44), 站内信件
 | 
 
 
三、应用举例 
 
   以上介绍了用dao访问远程数据库的具体操作,下面通过一个例子说明链接远程表和建立记录集对象的方法。 
 
   首先建立一个新工程,在窗体上画5个命令按钮,1个数据控件和1个数据网格控件(dbgrid)。各对象的属性设置见表1。 
 
 表1 窗体1对象属性设置 
  对 象 标 题(caption) 名 称(name) 
 窗体 远程数据访问 form1 
 命令按钮1 链接远程表 cmdlink 
 命令按钮2 添加 cmdadd 
 命令按钮3 删除 cmddel 
 命令按钮4 修改 cmdmodify 
 命令按钮5 结束 cmdend 
 数据控件   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 cmdlink_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 form_resize() 
 
 on error resume next 
 
 ’ 当 窗 体 调 整 时 会 调 整 网 格 
 
 dbgrid1.height = me.scaleheight - data1.height - cmddel.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 cmdOK_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 
   
 
 
 
  ---- 
                     灌灌 
                     灌灌 
                     灌灌 
                     灌灌          灌灌 
                     灌灌      灌灌灌 
     灌灌灌灌灌灌灌  灌灌  灌灌灌 
       灌灌灌灌灌灌灌灌灌灌灌灌 
                 灌灌灌灌灌灌 
                灌灌灌灌灌灌灌  
               灌灌  灌灌  灌灌 
              灌灌   灌灌    灌灌 
             灌灌    灌灌      灌灌 
           灌灌      灌灌      灌灌灌 
           灌灌      灌灌        灌灌灌灌 
         灌灌        灌灌        灌灌灌灌灌 
       灌灌          灌灌          灌灌灌灌灌  
     灌灌            灌灌            灌灌 
                 灌灌灌灌 
                   灌灌灌 
                     灌     | 
 
 
 |