精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何實現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++變量

2010-01-26 11:06:50

C++開發

2015-07-07 11:03:15

Java C++JavaCPP

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內存注入

2025-10-20 04:22:00

2010-01-19 10:04:30

C++類

2010-01-18 10:01:48

C++中訪問控制

2009-06-05 14:54:09

EclipseC++環境搭建

2009-04-10 08:58:47

Windows Mob微軟移動OS
點贊
收藏

51CTO技術棧公眾號

在线观看电影av| 一级做a爰片久久毛片| 国产美女视频一区二区| 午夜一区二区三区视频| 日韩国产欧美精品| 国产成人a人亚洲精品无码| 99国产精品视频免费观看一公开| 亚洲视频在线免费观看| 色综合久久久无码中文字幕波多| 奇米777日韩| 一卡二卡三卡日韩欧美| 日韩一区二区电影在线观看| www.av日韩| 美女网站色91| 国产91精品青草社区| 欧美日韩精品亚洲精品| 成人看的视频| 日韩激情视频在线| 两女双腿交缠激烈磨豆腐 | 久久亚洲精品毛片| 精品无码一区二区三区| 9l亚洲国产成人精品一区二三| 91激情五月电影| 男女视频网站在线观看| 亚洲婷婷噜噜| 亚洲女同女同女同女同女同69| 欧美污视频久久久| 四虎永久在线观看| 国产成人免费在线视频| 成人美女av在线直播| 免费精品一区二区| 先锋影音国产一区| 久久久女人电视剧免费播放下载 | 91综合网人人| 亚洲偷熟乱区亚洲香蕉av| 视频免费在线观看| jizz性欧美2| 日韩欧美二区三区| 国产一级片中文字幕| 黄色日韩网站| 欧美日韩高清影院| 一路向西2在线观看| 性欧美freehd18| 色欧美88888久久久久久影院| 天堂…中文在线最新版在线| 国产后进白嫩翘臀在线观看视频| 亚洲精品成人天堂一二三| 一区二区三区一级片| 3p视频在线观看| 国产精品青草久久| 影音先锋欧美资源| 国产在线观看a| 国产清纯美女被跳蛋高潮一区二区久久w | 色先锋资源久久综合5566| 亚洲av无码一区二区三区人 | 国产欧美一区二区在线观看| 日韩精品久久久| 成人高潮成人免费观看| 国产精品久久久久久久久果冻传媒 | 黄色av成人| 91精品国产一区| 综合激情网五月| 久久久噜噜噜久久狠狠50岁| 国产成人精品在线| 中国老头性行为xxxx| 精品一区二区免费看| 成人在线精品视频| 亚洲AV无码精品国产| 暴力调教一区二区三区| 久久婷婷国产综合尤物精品| 国产视频福利在线| 中文字幕亚洲欧美在线不卡| 亚洲国产一二三精品无码| 国产偷倩在线播放| 色综合咪咪久久| 不卡的av中文字幕| 欧州一区二区三区| 亚洲国产免费av| 欧美人妻一区二区三区| 伊人情人综合网| 欧美一级电影免费在线观看| 中国一级特黄视频| 国产91在线观看丝袜| 欧美日韩国产免费一区二区三区 | 国产精品扒开腿做| 999精品国产| 99国产精品一区| 亚欧精品在线| xxxx成人| 555www色欧美视频| jjzz黄色片| 成人影视亚洲图片在线| 欧美精品999| 亚洲欧美日韩激情| 国产黄色成人av| 欧美亚洲精品日韩| 污片视频在线免费观看| 一本色道久久加勒比精品| 992kp免费看片| 欧美a一欧美| 久久亚洲国产精品| 一级黄色在线观看| 国产91色综合久久免费分享| 日韩午夜视频在线观看| 1234区中文字幕在线观看| 欧美在线你懂的| 亚洲激情 欧美| 久久精品青草| 国产脚交av在线一区二区| 亚洲国产成人精品一区二区三区| 国产欧美日韩不卡免费| 日韩av综合在线观看| 蜜桃精品视频| 日韩中文字幕在线播放| 日本中文字幕久久| 99久久婷婷国产| 日本阿v视频在线观看| 亚洲香蕉久久| 中日韩午夜理伦电影免费| 91视频免费网址| 成人自拍视频在线| 久久99国产精品一区| 国产成人午夜性a一级毛片| 精品一区二区三区电影| 国产第100页| 国产精品1区2区3区| 在线观看成人av电影| 日本欧美韩国| 亚洲天堂视频在线观看| 在线观看免费国产视频| 成人免费视频app| 国产青草视频在线观看| 免费一级欧美在线大片| 久久久精品电影| 亚洲天堂视频在线| 国产精品美女久久久久av爽李琼| 欧美激情精品久久久久久小说| 国产精品99久久免费观看| 欧美激情a∨在线视频播放| 国产三级第一页| 亚洲靠逼com| aaaaaaaa毛片| 欧美深夜福利| 国产欧美亚洲日本| av中文字幕在线看| 亚洲黄色有码视频| 男人的天堂一区二区| 91香蕉视频污| 黄色片久久久久| 狠狠操综合网| 国产精品日韩一区| 日韩在线资源| 欧美一区二区三区不卡| 欧美色图亚洲视频| 国产.欧美.日韩| 福利视频一二区| 无码日韩精品一区二区免费| 欧美野外猛男的大粗鳮| 国产黄在线观看免费观看不卡| 欧美中文字幕一区二区三区| 网爆门在线观看| 国产精品99精品久久免费| 国产av熟女一区二区三区 | 日韩亚洲欧美精品| 成人污版视频| 久久人人爽人人爽人人片av高请 | 日韩av片电影专区| 成人全视频高清免费观看| 欧美日韩精品是欧美日韩精品| 日本一级片免费| 丰满岳乱妇一区二区三区| 免费看国产一级片| 日韩久久久久| 超碰97在线资源| 成人动漫一区| www.色综合| 天堂在线资源网| 欧美在线色视频| 九九免费精品视频| 91麻豆国产香蕉久久精品| 亚洲xxxx2d动漫1| 欧美a级在线| 欧美日韩一区二区三区在线视频| 日韩毛片免费视频一级特黄| 久久久久国产一区二区三区| 黄网站在线观看| 日韩一级二级三级精品视频| 国产农村妇女aaaaa视频| 国产精品久久久久一区| 少妇激情一区二区三区视频| 男人操女人的视频在线观看欧美| www.69av| 手机在线电影一区| 好看的日韩精品| 成人av在线播放| 日本久久久久久久| 国产精品—色呦呦| 久久久极品av| 电影av一区| 亚洲国产成人精品女人久久久 | 国产精品h视频| 蜜桃一区二区| 成人av电影免费| 韩国精品视频在线观看| 欧美尤物巨大精品爽| 日韩精品卡一| 最新国产精品亚洲| 你懂的在线播放| 欧美变态tickle挠乳网站| 中文字幕第31页| 日韩欧美中文字幕在线播放| 欧美片一区二区| 国产精品电影一区二区| 谁有免费的黄色网址| 波多野结衣中文一区| 五月天六月丁香| 美女视频一区二区三区| 日韩 欧美 高清| 午夜亚洲性色福利视频| www.亚洲成人网| 91精品国产自产在线观看永久∴| 免费成人深夜夜行视频| 欧美wwwsss9999| 风间由美久久久| 久久久久久久久成人| 91久久国产精品| 国产成人福利夜色影视| 国产精品高潮粉嫩av| 北岛玲heyzo一区二区| 国语自产在线不卡| 男人添女人下部高潮视频在线观看 | 国产精品免费区二区三区观看 | 亚洲成人激情社区| 欧美性视频在线| 成人影院大全| 日本高清久久天堂| 免费成人直播| 国产91色在线播放| 91大神在线观看线路一区| 国产精品99免视看9| 亚洲日本在线观看视频| 国产精品美女主播| 五月天色综合| 成人免费在线视频网址| 二区三区精品| 99中文字幕| 风间由美一区二区av101| 国产欧美日韩一区| 亚洲成人一品| 日本一区网站| 91视频久久| 高清无码视频直接看| 亚洲电影在线| 欧美黄色一级片视频| 日韩精品久久理论片| 一区二区三区视频网| 精品一区二区三区免费视频| 在线观看视频你懂得| 欧美日韩性生活视频| 香蕉久久久久久av成人| 国产成人自拍在线| youjizz.com国产| 91视频xxxx| 九九九视频在线观看| 国产精品国产精品国产专区不片| 99久久精品久久亚洲精品| 亚洲精品久久久久久国产精华液| 国产亚洲精品久久久久久打不开| 亚洲午夜精品在线| 天天操夜夜操视频| 欧美日韩在线播| 国产极品久久久| 亚洲精品国产电影| 91se在线| 久久久亚洲国产天美传媒修理工| 三上悠亚一区二区| 91在线中文字幕| 首页亚洲中字| 在线无限看免费粉色视频| 亚洲视频免费| 亚洲精品久久久中文字幕| 国产成人免费xxxxxxxx| 国精产品一区一区三区免费视频| 国产精品视频一二| 九九九国产视频| 欧美日韩国产综合草草| 天堂av2024| 日韩在线视频中文字幕| a'aaa级片在线观看| 国产精品男人的天堂| 国产在线播放精品| 一区二区三区四区欧美| 国产欧美日韩一级| 天堂av2020| 国产亚洲短视频| 亚洲国产综合久久| 欧美区在线观看| 欧美成人综合在线| 久久97精品久久久久久久不卡| 成人影院入口| 国产在线精品一区| 亚洲精品成人影院| 午夜激情福利在线| fc2成人免费人成在线观看播放 | 综合久久久久久| 欧产日产国产69| 精品第一国产综合精品aⅴ| 老司机福利在线视频| 国产成人福利网站| 欧美调教在线| 久久这里只有精品18| 精品一区二区免费视频| 午夜在线观看一区| 欧美日韩性生活视频| 秋霞av鲁丝片一区二区| 欧美精品一区在线播放| 91精品国产色综合久久不卡粉嫩| 日本午夜精品电影| 久久福利精品| 黄色短视频在线观看| 亚洲国产日韩在线一区模特| 国产理论片在线观看| 最新中文字幕亚洲| 久久久久毛片| 香蕉久久免费影视| 日韩成人av影视| 久久美女免费视频| 色噜噜久久综合| 激情视频在线观看免费| 日韩av片永久免费网站| 欧美黄色影院| 国产精品999视频| 不卡视频一二三| 国产午夜精品无码一区二区| 精品久久久久一区| 黄色成人在线网| 国产伦精品一区二区三区免| 精品二区视频| 污片免费在线观看| 精品毛片三在线观看| 色视频在线观看免费| 5566成人精品视频免费| 视频一区在线观看| 欧美日韩亚洲一二三| 国产夜色精品一区二区av| 欧美男人天堂网| 中文字幕日韩欧美在线| 欧美性www| www成人免费| 成人精品国产福利| 永久免费无码av网站在线观看| 亚洲欧美日韩图片| 国产激情久久| av电影一区二区三区| 国产不卡在线视频| 日韩av一二三区| 亚洲欧美成人精品| 久久女人天堂| 日韩中文字幕在线不卡| 本田岬高潮一区二区三区| 天天操夜夜操视频| 日韩专区在线播放| 4438全国亚洲精品观看视频| 青青草精品视频在线| 91蜜桃婷婷狠狠久久综合9色| 五月婷婷六月婷婷| 久久资源免费视频| 国产主播性色av福利精品一区| 欧美成人免费高清视频| 中文字幕在线一区| 亚洲乱色熟女一区二区三区| 91福利视频在线观看| 色狮一区二区三区四区视频| 欧洲成人午夜精品无码区久久| 欧美日韩亚洲激情| 日韩免费啪啪| 国产精品对白刺激久久久| 久久综合影视| 少妇aaaaa| 亚洲深夜福利在线| 精品视频在线观看免费观看| 丰满少妇被猛烈进入高清播放| 国产精品国产成人国产三级 | 成人性生活视频免费看| 国产日韩欧美制服另类| 亚洲成人第一区| 国产精品福利在线| 亚洲三级电影在线观看| 国产精品视频在| 日韩成人黄色av| 精品99re| 9l视频白拍9色9l视频| 图片区小说区区亚洲影院| 午夜视频成人| 久久青青草综合| 国产91富婆露脸刺激对白| 国产成人精品一区二区色戒| 高清欧美电影在线| 欧美成人午夜| 人成免费在线视频|