程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> ADOCE與ADO.NET的差異

ADOCE與ADO.NET的差異

編輯:關於.NET

你是一個需要將自己的知識和代碼從PC移植到Pocket PC上的ADO開發人員嗎?我將通過一些代碼實例來向您展示ADO和ADOCE之間的相似和不同之處。

本文需要:

· Microsoft? eMbedded Visual Tools.

· Microsoft SQL Server 2000 Developer Edition.

· SQL Server 2000 Windows? CE Edition.

· Microsoft ADOCE (ActiveX? Data Objects CE) 3.1 included with SQL Server 2000 Windows CE Edition.

· To try the server-side examples, you need Microsoft Visual Studio? and ADO 2.6.

Gotchas

因為在CreateObject聲明中有一處內存漏洞,所以你最好在你的程序中只創建ADOCE對象一次。在實例代碼中,我將CreateObject的調用放到了每一個事件過程中,但是那只是為了比較ADO代碼。

數據訪問

大部分企業應用程序都是以數據為中心的,這意味著你需要知道如何儲存信息。我的愛好是存儲數據,當Pocket PC上使用的是真正的數據庫——SQL Server 2000 Windows CE Edition。因此,我的第一個建議是得到你所需要的一個SQL Server 2000 Developer Edition的許可。

當你安裝了SQL Server 2000 Windows CE Edition後,你將同時得到ADOCE 3.1,最新的版本。我將用它和PC上最新版的ADO 2.6進行比較。

主要差異

好了,讓我們來首先大概地看一下重要的差別。下面是一個ADOCE不支持的ADO功能列表:

· Command and Parameter objects

· Collection objects

· Property object

· Recordset persistence (Recordset.Save)

· Asynchronous queries

· Disconnected Recordsets

· Dynamic creation of Recordsets

· Multiple queries (Recordset.NextRecordset)

對於我來說,沒有的Recordset persistence意味著我不能將結果集存成Extensible Markup Language (XML)來供Pocket PC上的其他程序來調用。也許更重要的是,我不能將XML數據存入我的結果集中了。這造成了我需要進行從服務器組件中到Pocket PC上的數據轉化或者相反——我也需要一些轉化。我的建議是看一下Odyssey Software提供了什麼。他們的Cefusion和ViaXML產品在這裡都是有用的。如果你在尋找更長遠(讀Microsoft .NET)的方法來轉換數據,你應該看一下pocketSOAP。

無論如何,大多數重要的功能在ADOCE中被實現了。現在我們來看一下在相同的數據訪問環境中的一些差異。

讀取數據

讓我們用最常見的設想來開始——當你需要從一個數據存儲中得到一些信息。在PC上,填寫ListView控件的數據獲取代碼將會這麼寫:

Dim litm As ListItem
Dim laco As Connection
Dim lars As Recordset
Dim lsSQL As String
' Add column headers
lvwArticles.ColumnHeaders.Add , , "Description", 2500
lvwArticles.ColumnHeaders.Add , , "Price", 600, lvwColumnRight
lvwArticles.ColumnHeaders.Add , , "Stock", 600, lvwColumnRight
' Create objects
Set laco = CreateObject("ADODB.Connection")
Set lars = CreateObject("ADODB.Recordset")
' Open Connection
laco.Open "Provider=SQLOLEDB;Data Source=SERVERNAME;" & _
"Initial Catalog=DBNAME;Trusted_Connection=Yes"
' Open Recordset
lsSQL = "SELECT * FROM Article"
lars.Open lsSQL, laco, adOpenForwardOnly, adLockReadOnly
' Clear list and get item rows
Do While Not lars.EOF
Set litm = lvwArticles.ListItems.Add(, , lars("Description").Value)
litm.SubItems(1) = lars("Price").Value
litm.SubItems(2) = lars("Stock").Value
lars.MoveNext
Loop
' Close Recordset and Connection
lars.Close
laco.Close

你在Pocket PC上將這樣做:

Dim litm As ListItem
Dim laco As Connection
Dim lars As Recordset
Dim lsSQL As String
' Add column headers
lvwArticles.ColumnHeaders.Add , , "Description", 2500
lvwArticles.ColumnHeaders.Add , , "Price", 600, lvwColumnRight
lvwArticles.ColumnHeaders.Add , , "Stock", 600, lvwColumnRight
' Create objects
Set laco = CreateObject("ADOCE.Connection.3.1")
Set lars = CreateObject("ADOCE.Recordset.3.1")
' Open Connection
laco.Open "Provider=Microsoft.SQLSERVER.OLEDB.CE.1.0;" & _
"Data Source=\DBNAME.sdf"
' Open Recordset
lsSQL = "SELECT * FROM Article"
lars.Open lsSQL, laco, adOpenForwardOnly, adLockReadOnly
' Clear list and get item rows
Do While Not lars.EOF
Set litm = lvwArticles.ListItems.Add(, , lars("Description").Value)
litm.SubItems(1) = lars("Price").Value
litm.SubItems(2) = lars("Stock").Value
lars.MoveNext
Loop
' Close Recordset and Connection
lars.Close
laco.Close

