<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    大鳥的學習樂園
    路漫漫其修遠兮,吾將上下而求索
    posts - 26,comments - 27,trackbacks - 0

    引言

      作為微軟旗下一款優秀的RAD工具,VB在數據庫應用開發方面的能力十分強大。微軟設計了多種數據庫訪問方法,下面通過對VB訪問數據庫的多種技術進行深入剖析,并總結出實際開發中的幾點經驗。希望能夠對那VB的初學者有所幫助。(注意,文中所有的描述均在Windows 2000 professional和Visual Basic 6.0的環境下進行的)

    一. DAO、RDO、ODBC和ADO

      在VB的開發環境中,可以使用三種數據庫訪問方式,它們分別是:數據訪問對象(DAO)、遠程數據對象(RDO)和ADO對象模型。

      DAO:

      數據訪問對象是用來顯露了Microsoft Jet數據庫引擎(最早是給Microsoft Access 所使用,現在已經支持其它數據庫),并允許開發者通過ODBC直接連接到其他數據庫一樣,直接連接到 Access 表。DAO 最適用于單系統應用程序或在小范圍本地分布使用。其內部已經對Jet數據庫的訪問進行了加速優化,而且其使用起來也是很方便的。所以如果數據庫是Access數據庫且是本地使用的話,建議使用這種訪問方式。

      VB已經把DAO模型封裝成了Data控件,分別設置相應的DatabaseName屬性和RecordSource屬性就可以將Data控件與數據庫中的記錄源連接起來了。以后就可以使用Data控件來對數據庫進行操作。

      RDO

      RDO(Remote Data Objects)遠程數據對象是一個到ODBC的、面向對象的數據訪問接口,它同易于使用的DAO style組合在一起,提供了一個接口,形式上展示出所有ODBC的底層功能和靈活性。盡管RDO在很好地訪問Jet或ISAM數據庫方面受到限制,而且它只能通過現存的ODBC驅動程序來訪問關系數據庫。但是,RDO已被證明是許多SQL Server、Oracle 以及其他大型關系數據庫開發者經常選用的最佳接口。RDO提供了用來訪問存儲過程和復雜結果集的更多和更復雜的對象、屬性,以及方法。

      和DAO一樣,在VB中也把其封裝為RDO控件了,其使用方法與DAO控件的使用方法完全一樣。

      ODBC

      ODBC(Open Database Connectivity,開放數據庫互連)是微軟公司開放服務結構(WOSA,Windows Open Services Architecture)中有關數據庫的一個組成部分,它建立了一組規范,并提供了一組對數據庫訪問的標準API(應用程序編程接口)。這些API利用SQL來完成其大部分任務。ODBC本身也提供了對SQL語言的支持,用戶可以直接將SQL語句送給ODBC。

      一個基于ODBC的應用程序對數據庫的操作不依賴任何DBMS,不直接與DBMS打交道,所有的數據庫操作由對應的DBMS的ODBC驅動程序完成。也就是說,不論是FoxPro、Access還是Oracle數據庫,均可用ODBC API進行訪問。由此可見,ODBC的最大優點是能以統一的方式處理所有的數據庫。

      一個完整的ODBC由下列幾個部件組成:
       
      1. 應用程序(Application)

      ODBC管理器(Administrator)。該程序位于Windows 95控制面板(Control Panel)的32位ODBC內,其主要任務是管理安裝的ODBC驅動程序和管理數據源。

      驅動程序管理器(Driver Manager)。驅動程序管理器包含在ODBC32.DLL中,對用戶是透明的。其任務是管理ODBC驅動程序,是ODBC中最重要的部件。

      2. ODBC API

      ODBC 驅動程序。是一些DLL,提供了ODBC和數據庫之間的接口。

      數據源。數據源包含了數據庫位置和數據庫類型等信息,實際上是一種數據連接的抽象。

      ODBC連接目前僅僅限于關系型數據庫,對于其他數據源比如EXCEL、文本文件都不能進行訪問,而且有很多DBMS(數據庫管理系統)都不能充分的支持其所有的功能。相比之下,OLEDB可以存取任何形式的數據,所以其功能是相當的強大,它也指導了目前技術發展的方向。

      ADO

      ADO(ActiveX Data Object)是DAO/RDO的后繼產物。ADO 2.0在功能上與RDO更相似,而且一般來說,在這兩種模型之間有一種相似的映射關系。ADO"擴展"了DAO和 RDO 所使用的對象模型,這意味著它包含較少的對象、更多的屬性、方法(和參數),以及事件。

      作為最新的數據庫訪問模式,ADO的使用也是簡單易用,所以微軟已經明確表示今后把重點放在ADO上,對DAO/RDO不再作升級,所以ADO已經成為了當前數據庫開發的主流。

      ADO涉及的數據存儲有DSN(數據源名稱)、ODBC(開放式數據連接)以及OLE DB三種方式。后面的例程將詳細講解這三種方式的具體訪問實現。

      要使用ADO,必須清楚ADO的對象層次結構,其大體上分為以下7個對象層次:

      1、 Command 對象:包含關于某個命令,例如查詢字符串、參數定義等的信息。Command 對象在功能上和 RDO的rdoQuery 對象相似。

      2、 Connection 對象:包含關于某個數據提供程序的信息。Connection 對象在功能上和 RDO 的 rdoConnection 對象是相似的,并且包含了關于結構描述的信息。它還包含某些 RDOEnvironment 對象的功能,例如transaction 控件。

      3、 Error對象:包含數據提供程序出錯時的擴展信息。Error 對象在功能上和 RDO 的rdoError 對象相似。

      4、 Field 對象:包含記錄集中數據的某單個列的信息。Field 對象在功能上和 RDO的rdoColumn 對象相似。

      5、 Parameter 對象:包含參數化的Command對象的某單個參數的信息。該 Command對象有一個包含其所有Parameter 對象的 Parameters 集合。Parameter 對象在功能上和 RDO 的 rdoParameter 對象相似。

      6、 Property對象:包含某個 ADO 對象的提供程序定義的特征。沒有任何等同于該對象的RDO,但DAO有一個相似的對象。

      7、Recordset對象:用來存儲數據操作返回的記錄集。此對象和Connection對象是所有對象最重要的兩個對象。

      當然,對于初級用戶來說,我們只需要掌握其中的Connection對象和RecordSet對象就可以實現基本的數據庫操作,在后面的經驗介紹里面我將給出詳細的介紹。

    二. 開發經驗小結:

      前面總體上介紹了一下當前在VB平臺下的數據庫訪問技術,這些技術也是當前數據庫技術的主流。下面筆者結合近幾年的開發經驗,給出一些開發經驗和小技巧,以供參考:

      經驗一:如果數據量不大,而且要求開發周期短的情況,建議使用DAO+Access雖然DAO功能并不強大,但是其對Jet引擎進行了加速優化處理,所以這種搭配應該是比較好的選擇。

      經驗二:RDO當前已經用的很少了,一般用ADO來替代。

      經驗三:(本經驗很重要)使用ADO開發時,連接數據庫的方式有三種(前面已經敘述了),其中DSN需要用戶首先使用要將所要操縱的數據庫設置為數據庫源并給其命名。方法是在控制面板->管理工具->數據源(ODBC)下面進行配置。比如設置的數據源名稱為data,那么可以通過下面幾行代碼來連接數據庫:

    Dim conn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    注釋:連接數據庫
    conn.Open "dsn=data"
    注釋:打開數據源(即選定操作的數據對象)
    rs.Open SQL語句, conn  

      但是如果是使用ODBC和OLEDB的方式進行連接,那么大家一定知道在連接字符串上那一長串的代碼,不要說對于初學者,就是對于那些經驗豐富的程序員來說,也很難記住這一串代碼。那么如何可以記住這一串代碼呢?其實,方法很簡單,只要添加一個ADO Data控件,然后在其屬性框中使用向導進行設置后,那么最后向導就會自動生成一段ConnectionString,只需要將這一行代碼拷貝下來然后放到conn.open之后的連接字符串參數的位置上就可以了。這條經驗希望讀者能夠記住,實際開發中很實用。

      經驗四:前面講到手動設置ODBC數據源,這里可以通過程序來進行動態設置。首先要清楚的是ODBC的詳細信息全部存放在注冊表的下述鍵值內:"HKEY_LOCAL_MACHINE\SOFTWARE\ODBC",通過調用Win32函數WriteProfileString來對相應的鍵值進行修改即可達到目的。

      經驗五:通常將數據庫的連接代碼和資源釋放代碼放入各自特定的函數里面,因為一般大一點的程序里需要經常對這兩個功能模塊進行調用,這樣做就可以提高效率,當然很多時候都需要寫成連接池的形式。

      經驗六:使用VB在SQL中處理含單引號的字符串時,對字符串數據都用單引號引起來,如:


    Select * from MyTable Where ID=注釋:FirstID注釋:

      若其中的FirstID為First注釋:ID,即中間多出一個單引號,則上述寫法將導致錯誤,解決的辦法是將字符串中的每一個單引號用兩雙引號替換,下面的函數StrToSQL完成該功能,并用單引號將處理后的字符串引起來:


     Private Function StrToSQL(ByVal strValue As String) As String
        StrToSQL = "注釋:" + Replace(strValue, "注釋:", "注釋:注釋:") + "注釋:"
     End Function


      在寫SQL時如有字符串數據,不管其中有沒有單引號,都可以這樣使用:


       strValue="First注釋:Id"
       strSQL="Select * from MyTable Where ID="+StrToSQL(strValue)
    三. 實例解析

      下面介紹一個實例,來消化以上的相關知識。這里我在一個程序界面下實現了DAO,ADO,ODBC,OLEDB四種數據庫訪問方式。

      程序代碼分析:

    注釋:整個程序功能是選擇不同的連接方式來進行顯示工作,三種方式顯示效果完全相同
    注釋:下面是主程序過程
    Private Sub Command1_Click()
     Dim selitem As Integer
     注釋:判斷連接數據庫的方式
     If Option1.Value = True Then
      selitem = 1
     Else
      If Option2.Value = True Then
       selitem = 2
      Else
       selitem = 3
      End If
     End If

     注釋:選取不同的數據庫連接方式
     Select Case selitem
     Case 1:
      注釋:使用DAO的數據庫連接方式
      Call ShowByDAO
     Case 2:
      注釋:使用ADO的數據庫連接方式
      Call ShowByADO
     Case 3:
      注釋:使用ODBC的數據庫連接方式
      Call ShowByODBC
     Case 4:
      注釋:使用OLEDB的數據庫連接方式
      Call ShowByOLEDB
     End Select
    End Sub

    Private Sub ShowByDAO()
     注釋:使用DAO的數據庫連接方式
     Dim db As Database
     Dim rs As Recordset
     Dim sqlstr$ 注釋:存放查詢語句
     Set db = OpenDatabase(App.Path & "\db1.mdb")
     sqlstr = "select * from 成績表"
     Set rs = db.OpenRecordset(sqlstr)
     注釋:顯示結果
     Call GridShow(rs)
    End Sub

    Sub ShowByADO()
     Dim conn As New ADODB.Connection
     Dim rs As New ADODB.Recordset
     注釋:使用數據源來連接數據庫
     conn.Open "dsn=data"
     rs.CursorType = adOpenKeyset
     rs.LockType = adLockOptimistic
     rs.Open "select * from 成績表", conn
     Call GridShowOfADO(rs)
    End Sub

    Sub ShowByODBC()
     Dim conn As New ADODB.Connection
     Dim rs As New ADODB.Recordset
     注釋:使用數據源來連接數據庫
     conn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=data"
     rs.Open "select * from 成績表", conn
     注釋:顯示結果
     Call GridShowOfADO(rs)
    End Sub

    Sub ShowByOLEDB()
     Dim conn As New ADODB.Connection
     Dim rs As New ADODB.Recordset
     注釋:使用數據源來連接數據庫
     conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path & "\db1.mdb" + ";Persist Security Info=False"
     rs.Open "select * from 成績表", conn

     注釋:顯示結果
     Call GridShowOfADO(rs)
    End Sub

    Sub GridShow(rs As Recordset)
     注釋:對dao方式進行顯示工作
     MSFlexGrid1.TextMatrix(0, 0) = "姓名"
     MSFlexGrid1.TextMatrix(0, 1) = "性別"
     MSFlexGrid1.TextMatrix(0, 2) = "語文"
     MSFlexGrid1.TextMatrix(0, 3) = "數學"
     MSFlexGrid1.TextMatrix(0, 4) = "英語"
     rs.MoveLast
     MSFlexGrid1.Rows = rs.RecordCount + 1
     MSFlexGrid1.Cols = rs.Fields.Count
     Dim i%
     i = 1
     rs.MoveFirst
     While (Not rs.EOF)

      MSFlexGrid1.TextMatrix(i, 0) = rs.Fields(0)
      MSFlexGrid1.TextMatrix(i, 1) = rs.Fields(1)
      MSFlexGrid1.TextMatrix(i, 2) = rs.Fields(2)
      MSFlexGrid1.TextMatrix(i, 3) = rs.Fields(3)
      MSFlexGrid1.TextMatrix(i, 4) = rs.Fields(4)
      rs.MoveNext
      i = i + 1
      注釋:If (rs.EOF = True) Then
      注釋: Exit For
     Wend
    End Sub

    Sub GridShowOfADO(rs As ADODB.Recordset)
     注釋:對ado方式進行顯示工作
     MSFlexGrid1.TextMatrix(0, 0) = "姓名"
     MSFlexGrid1.TextMatrix(0, 1) = "性別"
     MSFlexGrid1.TextMatrix(0, 2) = "語文"
     MSFlexGrid1.TextMatrix(0, 3) = "數學"
     MSFlexGrid1.TextMatrix(0, 4) = "英語"
     注釋:注意recordcount屬性必須在當前記錄指針在最后一條記錄時才會返回正確的值
     rs.MoveLast
     MSFlexGrid1.Rows = rs.RecordCount + 1
     MSFlexGrid1.Cols = rs.Fields.Count
     Dim i%
     i = 1
     rs.MoveFirst
     While (Not rs.EOF)
      MSFlexGrid1.TextMatrix(i, 0) = rs.Fields(0)
      MSFlexGrid1.TextMatrix(i, 1) = rs.Fields(1)
      MSFlexGrid1.TextMatrix(i, 2) = rs.Fields(2)
      MSFlexGrid1.TextMatrix(i, 3) = rs.Fields(3)
      MSFlexGrid1.TextMatrix(i, 4) = rs.Fields(4)
      rs.MoveNext
      i = i + 1
     Wend
    End Sub

    Private Sub Command2_Click()
    End
    End Sub


      上述代碼已經在Windows 2000 professional和Visual Basic 6.0的環境下調試成功。

    四.小結

      本文通過對數據庫訪問相關技術的分析與總結,提出若干有價值的經驗。借鑒這些經驗,會給開發帶來一定的便利。

    posted on 2008-11-26 07:18 大鳥 閱讀(317) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 久久精品免费大片国产大片| 亚洲中文久久精品无码ww16| 99在线视频免费观看| 亚洲精品午夜国产va久久| 亚洲精品无码久久久久去q| 国产yw855.c免费视频| 无码国产精品一区二区免费式影视| 一区二区三区在线免费 | 人人玩人人添人人澡免费| 粉色视频在线观看www免费| 亚洲一卡二卡三卡四卡无卡麻豆| 国产偷v国产偷v亚洲高清| 亚洲av手机在线观看| 免费可以在线看A∨网站| 99国产精品视频免费观看| 国产一级a毛一级a看免费视频 | 暖暖在线视频免费视频| 日韩大片免费观看视频播放| 亚洲av第一网站久章草| 99999久久久久久亚洲| 亚洲成年人电影在线观看| 成年女人A毛片免费视频| 精品久久久久久亚洲中文字幕| 亚洲白色白色在线播放| 蜜芽亚洲av无码精品色午夜| 国产国拍亚洲精品mv在线观看| 亚洲国产精品日韩专区AV| 免费大片在线观看网站| 亚洲AV蜜桃永久无码精品| 亚洲国产一区二区视频网站| 免费永久看黄在线观看app| 无码专区一va亚洲v专区在线| 国产乱弄免费视频| 国产精品免费播放| 国产免费久久精品久久久| 免费又黄又爽的视频| 午夜亚洲福利在线老司机| 亚洲国产中文字幕在线观看| 亚洲综合久久夜AV | 亚洲日韩欧洲无码av夜夜摸| 亚洲午夜无码久久久久|