国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ADOCE與ADO.NET的差異

2019-11-17 04:41:30
字體:
來源:轉載
供稿:網友

  你是一個需要將自己的知識和代碼從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上去?馬上開始,然后向別人展示——這將是你下一個工程。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高州市| 蓬莱市| 莱西市| 宝鸡市| 永胜县| 屏山县| 安多县| 沂南县| 昌吉市| 赫章县| 溧阳市| 梓潼县| 汤阴县| 工布江达县| 祁门县| 申扎县| 长治县| 五指山市| 屯昌县| 台南县| 舞阳县| 黔江区| 石首市| 康平县| 泸西县| 萝北县| 甘孜县| 芜湖市| 达拉特旗| 共和县| 金湖县| 信阳市| 南充市| 文山县| 漯河市| 丰原市| 陇川县| 芮城县| 阳春市| 宁陕县| 玉树县|