国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

VB5中遠程數據庫的訪問

2019-11-18 17:47:06
字體:
來源:轉載
供稿:網友
----在VB5.0中,用MicrosoftJet數據庫引擎和數據訪問對象DAO(DataaccessObject)可以創建功能強大的客戶/服務器應用程序。對遠程數據庫的訪問是開發這類應用程序的關鍵環節,本文將介紹在VB5.0中用DAO通過MiscrosoftJet數據庫引擎訪問遠程數據庫的方法。

----用DAO訪問遠程數據庫大體上可以通過三步來實現,即數據連接、數據處理和斷開連接。下面主要介紹數據連接和數據處理的具體操作。

----一、數據連接

----DAO一般通過鏈接遠程表的方式來進行數據連接。這樣,數據雖然駐留在遠程數據源上,但在本地的MicrosoftJet數據庫中可以存儲與遠程數據的永久性連接,同時緩存鏈接的表結構信息,從而在下一次訪問該表時,不用再次從服務器中檢索這些結構信息,加快了連接速度。一旦鏈接了一個表,該鏈接便會保留在各會話期間,直到連接斷開。鏈接遠程表的具體操作是:

用OpenDatabase方法打開將要包含該鏈接的本地MicrosoftJet數據庫

用CreateTableDef方法在該數據庫中創建一個新的TableDef對象

將TableDef對象的Connect屬性設置為一個合法的連接字符串,標識要訪問的遠程數據庫類型、數據文件的路徑以及用戶名和遠程數據源密碼等。

將TableDef對象的SourceTableName屬性設置為遠程數據庫中要訪問的表的名稱。

添加TableDef對象到TableDefs集合中。
----  實現鏈接遠程表操作的過程如下:

PublicSubLinkTable(strDBAsString,strRoDBAsString,
strCnAsString,strTdfAsString,_
         linkTdfNameAsString)
  DimlinkTdfAsNewTableDef
  Setdbs=OpenDatabase(strDB)
  linkTdf.Name=linkTdfName
100
  tempTable=UCase(linkTdf.Name)
  Fori=0Todbs.TableDefs.Count-1
    IfUCase(dbs.TableDefs(i).Name)=tempTableThen
      IfMsgBox(linkTdfName "已存在,是否刪除?",_
     vbQuestion vbYesNo)=vbYesThen
        dbs.TableDefs.DeletelinkTdf.Name
        ExitFor
      Else:MsgBox"重新輸入新表名"
      linkTdfName=InputBox("新表名")
      GoTo100
      EndIf
    EndIf
  Nexti
SetlinkTdf=dbs.CreateTableDef
(linkTdfName) '鏈接遠程表
  linkTdf.Connect=";database=" strCn
  linkTdf.SourceTableName=strTdf
  dbs.TableDefs.AppendlinkTdf
EndSub

----上述過程用來實現遠程表的連接,它有5個參數,其中strRoDB是要訪問的遠程數據庫名(包括路徑);strTdf是該數據庫中的表名;strDB是要鏈接的本地數據庫(包括路徑);linkTdfName是本地數據庫的一個新表名,用來建立遠程表的鏈接;strCn是指定連接信息的字符串。需要特別注意的是,除了在訪問遠程MicrosoftJet數據庫時,連接字符串要以分號(;)開頭外,指定連接信息的字符串都必須以所訪問的遠程數據庫類型開頭。DAO可以訪問的遠程數據源有以下三類:

MicrosoftJet數據源,如:Access數據。

IISAM(可安裝的索引化順序訪問方法)格式數據源,如:FoxPRo、Paradox、dBASE數據。

ODBC數據源,如:SQLServer數據、Oracle數據。
----例如:設網絡服務器名為server,共享目錄為C:/Sales的FoxPro3.0數據庫,連接字符串應為

----strCn="FoxPro3.0;database=//server/c$/Sales/Region1"

----此外,DAO通過MicrosoftJet數據庫引擎訪問遠程數據時,還可以用OpenDatabase方法直接打開遠程表。在本地數據庫中并未存儲與遠程數據源建立連接所需要的信息。如果使用鏈接方式訪問數據,則不必在每次會話開始時提供連接信息,從而可以提高效率。

----二、數據處理

