680 likes | 851 Views
ADO 物件簡介. ADO 物件簡介. ADO(ActiveX Data Object) 是微軟為了讓程式設計師們以他們自己所熟悉的各種語言都可以存取各式資料來源,包括結構化資料庫,不管是 Oracle 、 MS SQL Server 、 Access 等等. Active Data Objects 物件模組. Connection 物件. 用以連接資料庫的物件,這是製作資料庫應用程式時,第一個必須作成的物件 Connection 物件是在 ADO 物件模型中最高層的物件,它用來在你的應用程式與外界資料來源間建立連結。. Recordset.
E N D
ADO物件簡介 • ADO(ActiveX Data Object)是微軟為了讓程式設計師們以他們自己所熟悉的各種語言都可以存取各式資料來源,包括結構化資料庫,不管是Oracle、MS SQL Server、Access等等
Connection 物件 • 用以連接資料庫的物件,這是製作資料庫應用程式時,第一個必須作成的物件 • Connection物件是在ADO物件模型中最高層的物件,它用來在你的應用程式與外界資料來源間建立連結。
Recordset • 取得資料來源的物件,它可以是一個表格,也可以是由SQL敘述或Command物件所取得的資料記錄的集合。 • Recordset用來存取透過SQL查詢傳回來的記錄.使用這個物件你可以在資料記錄中瀏覽,並新增、修改、刪除和查詢記錄。
Command 物件 • 儲存操作資料庫時將會用到的命令之物件 • Command物件是用來產生查詢(query),包含使用者可以定義的參數(parameter),以存取資料來源。通常會傳回Recordset物件。
Parameter • 管理查詢命令(Query)或預儲程式(Stored Procedure)之參數的物件。 • Parameters集合是用來傳遞參數查詢或是SQL Server上的Stored Procedure執行時需要的參數,以及需要傳回的參數。
Field物件 • 儲存具有相同資料型態或屬性之資料記錄的物件 • Fields集合是用來存取記錄中每一欄的資料
Error物件 • 存取資料庫,難免會發生錯誤,而儲存錯誤訊息的物件,即為Error物件 • Errors集合用來傳回執行時期錯誤(run-time errors)的細節資訊,或是其他由資料來源傳回來的訊息。
程式碼範例Sub MakeAConnection() '宣告一個Connection和Error物件Dim cnn As ADODB.Connection Dim errAdo As ADODB.Error Set cnn = New ADODB.Connection '啟動錯誤處理On Error GoTo errHandle '建立一個資料連結到資料來源With cnn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=C:\Program Files\Microsoft Visual Studio\VB98\nwind.mdb" .Open End With • '如果沒有錯誤,就離開本副程式。 '注意一定要撰寫這一行,避免雖然程式正常執行,但仍然去執行錯誤處理Debug.Print "連結建立成功" Exit SuberrHandle: '如果有錯誤發生,便利用For Each的迴圈讀完所有的錯誤訊息Dim str As String For Each errAdo In cnn.Errors str = str & errAdo.NativeError & " : " & errAdo.Description & vbCrLf Next MsgBox strEnd Sub
處理資料存取錯誤 • 收集與處理ADO的錯誤與處理大部分的VB錯誤的方式相同。你可以撰寫錯誤處理機制(error-handling)的程式碼來預防可能發生的錯誤。與VB不同的地方是,當你使用ADO的Errors集合物件時,傳回的錯誤訊息可能不只一個。 • 當某個錯誤發生時,資料來源回傳回錯誤訊息,這是系統會產生Error物件並將該物件加入到Errors集合中。你可以透過一般在VB中處理集合物件的方式來檢視這些訊息。
Property • 保存Connection 物件、Command物件、Recordset物件、Field物件之屬性的物件。
ADO物件的功用 • 移動記錄 • 更新記錄 • 新增記錄 • 刪除記錄 • 搜尋記錄 • 篩選記錄 • 排序記錄
使用ADO建立資料來源到資料庫 • 1.設定參照(reference)到ADO Object Library2.宣告Connection物件3.設定OLE DB的資料提供者(data provider)4.傳遞連結資訊 • 一但你完成上述的步驟,你便已經準備好要利用Open方法來建立連結。
設定參照到ADO Object Library 1.選擇主選單的Project,並點選References 2.選擇Microsoft ActiveX Data Object X.X Library後按下OK
ADO物件的製作方式 • STEP1:宣告物件變數 • STEP2:把物件型態代入變數中
宣告物件變數 • Dim objvar as Class Objvar:物件變數的名稱 Class:類別名稱 例: Dim cn as ADODB.connection
把物件型態代入變數中 • Set objvar=New Class objvar:物件變數的名稱 Class:類別名稱 在此使用New的主要原因,為製作ADO物件的副本。 例: Dim cn As ADODB.Connection Set cn=New ADODB.Connection
設定OLE DB的資料提供者(data provider) • 一但你產生了connection物件,接著要定義OLE DB的資料提供者(Data Provider)。藉由設定Connection物件的Provider屬性來設定。 • 下列程式碼設定Microsoft SQL Server為資料提供者 • cnn.Provider = "SQLOLEDB”
傳遞連結資訊 • 建立連結的最後一步是設定連結的資訊。這要利用Connection物件的ConnectionString屬性。Connection字串參數隨著資料提供者的不同而稍有不同。這些字串會直接傳給資料提供者,ADO本身並不處理
傳遞連結資訊 • 下列程式碼是設定建立到Microsoft SQL Server的程式碼寫法 • With cnn .Provider = "SQLOLEDB" .ConnectionString = "User ID=sa;Password=;" & _ "Data Source=Ui;" & _ "Initial Catalog=Pubs" • End With • 注意:上面的連結字串中的參數Password=;是因為該伺服器的sa帳號未設密碼的關係。
取消對資料來源的連結 • 一但你要取消對資料來源的連結,只要使用Connection物件的Close方法。以SQL Server來說,當連結結束後,會自動釋放該連結所佔用的資源。一般來說,在用完後便立即釋放資源在多人共用的環境中,是一個良好的程式撰寫習慣。 • 取消連結的程式碼如下 • cnn.CloseSet cnn = Nothing
使用Connection物件所觸發的事件 • Connection物件支援許多事件,讓你可以撰寫應付各種狀況的程式碼。這些狀況在連結到資料源,執行SQL述句和管理交易(Transaction)時發生。
啟動ADO事件 • 當你宣告ADO物件時,要使用VB的WithEvents關鍵字好在VB整合環境中撰寫事件觸發後相應的程式碼。當你使用WithEvents關鍵字後,便可以在VB程式碼撰寫視窗的左上方,物件下拉視窗中找到該物件變數的名稱。
程式碼如下 • Private Sub cnnUi_ConnectComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection) If adStatus = adStatusOK Then MsgBox "連結建立完成" End IfEnd Sub
從資料源獲取資料 • 使用Command物件 • ADO的Commmand物件可以用來存取資料源的資料,或是建立查詢。另一項主要的功能是呼叫資料源的Stored Procedure • 使用Command物件不一定要先明確地建立Connection物件,但若你未明確的建立Conneciton物件而直接使用Command存取資料源,則系統會暗地裡幫你建立Connection物件,這時所建立的Connection物件不能提供給其他的Command或Recordset物件重新使用。
利用已經存在的Connection來執行Command • Dim cnn As New ADODB.ConnectionWith cnn ‘設定Connection的連結字串並建立連結.Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=C:\Program Files\Microsoft Visual Studio\VB98\nwind.mdb,Initial Catalog=pubs;User ID=sa;Password=;" .OpenEnd With • Dim cmd As New ADODB.CommandWith cmd '利用已經建立好的Connection物件.ActiveConnection = cnn '設定要執行的SQL命令.CommandText = "UPDATE Titles SET Price=Price*1.1" '執行Command .ExecuteEnd With • Set cmd = Nothingcnn.CloseSet cnn = Nothing
建立獨立的Command物件 • Dim cmd As New ADODB.CommandWith cmd '提供連結到SQL Server:Ui01的資訊.ActiveConnection = "Provider=SQLOLEDB;Data Source=ui01;Initial Catalog=pubs;User D=sa;Password=;" .CommandText = "Update Titles Set Price=Price*1.1" .ExecuteEnd With
使用Recordset物件 • Recordset物件讓你的應用程式可以逐筆存取透過SQL查詢命令要求資料來源傳回來的資料。這個查詢命令可以是在程式中產生,或是存在SQL Server上的Stored Procedure。透過recordset物件,你可以在一筆筆的記錄中,來回移動並新增、修改、刪除記錄。
使用Recordset物件 • 一般初學的VB程式撰寫者會喜歡使用Recordset物件,好讓使用者可以在操作介面上透過上一筆、下一筆的瀏覽方式存取資料庫。但是這是非常耗費伺服端資源的做法。VB的程式設計師若要撰寫有效率的資料庫程式以供多人同時上線使用,應該要先了解伺服器型的資料庫如MS SQL Server、Oracle、Sybase等等他們所提供的Stored Procedure,並以SQL (Structure Query Language)來批次更新記錄,才是有效利用伺服器資料庫引擎的方式。
利用Connection物件和Command物件來產生Recordset物件利用Connection物件和Command物件來產生Recordset物件 • 以下這種方法並不好,此範例的目的僅僅是要展示如何將ADO三個主要物件搭配使用。若僅僅要傳回Recordset,利用connection物件的Execute方法直接產生便可
Dim cmd As New ADODB.CommandDim cnn As New ADODB.ConnectionDim rec As New ADODB.RecordsetWith cnn '提供連結到SQL Server:Ui01的資訊. .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=C:\Program Files\Microsoft Visual Studio\VB98\nwind.mdb" .OpenEnd WithWith cmd '設定Command的SQL命令.ActiveConnection = cnn .CommandText = "SELECT * FROM titles" '透過Command物件的Execute方法自SQL Server取回記錄並放入Recordset物件Set rec = .ExecuteEnd WithDim i As IntegerWith rec While Not .EOF For i = 0 To .Fields.Count - 1 '列印出結果Debug.Print .Fields(i) & " | "; Next i Debug.Print .MoveNext WendEnd With
利用Recordset物件自己的Open方法 • Dim cnn As New ADODB.ConnectionDim rec As New ADODB.RecordsetWith cnn '提供連結到SQL Server:Ui01的資訊.Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=C:\Program Files\Microsoft Visual Studio\VB98\nwind.mdb" .OpenEnd WithWith rec • '設定開啟的模式 • .CursorLocation = adUseClient .CursorType = adOpenKeyset .LockType = adLockOptimistic .Open "SELECT * FROM titles", cnnEnd With
利用Connection物件的Execute方法產生Recordset物件 • 程式碼範例如下 • Dim cnn As New ADODB.ConnectionDim rec As New ADODB.RecordsetWith cnn '提供連結到SQL Server:Ui01的資訊. .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=C:\Program Files\Microsoft Visual Studio\VB98\nwind.mdb" .Open Set rec = .Execute("SELECT * FROM titles")End With
將資料呈現給使用者 • 有兩種方式你可以將透過Recordset物件取回的資料呈現給使用者,一個是撰寫程式去填入控制項(control)的屬性如Text box的Text屬性,或是直接利用控制項的一些屬性如DataSource、DataField等等來將控制項與Recordset綁在一起(Data Binding)。
參照Recordset物件內的各個欄位 • 程式碼範例如下 • Dim rec As New ADODB.RecordsetWith rec .Open "SELECT * FROM titles", "Provider=SQLOLEDB;Data Source=ui01;Initial Catalog=pubs;User ID=sa;Password=;", adOpenKeyset, adLockOptimisticEnd WithWith rec While Not .EOF '列印出結果Debug.Print rec!Title & " | " & rec.Fields("price") .MoveNext WendEnd With • 以下利用VB的內定控制項TextBox來呈現資料 • Text1.Text = rec!TitleText2.Text = rec!price
將控制項綁到Recordset物件 • Visual Basic提供一項新的功能就是大部分的控制項(稱呼為資料感知控制項data-aware control)都可以直接與ADO的Recordset物件綁在一起﹔如同你將控制項與ActiveX Data Control綁在一起一樣。當使用者移動Recordset物件內的記錄游標時,所有綁在一起的控制項都會自動地一起改變。 • 程式範例如下 • Set Text1.DataSource = recText1.DataField = "title"Set Text2.DataSource = recText2.DataField = "price"
瀏覽Recordset物件中的記錄 • 在ADO所提供的各種物件中,只有Recordset物件提供使用者做上一筆、下一筆、第一筆、最後一筆等等這一類的瀏覽記錄方式,一次只針對一筆資料運作。
Recordset物件中與瀏覽相關的方法 注意:若記錄游標的型態(CursorType )是adForwardOnly,則只能用MoveNext方法
程式碼範例如下 • Dim rec As New ADODB.Recordset • Private Sub cmdFirst_Click() '移到第一筆記錄rec.MoveFirstEnd SubPrivate Sub cmdLast_Click() '移到最後一筆記錄rec.MoveLastEnd SubPrivate Sub cmdNext_Click() • '向後移動一筆記錄With rec .MoveNext '如果向後移超過最後一筆資料,便將資料游標停在最後一筆記錄上If .EOF Then .MoveLast End If End WithEnd Sub