ADODataset.cpp
上传用户:maryhy001
上传日期:2007-05-02
资源大小:2317k
文件大小:16k
源码类别:

网格计算

开发平台:

Visual C++

  1. #include ".ADODataset.h"
  2. //Constructor and destructor.
  3. CADODataSet::CADODataSet()
  4. {
  5. //set the ADO Connection object is null.
  6. m_pADOConnection = NULL;
  7. //record set smart pointer
  8. m_pRecordset = NULL;
  9. //Empty the sql text.
  10. m_sSQLText.erase();
  11. //create the recordset object.
  12. HRESULT hr = this->m_pRecordset.CreateInstance("ADODB.Recordset");
  13. if( FAILED(hr) ){
  14. throw new CADOException("CADODataSet::CADODataSet", "Recordset CreateInstance Failed.");
  15. }
  16. else{
  17. this->m_pRecordset->CursorType = adOpenDynamic;
  18.         this->m_pRecordset->LockType = adLockPessimistic;
  19. }
  20. }
  21. CADODataSet::CADODataSet(_RecordsetPtr pRecordset)
  22. {
  23. //set the ADO Connection object is null.
  24. m_pADOConnection = NULL;
  25. //record set smart pointer
  26. m_pRecordset = pRecordset;
  27. //Empty the sql text.
  28. m_sSQLText.erase();
  29. }
  30. CADODataSet::~CADODataSet()
  31. {
  32. this->Close();
  33. //Empty the sql text.
  34. m_sSQLText.erase();
  35. }
  36. //-------------------------------------------------
  37. //Set / Get the dataset's connection object.
  38. void CADODataSet::SetConnection(CADOConnection &pADOConnection)
  39. {
  40. this->Close();
  41. this->m_pADOConnection = &pADOConnection;
  42. }
  43. CADOConnection &CADODataSet::GetConnection()
  44. {
  45. return (*this->m_pADOConnection);
  46. }
  47. //Open or close the dataset.
  48. bool CADODataSet::Open(LPCSTR lpszSQLText)
  49. {
  50. if( this->IsOpened() ) return true;
  51. if( _STREMPTY(lpszSQLText) ){
  52. throw new CADOException("CADODataSet::Open", "Dataset SQL Text cann't be empty.");
  53. }
  54. this->m_sSQLText = lpszSQLText;
  55. try{
  56. //open the recordset
  57. HRESULT hr = this->m_pRecordset->Open(lpszSQLText, 
  58. _variant_t((IDispatch *)m_pADOConnection->getConnectionPtr(), true),
  59. adOpenDynamic, adLockPessimistic, adCmdText);
  60. return SUCCEEDED(hr);
  61. /*
  62.  * this->m_pRecordset = this->m_pADOConnection->Execute(lpszSQLText);
  63.  * return ( NULL != this->m_pRecordset );
  64. */
  65. }
  66. catch(_com_error e){
  67. throw new CADOException("CADODataSet::Open", e.Description());
  68. }
  69. return false;
  70. }
  71. bool CADODataSet::Close()
  72. {
  73. if( this->IsOpened() ){
  74. try{
  75. this->m_pRecordset->Close();
  76. return true;
  77. }
  78. catch(_com_error e){
  79. throw new CADOException("CADODataSet::Close", e.Description());
  80. }
  81. }
  82. return false;
  83. }
  84. //-------------------------------------------------
  85. //get the dataset's state.
  86. bool CADODataSet::IsOpened()
  87. {
  88. if( NULL == this->m_pRecordset ){
  89. return false;
  90. }
  91. return (0 != m_pRecordset->State);
  92. }
  93. //determine the dataset cursor whether or not
  94. //arrival the begin(end) of the dataset.
  95. bool CADODataSet::IsBof()
  96. {
  97. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  98. throw new CADOException("CADODataSet::IsOpened", "Dataset is closed yet.");
  99. }
  100. return (m_pRecordset->ADOBOF == VARIANT_TRUE);
  101. }
  102. bool CADODataSet::IsEof()
  103. {
  104. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  105. throw new CADOException("CADODataSet::IsOpened", "Dataset is closed yet.");
  106. }
  107. return (this->m_pRecordset->ADOEOF == VARIANT_TRUE);
  108. }
  109. //determine the dataset whether is empty.
  110. bool CADODataSet::IsEmpty()
  111. {
  112. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  113. throw new CADOException("CADODataSet::IsEmpty", "Dataset is closed yet.");
  114. }
  115. return ( this->GetRecordCounts() != 0 );
  116. }
  117. //Cursor Location.
  118. void CADODataSet::Prior() //return the BOF flag.
  119. {
  120. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  121. throw new CADOException("CADODataSet::PriorGetRecordCounts", "Dataset is closed yet.");
  122. }
  123. try{
  124. this->m_pRecordset->MovePrevious();
  125. }
  126. catch (_com_error e) {
  127. throw new CADOException("CADODataSet::Prior", e.Description());
  128. }
  129. }
  130. void CADODataSet::Next() //return the EOF flag.
  131. {
  132. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  133. throw new CADOException("CADODataSet::Next", "Dataset is closed yet.");
  134. }
  135. try{
  136. this->m_pRecordset->MoveNext();
  137. }
  138. catch (_com_error e) {
  139. throw new CADOException("CADODataSet::Next", e.Description());
  140. }
  141. }
  142. void CADODataSet::First() //move the cursor to the begin.
  143. {
  144. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  145. throw new CADOException("CADODataSet::First", "Dataset is closed yet.");
  146. }
  147. try{
  148. this->m_pRecordset->MoveFirst();
  149. }
  150. catch (_com_error e) {
  151. throw new CADOException("CADODataSet::First", e.Description());
  152. }
  153. }
  154. void CADODataSet::Last() //move the cursor to the end.
  155. {
  156. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  157. throw new CADOException("CADODataSet::Last", "Dataset is closed yet.");
  158. }
  159. try{
  160. this->m_pRecordset->MoveLast();
  161. }
  162. catch (_com_error e) {
  163. throw new CADOException("CADODataSet::Last", e.Description());
  164. }
  165. }
  166. //Get the dataset's informations.
  167. LONG CADODataSet::GetRecordCounts()
  168. {
  169. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  170. throw new CADOException("CADODataSet::GetRecordCounts", "Dataset is closed yet.");
  171. }
  172. return this->m_pRecordset->RecordCount;
  173. }
  174. //Get the dataset's fields object.
  175. CFields CADODataSet::Fields()
  176. {
  177. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  178. throw new CADOException("CADODataSet::Fields", "Dataset is closed yet.");
  179. }
  180. FieldsPtr pFldsPtr = m_pRecordset->GetFields();
  181. if( pFldsPtr ){
  182. CFields Fields(pFldsPtr);
  183. return Fields;
  184. }
  185. return NULL;
  186. }
  187. //Get the dataset edit mode.
  188. /*
  189.  * adEditNone  = 0,
  190.  * adEditInProgress = 1,
  191.  * adEditAdd  = 2,
  192.  * adEditDelete  = 4
  193.  */
  194. EditModeEnum CADODataSet::GetEditMode()
  195. {
  196. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  197. throw new CADOException("CADODataSet::GetEditMode", "Dataset is closed yet.");
  198. }
  199. return this->m_pRecordset->EditMode;
  200. }
  201. //Insert / Edit / Delete / Update.
  202. void CADODataSet::Edit()
  203. {
  204. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  205. throw new CADOException("CADODataSet::Edit", "Dataset is closed yet.");
  206. }
  207. }
  208. void CADODataSet::Insert()
  209. {
  210. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  211. throw new CADOException("CADODataSet::Insert", "Dataset is closed yet.");
  212. }
  213. try{
  214. this->m_pRecordset->AddNew();
  215. }
  216. catch(_com_error e){
  217. throw new CADOException("CADODataSet::Insert", e.Description());
  218. }
  219. }
  220. void CADODataSet::Delete()
  221. {
  222. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  223. throw new CADOException("CADODataSet::Delete", "Dataset is closed yet.");
  224. }
  225. try{
  226. this->m_pRecordset->Delete(adAffectCurrent);
  227. }
  228. catch(_com_error e){
  229. throw new CADOException("CADODataSet::Delete", e.Description());
  230. }
  231. }
  232. void CADODataSet::Update()
  233. {
  234. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  235. throw new CADOException("CADODataSet::Update", "Dataset is closed yet.");
  236. }
  237. try{
  238. this->m_pRecordset->Update();
  239. }
  240. catch(_com_error e){
  241. this->m_pRecordset->CancelUpdate();
  242. throw new CADOException("CADODataSet::Update", e.Description());
  243. }
  244. }
  245. //Storage COM support
  246. bool CADODataSet::SaveToXMLFile(LPCSTR szfile)
  247. {
  248. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  249. throw new CADOException("CADODataSet::SaveToXMLFile", "Dataset is closed yet.");
  250. }
  251. try{
  252. _variant_t V(szfile);
  253. HRESULT hr = this->m_pRecordset->Save(V, adPersistXML);
  254. if(FAILED(hr)){
  255. return false;
  256. }
  257. return true;
  258. }
  259. catch(_com_error e){
  260. throw new CADOException("CADODataSet::SaveToXMLFile", e.Description());
  261. }
  262. }
  263. bool CADODataSet::SaveToXMLStream(_StreamPtr &pstream)
  264. {
  265. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  266. throw new CADOException("CADODataSet::SaveToXMLStream", "Dataset is closed yet.");
  267. }
  268. try{
  269. if(NULL == pstream){
  270. pstream.CreateInstance(__uuidof(Stream));
  271. }
  272. HRESULT hr = this->m_pRecordset->Save(pstream.GetInterfacePtr(), adPersistXML);
  273. if(FAILED(hr)){
  274. return false;
  275. }
  276. return true;
  277. }
  278. catch(_com_error e){
  279. throw new CADOException("CADODataSet::SaveToXMLStream", e.Description());
  280. }
  281. }
  282. //Warning::Here has some bugs!!!.
  283. bool CADODataSet::SaveToBuffer(char **buffer, LONG &size)
  284. {
  285. if( NULL == this->m_pRecordset || !this->IsOpened() ){
  286. throw new CADOException("CADODataSet::SaveToBuffer", "Dataset is closed yet.");
  287. }
  288. assert(NULL != buffer);
  289. _StreamPtr pstream = NULL;
  290. if(this->SaveToXMLStream(pstream)){
  291. size = pstream->Size;
  292. if(NULL != *buffer){
  293. delete [](*buffer);
  294. }
  295. *buffer = new char[size+1];
  296. memset(*buffer, 0x0, size+1);
  297. memcpy(*buffer, (char*)(pstream->ReadText(size)), size);
  298. char *pend = strrchr(*buffer, '>');
  299. assert(NULL != pend);
  300. size = pend - *buffer + 1;
  301. memset(pend+1, 0x0, pstream->Size-size);
  302. pstream->Close();
  303. return true;
  304. }
  305. return false;
  306. }
  307. //Load from XML file or Stream object.
  308. bool CADODataSet::LoadFromXMLFile(LPCSTR szfile)
  309. {
  310. if( NULL == this->m_pRecordset ){
  311. throw new CADOException("CADODataSet::LoadFromXMLFile", "Dataset instance isn't created yet.");
  312. }
  313. if(this->IsOpened()){
  314. this->Close();
  315. }
  316. try{
  317. HRESULT hr = this->m_pRecordset->Open(szfile, "Provider=MSPersist;", 
  318. adOpenUnspecified, adLockReadOnly, adCmdFile);
  319. return !FAILED(hr);
  320. }
  321. catch(_com_error e){
  322. throw new CADOException("CADODataSet::LoadFromXMLFile", e.Description());
  323. }
  324. }
  325. bool CADODataSet::LoadFromXMLStream(_StreamPtr &pstream)
  326. {
  327. if( NULL == this->m_pRecordset ){
  328. throw new CADOException("CADODataSet::LoadFromXMLFile", "Dataset instance isn't created yet.");
  329. }
  330. assert(NULL != pstream);
  331. if(this->IsOpened()){
  332. this->Close();
  333. }
  334. try{
  335. pstream->Position = 0;
  336. HRESULT hr = this->m_pRecordset->Open(pstream.GetInterfacePtr(),
  337. vtMissing, adOpenUnspecified, adLockReadOnly, adCmdFile);
  338. return !FAILED(hr);
  339. }
  340. catch(_com_error e){
  341. throw new CADOException("CADODataSet::LoadFromXMLStream", e.Description());
  342. }
  343. }
  344. /********************************************************
  345.  *  Class Name : CFields. *
  346.  * Purpose : Dataset Field SubAggregate Class; *
  347.  *   FieldPtr encapsulation class. *
  348.  *  File  Name : ADODataSet.h / ADODataSet.cpp. *
  349.  *------------------------------------------------------*
  350.  * Author : Devia Lee. Date: 2004-04-02 *
  351.  ********************************************************/
  352. //constructor or destructor procedure
  353. CField::CField()
  354. {
  355. m_spField = NULL;
  356. }
  357. CField::CField(FieldPtr &fldPtr)
  358. {
  359. m_spField = fldPtr;
  360. }
  361. CField::~CField()
  362. {
  363. if(NULL != m_spField){
  364. m_spField->Release();
  365. }
  366. }
  367. //get fieldPtr smart pointer
  368. FieldPtr CField::getSmartPtr()
  369. {
  370. return this->m_spField;
  371. }
  372. //operator "=" procedure
  373. CField& CField::operator=(CField &fldObj)
  374. {
  375. if(NULL != this->m_spField){
  376. this->m_spField.Release();
  377. }
  378. this->m_spField = fldObj.getSmartPtr();
  379. return (*this);
  380. }
  381. //operator "=" procedure
  382. CField& CField::operator=(FieldPtr fldPtr)
  383. {
  384. if(NULL != this->m_spField){
  385. this->m_spField.Release();
  386. }
  387. this->m_spField = fldPtr;
  388. return (*this);
  389. }
  390. //get the field type
  391. DataTypeEnum CField::getType()
  392. {
  393. try{
  394. DataTypeEnum dtDataType;
  395. m_spField->get_Type(&dtDataType);
  396. return dtDataType;
  397. }
  398. catch(_com_error e){
  399. throw new CADOException("CField::getType()", e.Description());
  400. }
  401. }
  402. //get the field define size
  403. long CField::getDefineSize()
  404. {
  405. try{
  406. return m_spField->DefinedSize;
  407. }
  408. catch(_com_error e){
  409. throw new CADOException("CField::getDefineSize()", e.Description());
  410. }
  411. }
  412. //get the field actual size
  413. long CField::getActualSize()
  414. {
  415. try{
  416. return m_spField->ActualSize;
  417. }
  418. catch(_com_error e){
  419. throw new CADOException("CField::getActualSize()", e.Description());
  420. }
  421. }
  422. //get the field name
  423. string CField::getName()
  424. {
  425. return static_cast<string>(m_spField->Name);
  426. }
  427. //get the field value(CeFtpVariant)
  428. CVariantEx CField::getValue()
  429. {
  430. CVariantEx varObj;
  431. varObj = this->m_spField->Value;
  432. return varObj;
  433. }
  434. //set the field value.
  435. void CField::setValue(CVariantEx var)
  436. {
  437. this->m_spField->put_Value( var.get_variant_t() );
  438. }
  439. //determine the field whether is null
  440. bool CField::IsNull()
  441. {
  442. try{
  443. _variant_t val;
  444. val = m_spField->Value;
  445. return (val.vt == VT_NULL);
  446. }
  447. catch(_com_error e){
  448. throw new CADOException("CField::IsNull()", e.Description());
  449. }
  450. }
  451. /********************************************************
  452.  *  Class Name : CBlobField. *
  453.  * Purpose : Dataset Blob Field SubAggregate Class;* 
  454.  *  File  Name : ADODataSet.h / ADODataSet.cpp. *
  455.  *------------------------------------------------------*
  456.  * Author : Devia Lee. Date: 2004-04-03 *
  457.  ********************************************************/
  458. CBlobField::CBlobField(CField &oField)
  459. {
  460. this->m_spField = oField.getSmartPtr();
  461. }
  462. CBlobField::~CBlobField(){}
  463. //Load contents from stream / file.
  464. void CBlobField::LoadFromStream(
  465. const char *lpBuffer,
  466. const ULONG vBufSize)
  467. {
  468. assert( NULL != lpBuffer );
  469. char *p = (char*)lpBuffer;
  470. VARIANT varBLOB;
  471. SAFEARRAY *psa;
  472. SAFEARRAYBOUND rgsabound[1];
  473. rgsabound[0].lLbound = 0;
  474. rgsabound[0].cElements = vBufSize;
  475. //create the "SAFEARRAY" object.
  476. psa = SafeArrayCreate(VT_UI1, _ARRAYSIZE(rgsabound, SAFEARRAYBOUND), rgsabound);
  477. for(long i = 0; i < vBufSize; ++i){
  478. SafeArrayPutElement(psa, &i, p++);
  479. }
  480. varBLOB.vt = VT_ARRAY | VT_UI1;
  481. varBLOB.parray = psa;
  482. try{
  483. this->m_spField->AppendChunk(varBLOB);
  484. }
  485. catch (_com_error e) {
  486. throw new CADOException("CBlobField::LoadFromStream", e.Description());
  487. }
  488. }
  489. void CBlobField::LoadFromFile(LPCSTR lpszFileName)
  490. {
  491. /*
  492. CXFile xFile;
  493. char lpBuffer[MAX_BOLB_BLOCKSIZE];
  494. if( !xFile.Open(lpszFileName) ){
  495. throw new CADOException("CBlobField::LoadFromFile", "Open File Failed.");
  496. }
  497. while( !xFile.Eof() ){
  498. _MEMSET(lpBuffer, sizeof(MAX_BOLB_BLOCKSIZE))
  499. int nReaded = xFile.Read(lpBuffer, MAX_BOLB_BLOCKSIZE);
  500. this->LoadFromStream(lpBuffer, nReaded);
  501. }
  502. xFile.Close();
  503. */
  504. }
  505. //Save current contents to stream / file.
  506. long CBlobField::SaveToStream(
  507. char *lpBuffer,
  508. const ULONG vMaxBufSize)
  509. {
  510. assert( NULL != lpBuffer );
  511. long lDataSize = this->getActualSize();
  512. if( lDataSize > 0 ){
  513. _variant_t varBLOB;
  514. varBLOB = this->m_spField->GetChunk(lDataSize);
  515. if( varBLOB.vt == (VT_ARRAY | VT_UI1) ){
  516. char *pBuf = NULL;
  517. SafeArrayAccessData(varBLOB.parray, (void **)&pBuf);
  518. memcpy( lpBuffer, pBuf, min(vMaxBufSize, lDataSize) );
  519. SafeArrayUnaccessData(varBLOB.parray);
  520. return min(vMaxBufSize, lDataSize);
  521. }
  522. }
  523. return 0;
  524. }
  525. long CBlobField::SaveToFile(LPCSTR lpszFileName)
  526. {
  527. /*
  528. CXFile xFile;
  529. long lSaved;
  530. char *lpBuffer;
  531. if( !xFile.Open(lpszFileName, fomCreateAlways) ){
  532. throw new CADOException("CBlobField::SaveToFile", "Create File Failed.");
  533. }
  534. lSaved = this->getActualSize();
  535. lpBuffer = new char[lSaved + 1];
  536. _MEMSET(lpBuffer, lSaved + 1);
  537. lSaved = this->SaveToStream(lpBuffer, lSaved);
  538. xFile.Write(lpBuffer, lSaved);
  539. delete []lpBuffer;
  540. xFile.Close();
  541. return lSaved;
  542. */
  543. return 0;
  544. }
  545. /********************************************************
  546.  *  Class Name : CFields. *
  547.  * Purpose : Dataset Field Aggregate Class. *
  548.  *  File  Name : ADODataSet.h / ADODataSet.cpp. *
  549.  *------------------------------------------------------*
  550.  * Author : Devia Lee. Date: 2004-04-02 *
  551.  ********************************************************/
  552. //constructor and destructor procedure
  553. CFields::CFields() 
  554. {
  555. m_spFileds = NULL;
  556. }
  557. CFields::CFields(FieldsPtr fldsPtr)
  558. {
  559. m_spFileds = fldsPtr;
  560. }
  561. CFields::~CFields()
  562. {
  563. if(NULL != m_spFileds){
  564. m_spFileds.Release();
  565. }
  566. }
  567. //get fieldPtr smart pointer
  568. FieldsPtr &CFields::getSmartPtr()
  569. {
  570. return m_spFileds;
  571. }
  572. //Get the subfields count.
  573. const long CFields::FieldCount()
  574. {
  575. return m_spFileds->Count;
  576. }
  577. //operator "=" procedure
  578. CFields &CFields::operator=(CFields &fldsObj)
  579. {
  580. if(NULL != this->m_spFileds){
  581. this->m_spFileds.Release();
  582. }
  583. this->m_spFileds = fldsObj.getSmartPtr();
  584. return (*this);
  585. }
  586. //operator "=" procedure
  587. CFields &CFields::operator=(FieldsPtr &fldsPtr)
  588. {
  589. if(NULL != this->m_spFileds){
  590. this->m_spFileds.Release();
  591. }
  592. this->m_spFileds = fldsPtr;
  593. return (*this);
  594. }
  595. //operator "[]" procedure
  596. CField CFields::operator[](long i)
  597. {
  598. CField fldObj;
  599. try{
  600. fldObj = m_spFileds->GetItem(_variant_t(i));
  601. return fldObj;
  602. }
  603. catch (_com_error e) {
  604. throw e.ErrorInfo();
  605. }
  606. }
  607. //
  608. CField CFields::FieldByName(LPCSTR lpszFieldName)
  609. {
  610. CField fldObj;
  611. try{
  612. if(NULL != m_spFileds){
  613. CField fldObj = m_spFileds->GetItem(_variant_t(lpszFieldName));
  614. return fldObj;
  615. }
  616. }
  617. catch (_com_error e) {
  618. throw CADOException("CFields::FieldByName", e.Description());
  619. }
  620. return fldObj;
  621. }