----數據連接建立后,可以用OpenRecordset方法打開一個記錄集,并可用DBGrid控件和Data控件方便地瀏覽整個記錄集。如果使用表類型(Table-type)記錄對象,則對應的是一個實際存在的數據庫表,在多用戶環境下,其它用戶對數據的修改會立即反映到表中;如果使用動態集類型(Dynaset-type)記錄對象,則對應的既可以是一個表中全部記錄,又可以是一個查詢的結果,并且可以更新記錄集中的記錄;如果使用快照類型(Snapshot-type)記錄對象,則對應的可以是表中的全部記錄,也可以是一個查詢結果,但不能進行記錄的增加、刪除和修改操作。此外,還可以建立其它類型的記錄對象,如僅向前型(ForwardOnly-type)記錄對象和動態型(Dynamic-type)記錄對象。

----下面是打開動態集記錄對象并顯示記錄的過程:

PublicSubrst_display(strDBAsString,
strRstAsString,strFormAsForm)
  Setdbs=OpenDatabase(strDB)
  Setrst=dbs.OpenRecordset(strRst,dbOpenDynaset)
  strForm!Data1.DatabaseName=dbs.Name
  strForm!Data1.RecordSource=rst.Name
  strForm!Data1.Refresh
  strForm!DBGrid1.ReBind
EndSub

----上述過程有三個參數,其中strDB用來指定本地數據庫名(包括路徑),linkTdfName是在本地數據庫中新建的鏈接遠程表的表名,strForm是網格控件和數據控件所在的窗體名。調用此過程可以基于新表建立一個動態集類型的記錄對象,并可在網格中瀏覽各個記錄。

----斷開連接可以通過關閉應用程序或設置連接超時來實現。注意:如果對數據庫對象使用Close方法,則由于在MiscrosoftJet數據庫引擎內部緩存了連接,實際上連接并未取消。

----三、應用舉例

----以上介紹了用DAO訪問遠程數據庫的具體操作,下面通過一個例子說明鏈接遠程表和建立記錄集對象的方法。

----首先建立一個新工程,在窗體上畫5個命令按鈕,1個數據控件和1個數據網格控件(DBGrid),各對象的屬性設置見表1。


表1窗體1對象屬性設置對象標題(Caption)名稱(Name)
窗體遠程數據訪問Form1
命令按鈕1鏈接遠程表cmd鏈接
命令按鈕2添加cmdAdd
命令按鈕3刪除cmdDel
命令按鈕4修改cmdModify
命令按鈕5結束cmdEnd
數據控件Data1Data1
數據網格 DBGrid1

----其中DBGrid1中的DataSource屬性設為Data1,命令按鈕2,3,4的Visible屬性設為False。

----編寫如下事件過程:

----

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

PrivatevSubcmd鏈接_Click()
Form1.Hide
  Form2.Show
EndSub

PrivateSubDBGrid1_After
ColUpdate(ByValColIndexAsInteger)
'數據修改后觸發該事件
OnErrorGoToerr1
Data1.Refresh
err1:
  SelectCaseErr
    Case0
      Response=0
    CaseElse
      ExitSub
  EndSelect
EndSub

PrivateSubDBGrid1_BeforeColUpdate(ByVal
ColIndexAsInteger,
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-cmd刪除.Height-30
EndSub

----在工程中添加一個窗體,在窗體上畫6個標簽,1個命令按鈕(標題為"確認",名稱為cmd確認),3個文本框和1個組合框在窗體的聲明部份輸入以下代碼:

----'聲明窗體層變量

DimrodbsAsDatabase
DimstrDBAsString,strRoDB
AsString,strCnAsString,strTdfAsString
DimlinkTdfNameAsString

編寫如下事件過程:
PrivateSubcmd確認_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->


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金溪县| 衡水市| 诸暨市| 西安市| 克什克腾旗| 汨罗市| 喜德县| 加查县| 蒲江县| 自治县| 三亚市| 惠水县| 霍林郭勒市| 雅安市| 读书| 格尔木市| 闻喜县| 广灵县| 三都| 蓝山县| 揭阳市| 榆树市| 牟定县| 泰州市| 长汀县| 洛扎县| 旬阳县| 乌兰察布市| 克什克腾旗| 罗平县| 新密市| 康马县| 沙洋县| 新宁县| 阿拉善左旗| 财经| 博罗县| 洪泽县| 永顺县| 桂林市| 台东县|