小7的大店铺【淘宝店】 游戏引擎剖析-全篇 公积金相关帖子汇总 魅族M8SDK学习系列不断更新中

[WinCE] ADO数据库编程(WinCE)[转]

[ 745 查看 / 0 回复 ]

与C++中ADO数据库编程一样,WinCE中ADO数据库操作也需要_Connection和_Recordset指针,在此我们将其封装以求更方便,注:WinCE系统必须支持数据库的ADO操作。具体代码如下所示:
//VOConnection.h
  1. #if !defined(AFX_VOCONNECTION_H__EE2E886A_8A8A_4CC8_9A48_28681F64544B__INCLUDED_)
  2. #define AFX_VOCONNECTION_H__EE2E886A_8A8A_4CC8_9A48_28681F64544B__INCLUDED_
  3.                 #if _MSC_VER > 1000
  4. #pragma once
  5. #endif // _MSC_VER > 1000
  6.                 #include <COMDEF.H>
  7. #include <ADOCE30.H>
  8. #include "VOString.h"
  9.                 class CVOConnection 
  10. {
  11. public:
  12. CVOConnection(LPCTSTR pcszProvider = NULL);
  13. virtual ~CVOConnection();
  14.                 BOOL Execute(LPCTSTR pcszSQL);
  15. BOOL Initialize();
  16. LPCTSTR GetProvider() { return m_strProvider; }
  17.                 operator _Connection*() { return m_Conn; }
  18.                 void SetConnectDB(LPCTSTR lpszDBName);
  19. void ClearConnect();

  20. protected:
  21. CVOString m_strProvider;
  22. static TCHAR*  g_ProgID;
  23. static CLSID  g_ClsID;
  24. static BOOL  g_Init;
  25.                 _Connection*  m_Conn;
  26. };
  27.                 #endif // !defined(AFX_VOCONNECTION_H__EE2E886A_8A8A_4CC8_9A48_28681F64544B__INCLUDED_)

  28. //VOConnection.cpp
  29. #include "stdafx.h"
  30. #include <COMDEF.H>
  31. #include <ADOCE30.H>
  32. #include "VOConnection.h"
  33. #include "VORecordset.h"
  34.                 #ifdef _DEBUG
  35. #undef THIS_FILE
  36. static char THIS_FILE[]=__FILE__;
  37. #define new DEBUG_NEW
  38. #endif
  39.                 const IID IID__Connection = { 0x113033de, 0xf682, 0x11d2, { 0xbb, 0x62, 0x00, 0xc0, 0x4f, 0x68, 0x0a, 0xcc}};
  40.                 void __stdcall _com_issue_error(HRESULT m_hr)
  41. {
  42. TCHAR pcszError[1024];
  43.                 _stprintf(pcszError, TEXT("_com_issue_error(%ld)\n"), m_hr);
  44. OutputDebugString(pcszError);
  45. }
  46.                 BOOL CVOConnection::g_Init = FALSE;
  47. CLSID CVOConnection::g_ClsID;
  48. TCHAR* CVOConnection::g_ProgID = TEXT("ADOCE.Connection.3.0");
  49.                 //////////////////////////////////////////////////////////////////////
  50. // Construction/Destruction
  51. //////////////////////////////////////////////////////////////////////
  52.                 extern CVOConnection m_Conn;
  53.                 CVOConnection::CVOConnection(LPCTSTR pcszProvider) : m_Conn(NULL)
  54. {

  55. if(!g_Init)
  56.   Initialize();

  57. HRESULT hr;
  58.                 if(pcszProvider == NULL)
  59. {
  60. // pcszProvider = TEXT("cedb");
  61.                   hr = CoCreateInstance(g_ClsID, NULL, CLSCTX_INPROC_SERVER, IID__Connection, (LPVOID*) &m_Conn);
  62. //  hr = m_Conn->put_Provider((LPTSTR)pcszProvider);
  63.   hr = m_Conn->Open(TEXT("Disk\\tiger.mdb"),TEXT(""),TEXT(""),adOpenUnspecified);
  64. }
  65. else
  66. {
  67.   m_strProvider = pcszProvider;
  68.   m_Conn = NULL;
  69. }
  70. }
  71.                 CVOConnection::~CVOConnection()
  72. {
  73. if(m_Conn)
  74. {
  75.   m_Conn->Close();
  76.   m_Conn->Release();
  77. }
  78. }
  79.                 BOOL CVOConnection::Initialize()
  80. {
  81. if(FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED)))
  82.   return FALSE;

  83. HRESULT hr;
  84.                 hr = CLSIDFromProgID(g_ProgID, &g_ClsID);
  85.                 if(FAILED(hr))
  86.   return FALSE;
  87.                 return TRUE;
  88. }
  89.                 BOOL CVOConnection::Execute(LPCTSTR pcszSQL)
  90. {
  91. CVORecordset rs(*this);
  92.                 return rs.Open(pcszSQL, adOpenForwardOnly, adLockPessimistic);
  93. }
  94.                 void CVOConnection::SetConnectDB(LPCTSTR lpszDBName)
  95. {
  96. if( m_Conn )
  97. {
  98.   m_Conn->Close();
  99.   m_Conn->put_Provider((LPTSTR)(TEXT("cedb")));
  100.   m_Conn->Open((LPTSTR)lpszDBName,TEXT(""),TEXT(""),adOpenUnspecified);
  101.   m_strProvider = lpszDBName;
  102. }
  103. }
  104.                 void CVOConnection::ClearConnect()
  105. {
  106. if( m_Conn )
  107. {
  108.   m_Conn->Close();
  109.   m_Conn->put_Provider((LPTSTR)(TEXT("cedb")));
  110.   m_Conn->Open(TEXT(""),TEXT(""),TEXT(""),adOpenUnspecified);
  111.   m_strProvider = TEXT("");
  112. }
  113. }

  114. //VORecordset.h
  115. #if !defined(AFX_VORECORDSET_H__B81BD14E_98F0_42A7_A64F_3FA21F5A3E5D__INCLUDED_)
  116. #define AFX_VORECORDSET_H__B81BD14E_98F0_42A7_A64F_3FA21F5A3E5D__INCLUDED_
  117.                 #if _MSC_VER > 1000
  118. #pragma once
  119. #endif // _MSC_VER > 1000
  120.                 #include <COMDEF.H>
  121. #include <ADOCE30.H>
  122. #include "VOConnection.h"
  123.                
  124.                                
  125. class CVORecordset 
  126. {
  127.                 public:
  128. CVORecordset(CVOConnection& rConn);
  129. virtual ~CVORecordset();
  130.                 public:

  131. LPCTSTR GetFieldValueString(int iField);
  132. VARIANT GetFieldValue(int iField);
  133. LPCTSTR GetFieldName(int iField);
  134. Field* GetField(int iField);
  135. long GetFieldCount() { return m_FldCnt; }
  136.                 BOOL MoveNext();
  137. BOOL MoveFirst();
  138. BOOL IsEOF();
  139. BOOL IsBOF();
  140. BOOL Close();
  141. // BOOL Open(LPCTSTR);
  142. BOOL Open(LPCTSTR pcszSource, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType);
  143. BOOL Initialize();
  144. BOOL IsOpen()  { return m_fIsOpen; }
  145. operator _Recordset*() { return m_rs; }
  146.                 protected:
  147. BOOL m_fIsOpen;
  148. CVOConnection&  m_rConn;
  149. _Recordset*  m_rs;
  150. Fields*    m_Fields;
  151. Field*    m_Field;
  152. long    m_FldCnt;
  153.                 static TCHAR*  g_ProgID;
  154. static CLSID  g_ClsID;
  155. static BOOL  g_Init;
  156. };
  157. #endif // !defined(AFX_VORECORDSET_H__B81BD14E_98F0_42A7_A64F_3FA21F5A3E5D__INCLUDED_)

  158. //VORecordset.cpp
  159. #include "stdafx.h"
  160. #include "VORecordset.h"
  161.                 #ifdef _DEBUG
  162. #undef THIS_FILE
  163. static char THIS_FILE[]=__FILE__;
  164. #define new DEBUG_NEW
  165. #endif
  166.                 const IID IID__Recordset = { 0x113033f6, 0xf682, 0x11d2, { 0xbb, 0x62, 0x00, 0xc0, 0x4f, 0x68, 0x0a, 0xcc}};
  167.                 //////////////////////////////////////////////////////////////////////
  168. // Construction/Destruction
  169. //////////////////////////////////////////////////////////////////////
  170.                 BOOL CVORecordset::g_Init = FALSE;
  171. CLSID CVORecordset::g_ClsID;
  172. TCHAR* CVORecordset::g_ProgID = TEXT("ADOCE.Recordset.3.0");
  173.                 CVORecordset::CVORecordset(CVOConnection& rConn) : m_rConn(rConn), m_rs(NULL)
  174. {
  175. if(!g_Init)
  176.   Initialize();
  177.                 HRESULT hr;
  178.                 hr = CoCreateInstance(g_ClsID, NULL, CLSCTX_INPROC_SERVER, IID__Recordset, (LPVOID*)&m_rs);
  179.                 VARIANT varConn;
  180.                 varConn.pdispVal = (_Connection*)m_rConn;
  181. varConn.vt = VT_DISPATCH;
  182. hr = m_rs->put_ActiveConnection(varConn);
  183. }
  184.                 CVORecordset::~CVORecordset()
  185. {
  186. Close();
  187. if(m_rs)
  188.   m_rs->Release();
  189. }
  190.                 BOOL CVORecordset::Initialize()
  191. {
  192. HRESULT hr;
  193.                 hr = CLSIDFromProgID( g_ProgID, &g_ClsID);
  194.                 return(!FAILED(hr));
  195. }
  196.                 BOOL CVORecordset::Open(LPCTSTR pcszSource, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType)
  197. {
  198. if(!m_rs)
  199. {
  200.   TRACE(TEXT("CVORecordset::Open() RecordSet COM Object not initialized\n"));
  201.   return FALSE;
  202. }
  203.                 HRESULT hr;
  204. m_rs->Close();
  205. hr = m_rs->Open(_variant_t(pcszSource), _variant_t( TEXT("Disk\\tiger.mdb") ), CursorType, LockType, adCmdUnknown);
  206. m_fIsOpen = (!FAILED(hr));
  207.                 m_rs->get_Fields(&m_Fields);
  208. m_Fields->get_Count(&m_FldCnt);
  209.                 return m_fIsOpen;
  210. }
  211.                 BOOL CVORecordset::Close()
  212. {
  213. if(!m_rs)
  214. {
  215.   TRACE(TEXT("CVORecordset::Close() RecordSet COM Object not initialized\n"));
  216.   return FALSE;
  217. }
  218.                 m_rs->Close();
  219.                 m_fIsOpen = FALSE;
  220. return TRUE;
  221. }
  222.                 BOOL CVORecordset::IsBOF()
  223. {
  224. if(!m_rs)
  225. {
  226.   TRACE(TEXT("CVORecordset::BOF() RecordSet COM Object not initialized\n"));
  227.   return FALSE;
  228. }
  229.                 VARIANT_BOOL fValue;
  230. HRESULT  hr = m_rs->get_BOF(&fValue);
  231.                 return (fValue == VARIANT_TRUE);
  232. }
  233.                 BOOL CVORecordset::IsEOF()
  234. {
  235. if(!m_rs)
  236. {
  237.   TRACE(TEXT("CVORecordset::EOF() RecordSet COM Object not initialized\n"));
  238.   return FALSE;
  239. }
  240.                 VARIANT_BOOL fValue;
  241. HRESULT  hr = m_rs->get_EOF(&fValue);
  242.                 return (fValue == VARIANT_TRUE);
  243. }
  244.                 BOOL CVORecordset::MoveFirst()
  245. {
  246. if(!m_rs)
  247. {
  248.   TRACE(TEXT("CVORecordset::MoveFirst() RecordSet COM Object not initialized\n"));
  249.   return FALSE;
  250. }
  251.                 HRESULT hr = m_rs->MoveFirst();
  252.                 return (!FAILED(hr));
  253. }
  254.                 BOOL CVORecordset::MoveNext()
  255. {
  256. if(!m_rs)
  257. {
  258.   TRACE(TEXT("CVORecordset::MoveNext() RecordSet COM Object not initialized\n"));
  259.   return FALSE;
  260. }
  261.                 HRESULT hr = m_rs->MoveNext();
  262.                 return (!FAILED(hr));
  263. }
  264.                 Field* CVORecordset::GetField(int iField)
  265. {
  266. if(!m_rs)
  267. {
  268.   TRACE(TEXT("CVORecordset::GetField() RecordSet COM Object not initialized\n"));
  269.   return NULL;
  270. }
  271.                 HRESULT hr = m_Fields->get_Item(_variant_t((long)iField), &m_Field);
  272.                 if(FAILED(hr))
  273.   return NULL;
  274.                 return m_Field;
  275. }
  276.                 LPCTSTR CVORecordset::GetFieldName(int iField)
  277. {
  278. Field* pField = GetField(iField);
  279.                 if(!pField)
  280. {
  281.   TRACE(TEXT("CVORecordset::GetFieldName() Invalid Field Index\n"));
  282.   return NULL;
  283. }
  284.                 BSTR strFieldName;
  285.                 pField->get_Name(&strFieldName);
  286.                 return strFieldName;
  287. }
  288.                 VARIANT CVORecordset::GetFieldValue(int iField)
  289. {
  290. VARIANT value;
  291. HRESULT hr;
  292.                 VariantInit(&value);
  293.                 Field* pField = GetField(iField);
  294.                 if(!pField)
  295. {
  296.   TRACE(TEXT("CVORecordset::GetFieldValue() Invalid Field Index\n"));
  297.   return _variant_t((long)0);
  298. }
  299.                 pField = GetField(iField);
  300. hr = pField->get_Value(&value);
  301.                 return value;
  302. }
  303.                 LPCTSTR CVORecordset::GetFieldValueString(int iField)
  304. {
  305. VARIANT value = GetFieldValue(iField);
  306. VARIANT valueString;
  307.                 VariantInit(&valueString);
  308.                 if(value.vt == VT_BSTR)
  309.   valueString = value;
  310. else
  311.   VariantChangeType(&valueString, &value, 0, VT_BSTR);
  312.                 return valueString.bstrVal;
  313. }

  314. //VOString.h
  315. #if !defined(AFX_VOSTRING_H__91406803_1D87_4DA9_A5A0_499A88AC4E86__INCLUDED_)
  316. #define AFX_VOSTRING_H__91406803_1D87_4DA9_A5A0_499A88AC4E86__INCLUDED_
  317.                 #if _MSC_VER > 1000
  318. #pragma once
  319. #endif // _MSC_VER > 1000
  320.                 class CVOString 
  321. {
  322. public:
  323. CVOString(const CVOString& rSrc);
  324. CVOString(LPCTSTR pcszValue = TEXT(""));
  325. virtual ~CVOString();
  326. operator LPCTSTR() { return (LPCTSTR)m_pBuffer; }
  327. DWORD GetLength() { return m_dwLength; }
  328. const CVOString& operator =(LPCTSTR pcszValue);
  329. BOOL operator == (LPCTSTR pcszValue);
  330. const CVOString& operator += (LPCTSTR pcszAppend);
  331. protected:
  332. BOOL SetMinBufferSize(DWORD dwChars);
  333. DWORD m_dwLength;
  334. DWORD m_dwBufferSize;
  335. TCHAR* m_pBuffer;
  336. };
  337.                 #endif // !defined(AFX_VOSTRING_H__91406803_1D87_4DA9_A5A0_499A88AC4E86__INCLUDED_)

  338. //VOString.cpp
  339. //#include "stdafx.h"
  340. #include "VOString.h"
  341.                 //////////////////////////////////////////////////////////////////////
  342. // Construction/Destruction
  343. //////////////////////////////////////////////////////////////////////
  344.                 CVOString::CVOString(LPCTSTR pcszValue)
  345. {
  346. m_pBuffer = NULL;
  347. m_dwBufferSize = 0;
  348.                 *this = pcszValue;
  349. }
  350.                 // Copy Constructor
  351. CVOString::CVOString(const CVOString &rSrc)
  352. {
  353. m_pBuffer = NULL;
  354. m_dwBufferSize = 0;
  355.                 *this = rSrc.m_pBuffer;
  356. }
  357.                 CVOString::~CVOString()
  358. {
  359. if(m_pBuffer)
  360.   delete m_pBuffer;
  361. }
  362.                 const CVOString& CVOString::operator = (LPCTSTR pcszValue)
  363. {
  364.                 m_dwLength = _tcslen(pcszValue);
  365.                 SetMinBufferSize(m_dwLength);
  366. _tcscpy(m_pBuffer, pcszValue);
  367. return *this;
  368. }
  369.                 BOOL CVOString::operator == (LPCTSTR pcszValue)
  370. {
  371. return(_tcscmp(pcszValue, m_pBuffer) == 0);
  372. }
  373.                 const CVOString& CVOString::operator += (LPCTSTR pcszAppend)
  374. {
  375. SetMinBufferSize(GetLength() + _tcslen(pcszAppend));
  376.                 _tcscat(m_pBuffer, pcszAppend);
  377. return *this;
  378. }
  379.                 BOOL CVOString::SetMinBufferSize(DWORD dwChars)
  380. {
  381. if(m_dwBufferSize < dwChars + 1)
  382. {
  383.   TCHAR* pNewBuffer;
  384.   DWORD dwNewBufferSize = dwChars + 256;
  385.                   pNewBuffer = new TCHAR[dwNewBufferSize];
  386.                   if(m_pBuffer)
  387.   {
  388.   memmove(pNewBuffer, m_pBuffer, m_dwBufferSize);
  389.   delete m_pBuffer;
  390.   }
  391.                   m_pBuffer = pNewBuffer;
  392.   m_dwBufferSize = dwNewBufferSize;
  393. }
  394.                 return TRUE;
  395. }
复制代码
转:http://www.cppblog.com/tiger/archive/2009/05/02/17454.html
分享 转发
相信与不相信都是矛盾的.  5207宣!
欢迎您来到迷你论坛
TOP