成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何實現Windows Mobile下C++訪問SqlCe的封裝

移動開發
這里講述在Windows Mobile和Wince下,Native C++訪問SqlCe的封裝類的實現。希望本文能對大家有所幫助。

在手機下,進行數據庫開發,一般都要使用輕量級數據庫。這里介紹的是如何實現Windows Mobile下C++訪問SqlCe的封裝。

背景

進行Windows Mobile的應用的開發,很多時候需要對數據庫進行訪問,存儲和讀取。可是微軟沒有為Native C++提供象ADO.NET下的封裝,所以我自己封裝了一個SqlCe訪問類。

簡述

本文講述在Windows Mobile和Wince下,Native C++訪問SqlCe的封裝類的實現。由于微軟沒有為C++提供像ADO.NET的封裝,為Native C++訪問SqlCe制造了一定的難度,因此對OleDB訪問SqlCe進行封裝,方便使用SQL語句對SqlCe進行操作。

SqlCe訪問技術概述

ADO.NET

.NET Compact Framework逐漸成為Windows Mobile和Wince的開發的主流,微軟為CF.NET提供了ADO.NET訪問SqlCe,對SqlCe的訪問封裝在System.Data.SqlServerCe下,和其他數據庫(SQL Server, Oracle)訪問基本兼容,但是不支持DbProviderFactory。例如下面的代碼不能通過編譯,因為沒有SqlCeProviderFactory類。

DbProviderFactory factory = SqlCeProviderFactory.Instance;我之前封裝了一個ADO.NET的SqlCe訪問類,可以參考 .NET Compact Framework下SQL CE的使用 和 實現了SqlCeHepler的單元測試類見.NET Compact Framework下的單元測試。

OleDb

在Native的世界,可以通過OleDb來訪問SqlCe。OleDb封裝在sqlceoledb35.dll下,使用OleDb需要安裝一個Cab包如下:

C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Devices\wce500\armv4i\sqlce.repl.ppc.wce5.armv4i.CAB上述路徑根據平臺有所不同。

注意上述sqlceoledb35.dll只是支持SqlCe 3.5,微軟對不同版本的SqlCe的兼容性不是很好,可以參考 SQL Server Express和SQL Server Compact的應用 和 .NET Campact Framework下SQL CE兼容性問題 了解SqlCe的歷史我兼容性問題。

本文后續會重點講述OleDb。

ADO

在Windows Mobile和Wince平臺,微軟官方不支持ADO。但是有一個社區實現,可以參考 A set of ADOCE classes。我沒有試過,所以不好評論。

實現

下面講述如何基于OleDb實現對SqlCe的訪問。

文檔和Samples

微軟提供了在線文檔,可以在 Microsoft SQL Server Compact 3.5 Books Online and Samples下載。上述鏈接只是包含在線文檔,沒有提供例子程序的,所以這個名字有點騙人感情之嫌。雖然提供了在線文檔,但是文檔的質量不高,有些細節沒講,例如調用ICommand::Execute的入口參數就沒有講,我做的時候只能自己試。

雖然上面的鏈接不提供Samples,但是我們還有另外一個方法取得Samples。在

C:\Program Files\Microsoft SQL Server 2005 Mobile Edition\Samples\NorthwindOleDb下可以得到Sample代碼,前提是安裝了Microsoft SQL Server 2005 Mobile Edition。但是要注意不同SqlCe版本實現有所不同,這個代碼要結合上面的Online book修改才行。

基于SQL語句的實現

微軟的例子程序NorthwindOleDb提供了通過OleDb訪問SqlCe的方法,但是不提供對SQL語句的封裝,直接對表的訪問效率比較高,但是也有很大的不便性。因為每個操作都單獨封裝一個函數,每個函數大概至少需要100行代碼,而且有指針等資源的分配,釋放等操作,一旦沒有處理好就發生內存泄漏了。所以我偏向于使用統一的SQL語句接口對SqlCe進行操作,雖然犧牲了點性能,卻提供了方便性。下面是當前版本的封裝類。這個類是基于João Paulo Figueira 的OleDbClientLib3實現的。

