應用舉例
以上介紹了用dao訪問遠程數(shù)據(jù)庫的具體操作,下面通過一個例子說明鏈接遠程表和建立記錄集對象的方法。
首先建立一個新工程,在窗體上畫5個命令按鈕,設(shè)為首頁1個數(shù)據(jù)控件和1個數(shù)據(jù)網(wǎng)格控件(dbgrid)。各對象的屬性設(shè)置見表1。
表1 窗體1對象屬性設(shè)置
對 象
標 題(caption)
名 稱(name)
窗體
遠程數(shù)據(jù)訪問
form1
命令按鈕1
鏈接遠程表
cmd 鏈接
命令按鈕2
添加
cmdadd
命令按鈕3
刪除
cmddel
命令按鈕4
修改
cmdmodify
命令按鈕5
結(jié)束
cmdend
數(shù)據(jù)控件
data1
data1
數(shù)據(jù)網(wǎng)格
dbgrid1
其中dbgrid1中的datasource屬性設(shè)為data1,命令按鈕2,3,4的visible屬性設(shè)為false。
三、應用舉例
編寫如下事件過程:
private sub cmdadd_click() ’ 添 加 記 錄 子 過 程
on error goto errhandler
with rst
.addnew
for i = 0 to .fields.count - 1 ’ 遍 歷 記 錄 集 中 的 每 個 字 段
’ 在 輸 入 框 中 輸 入 各 字 段 的 數(shù) 據(jù)
.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 ’ 事 務(wù) 處 理
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 ’ 結(jié) 束 應 用 程 序
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)
’ 數(shù) 據(jù) 修 改 后 觸 發(fā) 該 事 件
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)
’ 數(shù) 據(jù) 修 改 前 觸 發(fā) 該 事 件
on error goto errhandler:
begintrans
if msgbox(" 確 實 要 修 改
這 一 內(nèi) 容 ?", 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()
’ 在 窗 體 裝 入 時, 網(wǎng) 格 中 的 數(shù) 據(jù) 不 可 添 加, 修 改
dbgrid1.allowaddnew = false
dbgrid1.allowupdate = false
end sub
private sub fo
您正在看的VB教程是:VB中遠程數(shù)據(jù)庫的訪問(3) 應用舉例。rm_resize()
on error resume next
’ 當 窗 體 調(diào) 整 時 會 調(diào) 整 網(wǎng) 格
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
’ 本 地 數(shù) 據(jù) 庫 名 及 路 徑
linktdfname = text3.text
’ 本 地 數(shù) 據(jù) 庫 中 新 建 的 鏈 接 遠 程 表 的 表 名
strcn = strrodb ’ 連 接 字 符 串
strtdf = combo1.text ’ 指 定 遠 程 數(shù) 據(jù) 庫 中 要 訪 問 的 表
’ 調(diào) 用linktable 過 程
call linktable(strdb, strrodb, strcn, strtdf, linktdfname)
’ 調(diào) 用rst_display 過 程
call rst_display(strdb, linktdfname, form1)
form2.hide
form1.show
form1.caption = " 遠 程 數(shù) 據(jù):" + 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 ’ 指 定 遠 程 數(shù) 據(jù) 庫 名 及 路 徑
set rodbs = opendatabase(strrodb) ’ 打 開 遠 程 數(shù) 據(jù) 庫
’ 刪 除combo1 中 的 內(nèi) 容
if combo1.listcount >= 1 then
for i = combo1.listcount - 1 to 0 step -1
combo1.removeitem i
next i
end if
’ 把 數(shù) 據(jù) 庫 中 的 表 名 加 到combo1 中
for i = 0 to rodbs.tabledefs.count - 1
combo1.additem rodbs.tabledefs(i).name
next i
end sub
以上介紹了用dao訪問遠程數(shù)據(jù)庫的具體操作,下面通過一個例子說明鏈接遠程表和建立記錄集對象的方法。
首先建立一個新工程,在窗體上畫5個命令按鈕,設(shè)為首頁1個數(shù)據(jù)控件和1個數(shù)據(jù)網(wǎng)格控件(dbgrid)。各對象的屬性設(shè)置見表1。
表1 窗體1對象屬性設(shè)置
對 象
標 題(caption)
名 稱(name)
窗體
遠程數(shù)據(jù)訪問
form1
命令按鈕1
鏈接遠程表
cmd 鏈接
命令按鈕2
添加
cmdadd
命令按鈕3
刪除
cmddel
命令按鈕4
修改
cmdmodify
命令按鈕5
結(jié)束
cmdend
數(shù)據(jù)控件
data1
data1
數(shù)據(jù)網(wǎng)格
dbgrid1
其中dbgrid1中的datasource屬性設(shè)為data1,命令按鈕2,3,4的visible屬性設(shè)為false。
三、應用舉例
編寫如下事件過程:
private sub cmdadd_click() ’ 添 加 記 錄 子 過 程
on error goto errhandler
with rst
.addnew
for i = 0 to .fields.count - 1 ’ 遍 歷 記 錄 集 中 的 每 個 字 段
’ 在 輸 入 框 中 輸 入 各 字 段 的 數(shù) 據(jù)
.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 ’ 事 務(wù) 處 理
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 ’ 結(jié) 束 應 用 程 序
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)
’ 數(shù) 據(jù) 修 改 后 觸 發(fā) 該 事 件
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)
’ 數(shù) 據(jù) 修 改 前 觸 發(fā) 該 事 件
on error goto errhandler:
begintrans
if msgbox(" 確 實 要 修 改
這 一 內(nèi) 容 ?", 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()
’ 在 窗 體 裝 入 時, 網(wǎng) 格 中 的 數(shù) 據(jù) 不 可 添 加, 修 改
dbgrid1.allowaddnew = false
dbgrid1.allowupdate = false
end sub
private sub fo
您正在看的VB教程是:VB中遠程數(shù)據(jù)庫的訪問(3) 應用舉例。rm_resize()
on error resume next
’ 當 窗 體 調(diào) 整 時 會 調(diào) 整 網(wǎng) 格
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
’ 本 地 數(shù) 據(jù) 庫 名 及 路 徑
linktdfname = text3.text
’ 本 地 數(shù) 據(jù) 庫 中 新 建 的 鏈 接 遠 程 表 的 表 名
strcn = strrodb ’ 連 接 字 符 串
strtdf = combo1.text ’ 指 定 遠 程 數(shù) 據(jù) 庫 中 要 訪 問 的 表
’ 調(diào) 用linktable 過 程
call linktable(strdb, strrodb, strcn, strtdf, linktdfname)
’ 調(diào) 用rst_display 過 程
call rst_display(strdb, linktdfname, form1)
form2.hide
form1.show
form1.caption = " 遠 程 數(shù) 據(jù):" + 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 ’ 指 定 遠 程 數(shù) 據(jù) 庫 名 及 路 徑
set rodbs = opendatabase(strrodb) ’ 打 開 遠 程 數(shù) 據(jù) 庫
’ 刪 除combo1 中 的 內(nèi) 容
if combo1.listcount >= 1 then
for i = combo1.listcount - 1 to 0 step -1
combo1.removeitem i
next i
end if
’ 把 數(shù) 據(jù) 庫 中 的 表 名 加 到combo1 中
for i = 0 to rodbs.tabledefs.count - 1
combo1.additem rodbs.tabledefs(i).name
next i
end sub

