站內搜尋:Yahoo搜尋如果沒有給完整的網址,請在站內再搜尋一次!

2014-06-22

使用ADO物件連接資料庫,存取操作資料

  • ADOActiveX Data Objects,是一個用於存取資料來源的COM元件(是一個用於存取資料來源的COM(Component Object Model)元件),是程式語言和OLEDB間的一個中間層。使用ADO存取資料庫SQL的知識不是必要的,但仍可透過ADO的命令物件來執行SQL命令。
    參考:http://zh.wikipedia.org/wiki/ADO
     
  • OLEDBObject Linking and Embedding, DataBase,物件連結嵌入資料庫):以統一方式存取不同類型的資料而設計的一種應用程式介面,是一組用元件物件模型(COM)實作的介面。除了支援SQL的資料庫,也能用在不支援SQL的物件資料庫,或試算表檔案(如Excel)。
    參考:http://zh.wikipedia.org/wiki/OLE_DB
     
  • ADO物件階層圖

  • ADO的Connection及RecordSet物件:建立資料庫連線→取得資料→操作資料
    • Connection物件:建立連接資料庫的物件。
      • 參考:http://www.w3school.com.cn/ado/ado_ref_connection.asp
      • 如何建立Connection?
        dim oConn As ADODB.Connection
        set oConn = Server.CreateObject("ADODB.connection")
      • 設定連線字串
        • zConn = "Driver={SQL Server};server=192.168.xx.xx;uid=UserID;pwd=xxx;database=DBname"  ← MS-SQL
        • zConn = "Provider=IBMDA400;data source=192.168.xx.xx;User Id=UserID;password=xxx;DEFAULT COLLECTION=SLLIB;"  ← AS/400
        • zConn = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=c:\DB\xxx.mdb"  ← Access
      • 開啟資料連結:
        oConn.open zConn
         
    • RecordSet物件:存放所取得資料的物件。
      • 參考:http://www.w3school.com.cn/ado/ado_ref_recordset.asp
      • 如何產生RecordSet?
        dim oRs As ADODB.RecordSet
        set oRs = Server.CreateObject("ADODB.recordset")
      •  用Open方法取得RecordSet的語法:
        RecordSet.Open source, ActiveConnection, CursorType, LockType, Options
        • source:可以是一串SQL命令。
        • CursorType:
          adOpenForwardOnly(0):只可向前移動的RecordSet(往末筆方向)(預設)
          adOpenKeyset(1):可以自由移動的RecordSet
          adOpenDynamic(2):可動態更新編輯的RecordSet
          adOpenStatic(3):可靜態更新編輯的RecordSet
        • LockType:
          adLockReadOnly(1):唯讀(預設)
          adLockPessimistic(2):悲觀鎖定,取得RecordSet後立即鎖定。
          adLockOptimistic(3):樂觀鎖定,只在進行更新時鎖定。
          adLockBatchOptimistic(4):批次樂觀鎖定,同時更新多筆資料時,暫不將資料更新到資料庫,先放在暫存區,執行UpdateBatch時,才將資料整批寫回資料庫。
        • 用Open取得RecordSet的範例:
          oRS.open zSQL, oConn, adOpenKeySet, adLockReadOnly
      • 用Execute方法取得RecordSet的語法:
        Set RecordSet = Connection.Execute[(CommandText,RecordAffected,Options)]
        CommandText:SQL命令
        RecordAffected: 為Long形態的變數,表示被此命令所影響的資料筆數
        Options:
        1-adCmdText SQL查詢文字
        2-adCmdTable 資料表
        4-adCmdStoredProc 預存函式
        8-adCmdUnknown 未定義;由Provider決定
        512-adCmdTableDirect 直接開啟的資料表(應避免使用在SQL Server資料庫上)
         
    •  操作所取得的資料(RecordSet)
      • 如果沒有取得任何資料,EOF及BOF的屬性值,都會是True。所以如果要確認已取得資料的情況下,才進行資料操作,可以這樣做:
        if not oRs.eof then
            '操作資料
            '資料操作後,如確定不再使用,可以將RecordSet清空
            oRs.close
            set oRs = nothing
        else
            'Recordset未取得任何資料
        end if
        '程式最後記得清空連線
        oConn.close
        set oConn = nothing
      • 如何移動資料指標所在位置?
        • oRs.MoveFirst
        • oRs.MovePrevious
        • oRs.MoveNext
        • oRs.MoveLast
      • 逐筆顯示資料一:
        While not oRS.eof
            response.write oRs("欄位名稱").value & ","
            response.write oRs(欄位順序).value & "<br />"
            oRs.MoveNext
        wend
      • 逐筆顯示資料二:
        do until oRs.EOF
           for each x in oRs.Fields
             Response.Write x.name  & "="
             Response.Write x.value & "<br />"
           next
           Response.Write "<br />"
           oRs.MoveNext
        loop
      • 使用GetRows取得RecordSet的資料:
        • GetRows的方法會將Recordset的資料放到指定的二維陣列中,第0維的個數是資料欄位數,第1維是資料筆數。
        • 語法:varArray = rs.GetRows([Rows], [Start], [Fields])
          Rows :表示要擷取的資料筆數。預設值為 adGetRowsRest (-1)。
          Start:讀取起點的BookMark;adBookmarkCurrent(0)(目前資料),adBookmarkFirst(1)(第1筆資料),adBookmarkLast(2)(最後資料)。
          Fields:可以用欄位名稱、索引等來指定要讀取的資料範圍。當欄位數大於1個時,可以用陣列表示。省略 Rows 參數或設定爲 adGetRowsRest(-1)時,GetRows 方法會讀取所有資料並讓Recordset的變成EOF狀態,而不會産生任何錯誤。
        • 範例:aDS = oRs.GetRows(, , Array("EmpCde", "EmpNam", "EmpTel"))
          資料的筆數是UBound(aDS,2)+1
          欄位數是UBound(aDS,1)+1
      •  使用GetString取得RecordSet的資料:
        • 語法:GetString([Format], [NumRows], [ColDelimiter], [RowDelimiter], [NullExpr])
          Format:預設adClipString(2)
          NumRows:要取得的列數,使用-1或省略,代表讀取所有剩下的記錄
          ColDelimiter:行的分隔字元,預設為Tab
          RowDelimiter:每筆資料間的分隔字元,預設為換行字元
          NullExpr:用來表示Null欄位的字串,預設為空字串
        •  範例:
          zString=oRs.GetString( , ,"</td><td>","</td></tr><tr><td>"," ")
      • 使用Find方法取得符合條件的RecordSet中的資料
        • 語法:RecordSet.Find criteria, SkipRows, SearchDirection, start
          criteria:搜尋條件的字串
          SkipRows:從開始位置起,要跳過的資料筆數,可省略
          SearchDirection:搜尋方向,可省略。adSearchForward往最後一筆方向,adSearchBackward往第一筆方向
          start:開始位置
        • 範例:
          oRs.Find = "欄位名稱='條件值'"
      • 新增、刪除、更新
        RecordSet.AddNew [Field],[value]
        RecordSet.Delete [Field],[value]
        RecordSet.Update [Field],[value]
      • 當LockType為adLockPressimistic或adLockOpimistic時,不允許兩個異動同時進行,可以用Supports方法預先檢查
        •  語法:boolean=RecordSet.Supports(CursorOptions)
          CursorOptions: adUpdate, adAddNew, adDelete, adMovePrevious, adBookMark
    • Field物件
      Recordset物件下有Fields物件集合,Fields由一或多個Field物件所組成。每個Field物件代表資料來源的一資料行。
      • 在RecordSet中取得或指定資料指標所在位置的某欄位資料,完整的語法是:
        RecordSet.Fields("欄位名稱").value = "欄位值"
      • 因為Fields是RecordSet的預設屬性,所以表達的語法可以是:
        RecordSet("欄位名稱").value = "欄位值"
      • 又因為value是Fields的預設屬性,所以表達的語法也可以是:
        RecordSet("欄位名稱") = "欄位值"
    • Fields集合物件
      如何計算Field的個數?RecordSet.Fields.Count
  • ADO元件,所提供的另一個存取資料作法
    • Command物件
      Command是使用上較靈活的物件,可以帶入參數,相當於資料庫的預存程序。但是用這種方法取得的RecordSet物件的LockType是adLockReadOnly...
      • 以下使用Command物件的範例:
        set oConn = Server.CreateObject("ADODB.connection")
        oConn.Provider = "Microsoft.Jet.OLEDB.4.0"
        oConn.open "c:/DBFiles/DBname.mdb"
        set oComm=Server.CreateObject("ADODB.command")
        oComm.ActiveConnection=oConn
        zSQL="Select * from PSEMPP  "
        oComm.CommandText=zSQL
        set oRs=ServerCreateObject("ADODB.RecordSet")
        set oRS = oComm.Execute
        ...
      • Execute是Command物件的重要方法,語法:
        Execute([RecordsAffected], [Parameters], [Options]) As Recordset
        RecordsAffected:Long型態的資料筆數
        Parameters:參數陣列
        Options:
        可以指定Command 物件的 CommandText 屬性。可以是一或多個 CommandTypeEnum 或 ExecuteOptionEnum 值。預設值是 adCmdUnspecified。
      • 參考:http://www.w3school.com.cn/ado/ado_ref_command.asp
    • Parameter物件
      雖然Command物件的Execute方法可以傳遞任意數量的參數,但Execute方法無法接收輸出的參數。如果要接收輸出的參數,可用CreateParameter方法來建立Parameter物件
      • 語法:CreateParameter([Name], [Type], [Direction], [Size], [Value]) As Parameter
        name:Parameter物件的名稱
        type:adEmpty, adSmallInt, adInteger, adDate, adChar, adVarChar ...
        Direction:代表輸入參數,輸出參數,或預存函數的回傳值
          0-adParamUnknown 不知名的方向
          1-adParamInput 輸入參數(預設值)
          2-adParamOutput 輸出參數
          3-adParamInputOutput 輸出入參數
          4-adParamReturnValue 預存函數的傳回值
    • Parameters物件集合
      範例:
      set oConn = Server.CreateObject("ADODB.connection")
      oConn.Provider = "Microsoft.Jet.OLEDB.4.0"
      oConn.open "c:/DBFiles/DBname.mdb"
      zSQL="Select * from PSEMPP where EMPCDE>? and EMPCDE<?  "
      set oComm=Server.CreateObject("ADODB.command")
      oComm.ActiveConnection=oConn
      oComm.CommandText=zSQL
      set param1=Server.Create("ADODB.Parameter")
      set param1=CreateParameter("pCDE1", adVarChar, adParamInput, 10)
      oComm.Parameters.Append param1
      set param2=Server.Create("ADODB.Parameter")
      set param2=CreateParameter("pCDE2", adVarChar, adParamInput, 10)
      oComm.Parameters.Append param2
      '取得參數值,並將指定到Parameter物件
      oComm.Parameters("pCDE1").value= "1000"
      oComm.Parameters("pCDE2").value= "2000"
      '取得查詢結果
      set oRs = Server.Create("ADODB.RecordSet")
      set oRS = oComm.Execute
        
  • 參考資料


沒有留言:

張貼留言