基于SQL語句的實現

 

打開關閉

  1. bool Open(const CString& dbPath);  
  2. void Close(); 

上面為打開和關閉SqlCe數據庫鏈接的操作,這里實現為長鏈接,也就是不調用Close()的話,數據庫的Session一直鏈接著,這樣的好處是縮短訪問時間。

新建刪除

  1. bool CreateDatabase(const CString& dbPath);  
  2. bool DeleteDatabase(const CString& dbPath); 

由于SqlCe是in-process數據庫,物理上表現為就一個文件,可以方便新建和刪除,上述接口就是新建和刪除SqlCe數據庫,新建后自動打開數據庫的Senssion了。

增刪改操作

  1. int  ExecuteNonQuery(const CString& sql); 

把增刪改的語句調用ExecuteNonQuery()執行就可以了。

  1. SqlCeHelper db;HRESULT hr = db.Open(DB_FILE_NAME);  
  2. if(hr < 0){    CString cstr = db.GetErrorsMessage();   
  3.    char* str = new char[cstr.GetLength()+1];      
  4. sprintf(str, "%S", cstr);     
  5.  FAIL(str);      
  6. delete str;}CString sqlStr;for(int i=0; i<max; ++i)  
  7. {    SYSTEMTIME currentTime;    
  8.       GetLocalTime(¤tTime);   
  9.    sqlStr.Format(L"INSERT INTO T1 (F1, F2, F3) VALUES(%d, 'STR%d', '%d-%d-%d %d:%d:%d')",         i, i, currentTime.wYear, currentTime.wMonth, currentTime.wDay, currentTime.wHour, currentTime.wMinute, currentTime.wSecond);    
  10.   hr = db.ExecuteNonQuery(sqlStr);   
  11.    if(hr < 0)     
  12.  {        CString cstr = db.GetErrorsMessage();   
  13.        char* str = new char[cstr.GetLength()+1];   
  14.        sprintf(str, "%S", cstr);      
  15.     FAIL(str);          
  16. delete str;   
  17.    }  
  18. }db.Close(); 

事務處理

  1. void BeginTransaction();  
  2. void CommitTransaction();  
  3. void RollbackTransaction(); 

但是當前版本還沒有事務支持。

查詢操作

其實這么多操作之中查詢操作的實現是最復雜的。

  1. int     ExecuteReader(const CString& sql); 

執行ExecuteReader()會根據select語句初始化一個結果集,和ADO.net的實現不一樣,這個結果集不是直接通過DataSet或者DataReader來返回的,而是保持在內部的IRowset的結構里面。為了方便使用,SqlCeHelper實現了一個只讀,向前的數據讀取方法。

  1. bool IsEndOfRecordSet();void MoveNext();  
  2. void CloseReader();  
  3. int        GetRowInt(const long ordinal);  
  4. double    GetRowDouble(const long ordinal);  
  5. CString    GetRowStr(const long ordinal); 

當調用ExecuteReader()后,可以調用IsEndOfRecordSet()判斷結果集是否為空。MoveNext()為移動到下一條記錄。GetRowInt(), GetRowDouble()和 GetRowStr()為讀取當前記錄的數據。CloseReader()關閉結果集。

  1. SqlCeHelper db;      
  2. HRESULT hr = db.Open(DB_FILE_NAME);    
  3.   if(hr < 0)    {      
  4.     CString cstr = db.GetErrorsMessage();       
  5.    char* str = new char[cstr.GetLength()+1];        sprintf(str, "%S", cstr);     
  6.      FAIL(str);      
  7.     delete str;     
  8.  }        
  9.   CString sqlStr;      
  10. sqlStr.Format(L"SELECT * FROM T1");     
  11.  hr = db.ExecuteReader(sqlStr);      
  12. if(hr < 0)    {         
  13.  CString cstr = db.GetErrorsMessage();       
  14.    char* str = new char[cstr.GetLength()+1];        sprintf(str, "%S", cstr);       
  15.    FAIL(str);       
  16.    delete str;     
  17.  }          
  18. while(!db.IsEndOfRecordSet())     
  19.  {         
  20.  wprintf(L"F1=[%d], F2=[%s], F3=[%s]\n", db.GetRowInt(1), db.GetRowStr(2), db.GetRowStr(3));     
  21.      db.MoveNext();   
  22.    }      
  23. db.CloseReader();    
  24.   db.Close(); 

