以上介绍了用dao访问远程数据库的具体操作,下面通过一个例子说明链接远程表和建立记录集对象的方法。
首先建立一个新工程,在窗体上画5个命令按钮,1个数据控件和1个数据网格控件(dbgrid)。各对象的属性设置见表1。
表1窗体1对象属性设置
-align="middle"width="33">对象->-align="middle"width="33">标题(caption)->-align="middle"width="34">名称(name)->-width="33">窗体->-width="33">远程数据访问->-width="34">form1->-width="33">命令按钮1->-width="33">链接远程表->-width="34">cmdlink->-width="33">命令按钮2->-width="33">添加->-width="34">cmdadd->-width="33">命令按钮3->-width="33">删除->-width="34">cmddel->-width="33">命令按钮4->-width="33">修改->-width="34">cmdmodify->-width="33">命令按钮5->-width="33">结束->-width="34">cmdend->-width="33">数据控件->-width="33">->-width="34">data1->-width="33">数据网格->-width="33">->-width="34">dbgrid1->
其中dbgrid1中的datasource属性设为data1,命令按钮2,3,4的visible属性设为false。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)三、应用举例
编写如下事件过程:
privatesubcmdadd_click()'添加记录子过程
onerrorgotoerrhandler
withrst
.addnew
fori=0to.fields.count-1'遍历记录集中的每个字段
'在输入框中输入各字段的数据
.fields(i).value=inputbox
("输入记录信息"&vbcr "字段名:" .fields(i).name)
nexti
.update
endwith
data1.refresh
dbgrid1.rebind
errhandler:'错误处理
selectcaseerr
case3022,3421
msgbox(error vbcr "输入无效")
exitsub
caseelse
response=0
exitsub
endselect
endsub
privatesubcmddel_click()'删除记录过程
onerrorgotoerrhandler
begintrans'事务处理
withdata1.recordset
if.bofand.eofthenexitsub
'如果没有记录,退出过程
.delete'删除
if.bofand.eofthen
'如果没有记录,退出过程
exitsub
elseif.eofthen.movelast
'如果删除的是最后一条记录,光标移至最后一记录
else:.movenext
'移至下一条记录
endif
endwith
ifmsgbox("确实要删除这一记录?",
vbquestion vbyesno)=vbyesthen
committrans'确认
data1.refresh
else
rollback'撤消改动
data1.refresh
endif
errhandler:'错误处理
selectcaseerr
case3021'无当前记录
msgbox("无当前记录,请选择要删除的记录")
exitsub
caseelse
msgbox(error)
exitsub
endselect
endsub
privatesubcmdend_click()
end'结束应用程序
endsub
privatesubcmdmodify_click()
dbgrid1.allowupdate=true'允许修改
endsub
privatevsubcmdlink_click()
form1.hide
form2.show
endsub
privatesubdbgrid1_aftercolupdate(byvalcolindexasinteger)
'数据修改后触发该事件
onerrorgotoerr1
data1.refresh
err1:
selectcaseerr
case0
response=0
caseelse
exitsub
endselect
endsub
privatesubdbgrid1_beforecolupdate
(byvalcolindexasinteger,oldvalueasvariant,cancelasinteger)
'数据修改前触发该事件
onerrorgotoerrhandler:
begintrans
ifmsgbox("确实要修改这一内容?",vbquestion vbyesno)=vbyesthen
committrans
else
rollback
data1.refresh
endif
errhandler:
selectcaseerr
case0
response=0
caseelse
msgbox(error)
exitsub
endselect
endsub
privatesubform_load()
'在窗体装入时,网格中的数据不可添加,修改
dbgrid1.allowaddnew=false
dbgrid1.allowupdate=false
endsub
privatesubform_resize()
onerrorresumenext
'当窗体调整时会调整网格
dbgrid1.height=me.scaleheight-data1.height-cmddel.height-30
endsub
在工程中添加一个窗体,在窗体上画6个标签,1个命令按钮(标题为“确认”,名称为cmd确认),3个文本框和1个组合框。
在窗体的声明部份输入以下代码:
'声明窗体层变量
dimrodbsasdatabase
dimstrdbasstring,strrodbasstring,strcnasstring,strtdfasstring
dimlinktdfnameasstring
编写如下事件过程:
privatesubcmdOK_click()
onerrorgotoerrhandler:
strdb=text2.text
'本地数据库名及路径
linktdfname=text3.text
'本地数据库中新建的链接远程表的表名
strcn=strrodb'连接字符串
strtdf=combo1.text'指定远程数据库中要访问的表
'调用linktable过程
calllinktable(strdb,strrodb,strcn,strtdf,linktdfname)
'调用rst_display过程
callrst_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:
selectcaseerr
case0
response=0
caseelse
msgbox(error vbr "重新输入")
exitsub
endselect
endsub
privatesubcombo1_gotfocus()
strrodb=text1.text'指定远程数据库名及路径
setrodbs=opendatabase(strrodb)'打开远程数据库
'删除combo1中的内容
ifcombo1.listcount=1then
fori=combo1.listcount-1to0step-1
combo1.removeitemi
nexti
endif
'把数据库中的表名加到combo1中
fori=0torodbs.tabledefs.count-1
combo1.additemrodbs.tabledefs(i).name
nexti
endsub