正如你看到的,在兩個例子中有一些較小的差別。比較明顯的是Connection對象的Open方法的連接字符串不同。如果你忽略Provider參數,ADOCE將假設你想訪問一個Pocket Access數據庫文件。而SQL Server CE始終是作為一個文件名被引用。這種情況下,文件將被放置到設備的根目錄下,但是也可以被放置在你的應用程序目錄中(例如,Data Source=\Program Files\AppName\AppName.sdf)。

結論

(a)所有的數據訪問代碼幾乎不需要修改就可以被使用並且

(b)大多數你的PC程序數據訪問代碼得到數據,你會認識到將你PC應用程序移植到Pocket PC上不需要巨大的努力。

更新數據

現在,讓我們看一下另外一個假設——當我們需要添加一些信息到數據存儲。我將使用和數據獲取相同的代碼來打開和關閉Connection和 Recordset對象。在PC上你將寫類似的代碼:

' Open Recordset
lsSQL = "SELECT * FROM Article"
lars.Open lsSQL, laco, adOpenDynamic, adLockOptimistic
' Add new Article
lars.AddNew
lars("Description").Value = "Test"
lars("Price").Value = 50
lars("Stock").Value = 100
lars.Update
而在Pocket PC上你將看到這樣的代碼:
' Open Recordset
lsTable = "Article"
lars.Open lsTable, laco, adOpenDynamic, adLockOptimistic, _
adCmdTableDirect
' Add new Article
lars.AddNew
lars("Description").Value = "Test"
lars("Price").Value = 50
lars("Stock").Value = 100
lars.Update

正如你看到的,不同之處在於你打開Recordset的方法。作為更新,Recordset作為一個表被打開比作為一個SQL聲明(SELECT)更好。你也許在PC上(ADO)做的很好,但是這一點大概是你將代碼從PC移植到Pocket PC上時不得不改變的。

讓我們來看一個更新的狀況。這是PC上的代碼:

' Open Recordset
lsSQL = "SELECT * FROM Article WHERE Description='Test'"
lars.Open lsSQL, laco, adOpenDynamic, adLockOptimistic
' Update Article
If Not lars.EOF Then
lars("Price").Value = 200
lars.Update
End If
這是Pocket PC上的:
' Open Recordset
lsTable = "Article"
lars.Open lsTable, laco, adOpenDynamic, adLockOptimistic, _
adCmdTableDirect
lars.Find "Description='Test'"
' Update Article
If Not lars.EOF Then
lars("Price").Value = 200
lars.Update
End If

像在PC上一樣用SQL聲明(SELECT)來創建一個可更新Recordset是不可能的,你可以使用Find方法得到Recordset中想要的位置。

如果你像加強一些性能,你可以用一個"raw" SQL UPDATE statement來做相同的事情:

laco.Execute "UPDATE Article SET Price=200 WHERE Description='Test'"

為了完善設想,我們來看一下如何刪除數據。在PC上,代碼是這樣的:

' Open Recordset
lsSQL = "SELECT * FROM Article WHERE Description='Test'"
lars.Open lsSQL, laco, adOpenDynamic, adLockOptimistic
' Delete Article
If Not lars.EOF Then lars.Delete
Pocket PC上相應的代碼:
' Open Recordset
lsTable = "Article"
lars.Open lsTable, laco, adOpenDynamic, adLockOptimistic, _
adCmdTableDirect
lars.Find "Description='Test'"
' Delete Article
If Not lars.EOF Then lars.Delete

這裡和更新的代碼非常像。請注意Find方法的結果集是一個只包含與搜索標准相匹配記錄的Recordset。這意味著你在PC和Pocket PC中會得到相同內容的Recordset。我說這個,是為了防止你想對Pocket PC上的Recordset做更多的事情,因為你打開了相同的表。

此外,你可以用一個SQL DELETE語句來做幾乎相同的事情:

laco.Execute "DELETE Article WHERE Description='Test'"

我說“幾乎”,是因為最後的Execute將會刪除所有與查詢條件匹配的記錄,但是上面的只會刪除第一條出現的記錄。在實際的情況中,搜索比較也許會被設定為唯一的鍵來產生出相同的結果。

完整的例子,請看例子的代碼。

結束

你已經知道了大多數關於PC上的ADO可以被用在你的Pocket PC上的事情,即使一些事情的處理方式略有不同。同樣,在寫Pocket PC程序時,大部分數據訪問代碼都可以通過一些改動應用到你的程序中去。

你今天為什麼不開始將一個PC上的企業級程序移植到Pocket PC上去?馬上開始,然後向別人展示——這將是你下一個工程。

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