上面演示整個讀取過程。

Unit Test

項目開發中使用了TDD,關于Unit Test可以參考Wince和Windows Mobile下native C++的單元測試 和 Windows Mobile下使用CppUnitLite輸出測試結果 。

TO-DO-LIST

**Support to open the database with password

**Support to specify the Open Mode

**Support to load Ole Db without COM registry.

**Support Transactions

**Support Parameters

原文標題:Windows Mobile下Native C++訪問SqlCe的封裝

鏈接:http://www.cnblogs.com/procoder/archive/2009/09/09/1562947.html

【編輯推薦】

  1. C++之運算符重載,輸入輸出流詳細介紹
  2. C++、Java與C#的命名規范總結
  3. C++類成員函數的重載、覆蓋與隱藏
  4. Eclipse下C/C++環境搭建
  5. Java與C++語言在作用域上的差異淺析
責任編輯:彭凡 來源: 博客園
相關推薦

2009-09-25 11:04:07

C++動態加載DLL

2024-01-18 11:22:41

C++Windows開發

2010-01-13 18:44:03

C++編譯

2010-01-13 14:18:52

Windows Emb

2010-01-25 13:43:09

C++算術編碼

2010-01-22 14:28:24

使用C++

2010-01-26 15:51:06

C++變量

2015-07-07 11:03:15

Java C++JavaCPP

2010-01-26 11:06:50

C++開發

2009-02-19 15:40:00

Linux不同網段訪問

2024-05-06 11:19:20

內存池計算機編程

2010-01-19 09:19:02

C++封裝

2011-08-25 10:37:15

leveldb的訪問封C#客戶端源碼

2011-08-25 10:13:32

對leveldb的訪問LLServer編譯安

2021-09-13 09:21:51

InjectorWindows內存注入

2010-01-18 10:01:48

C++中訪問控制

2010-01-19 10:04:30

C++類

2009-04-10 08:58:47

Windows Mob微軟移動OS

2009-06-30 10:48:49

WinCEWindows Mob

2019-06-25 09:40:59

Windows 10Mobile HotsWindows
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲免费在线 | 在线视频亚洲 | www.色.com| 国产成人精品久久二区二区91 | 欧美成人在线影院 | 天堂中文字幕av | 国产精品福利视频 | caoporon| 精品视频在线观看 | 久久久久久久综合色一本 | 人人干人人舔 | 亚洲免费视频在线观看 | 亚州精品天堂中文字幕 | 日本在线看| 欧美激情黄色 | 亚洲成人午夜电影 | 免费一区 | 欧美日韩国产一区二区三区 | 久久不卡| 日本一区精品 | 亚洲 欧美 激情 另类 校园 | 国产精品二区三区在线观看 | 91婷婷韩国欧美一区二区 | 色婷婷av久久久久久久 | 精品久久久久久国产 | 精品麻豆剧传媒av国产九九九 | 中文字幕国产视频 | 国产免费视频 | 欧美一级二级在线观看 | 在线国产小视频 | 亚洲一区免费在线 | 久久久久久国产精品免费 | 羞羞视频网站免费观看 | 在线看亚洲 | 黄色a三级 | 国产成人精品区一区二区不卡 | 一区二区三区中文字幕 | 日韩在线观看中文字幕 | 欧美精品网| 欧美一区不卡 | 中文字幕爱爱视频 |