程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> VB5.0中遠程數據庫的訪問

VB5.0中遠程數據庫的訪問

編輯:VB綜合教程
----在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=serverc$SalesRegion1"
  
  ----此外,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->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved