扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
三、应用举例
以上介绍了用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 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
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者