home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / mfc / database / daoview / dragitem.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-03-27  |  4.9 KB  |  233 lines

  1. // DragItem.cpp : implementation file
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "stdafx.h"
  14. #include "DaoView.h"
  15. #include "DragItem.h"
  16. #include "renamedl.h"
  17.  
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22.  
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CDragItem
  25.  
  26. CDragItem::CDragItem()
  27. {
  28.     m_nItemType = itemNull;
  29. }
  30.  
  31. CDragItem::CDragItem(WORD nItemType, LPCTSTR lpszDBName, LPCTSTR lpszDBConnect, LPCTSTR lpszItemName )
  32. {
  33.     m_nItemType = nItemType;
  34.     m_strDBName = lpszDBName;
  35.     m_strDBConnect = lpszDBConnect;
  36.     m_strItemName = lpszItemName;
  37. }
  38.  
  39. CDragItem::~CDragItem()
  40. {
  41. }
  42.  
  43. void CDragItem::Serialize(CArchive& ar)
  44. {
  45.     CObject::Serialize(ar);
  46.  
  47.     if (ar.IsStoring())
  48.     {
  49.         ar << m_nItemType;
  50.         ar << m_strDBName;
  51.         ar << m_strDBConnect;
  52.         ar << m_strItemName;
  53.     }
  54.     else
  55.     {
  56.         ar >> m_nItemType;
  57.         ar >> m_strDBName;
  58.         ar >> m_strDBConnect;
  59.         ar >> m_strItemName;
  60.     }
  61. }
  62.  
  63. BOOL CDragItem::Transfer(CDaoTreeView* pTreeView,CDaoDatabase* pDBTarget)
  64. {
  65.     CWaitCursor curWait;
  66.  
  67.     CDaoDatabase dbSource;
  68.  
  69.     try
  70.     {
  71.         dbSource.Open(m_strDBName,FALSE,TRUE,m_strDBConnect);
  72.     }
  73.     catch (CDaoException* e)
  74.     {
  75.         DisplayDaoException(e);
  76.         e->Delete();
  77.         return FALSE;
  78.     }
  79.  
  80.     switch (m_nItemType)
  81.     {
  82.         case CDaoTreeView::IID_TABLE:
  83.             if (CopyTable(&dbSource,pDBTarget))
  84.                 pTreeView->AddItem(m_nItemType,m_strItemName);
  85.             break;
  86.         case CDaoTreeView::IID_QUERYDEF:
  87.             if (CopyQueryDef(&dbSource,pDBTarget))
  88.                 pTreeView->AddItem(m_nItemType,m_strItemName);
  89.             break;
  90.     }
  91.  
  92.     if (dbSource.IsOpen())
  93.         dbSource.Close();
  94.  
  95.     return TRUE;
  96. }
  97.  
  98. BOOL CDragItem::CopyTable(CDaoDatabase* pDBSource,CDaoDatabase* pDBTarget)
  99. {
  100.     CRenameDlg dlgRename;
  101.     dlgRename.m_strName = m_strItemName;
  102.  
  103.     // Find out if the table exists already
  104.     CDaoTableDefInfo tabInfo;
  105.     int nTableCount = pDBTarget->GetTableDefCount();
  106.     for (int i=0; i < nTableCount; i++)
  107.     {
  108.         pDBTarget->GetTableDefInfo(i,tabInfo);
  109.         if (tabInfo.m_strName == dlgRename.m_strName)
  110.         {
  111.             if (dlgRename.DoModal() == IDCANCEL)
  112.                 return FALSE;
  113.             i--;
  114.         }
  115.     }
  116.  
  117.     CDaoTableDef tdSource(pDBSource);
  118.     CDaoTableDef tdTarget(pDBTarget);
  119.  
  120.     tdSource.Open(m_strItemName);
  121.     pDBSource->GetTableDefInfo(m_strItemName,tabInfo,AFX_DAO_SECONDARY_INFO);
  122.  
  123.     tdTarget.Create(
  124.         dlgRename.m_strName,
  125.         tabInfo.m_lAttributes,
  126.         tabInfo.m_strSrcTableName,
  127.         tabInfo.m_strConnect);
  128.  
  129.     // Enumerate fields and append to new table
  130.     CDaoFieldInfo fieldInfo;
  131.     int nFieldCount = tdSource.GetFieldCount();
  132.     for (i=0; i < nFieldCount; i++)
  133.     {
  134.         try{
  135.             tdSource.GetFieldInfo(i,fieldInfo);
  136.             tdTarget.CreateField(
  137.                 fieldInfo.m_strName,
  138.                 fieldInfo.m_nType,
  139.                 fieldInfo.m_lSize);
  140.         }
  141.         catch (CDaoException* e)
  142.         {
  143.             DisplayDaoException(e);
  144.             e->Delete();
  145.         }
  146.     }
  147.  
  148.     tdTarget.Append();
  149.  
  150.     // Now attempt to copy the data
  151.     CDaoRecordset rsSource(pDBSource);
  152.     CDaoRecordset rsTarget(pDBTarget);
  153.     try
  154.     {
  155.         CString strSel1,strSel2;
  156.         strSel1 = strSel2 = (_T("Select * From ["));
  157.         strSel1 += m_strItemName;
  158.         strSel1 += _T("]");
  159.         strSel2 += dlgRename.m_strName;
  160.         strSel2 += _T("]");
  161.  
  162.         rsSource.Open(dbOpenDynaset,strSel1);
  163.         rsTarget.Open(dbOpenDynaset,strSel2);
  164.         while (!rsSource.IsEOF()) {
  165.             COleVariant var;
  166.             rsTarget.AddNew();
  167.             for (int i=0; i < nFieldCount; i++)
  168.             {
  169.                 var = rsSource.GetFieldValue(i);
  170.                 rsTarget.SetFieldValue(i,var);
  171.             }
  172.  
  173.             rsTarget.Update();
  174.  
  175.             rsSource.MoveNext();
  176.         }
  177.     }
  178.     catch (CDaoException* e)
  179.     {
  180.         DisplayDaoException(e);
  181.         e->Delete();
  182.     }
  183.  
  184.     rsSource.Close();
  185.     rsTarget.Close();
  186.  
  187.     tdTarget.Close();
  188.     tdSource.Close();
  189.  
  190.     m_strItemName = dlgRename.m_strName;
  191.     return TRUE;
  192. }
  193.  
  194. BOOL CDragItem::CopyQueryDef(CDaoDatabase* pDBSource,CDaoDatabase* pDBTarget)
  195. {
  196.     CRenameDlg dlgRename;
  197.     dlgRename.m_strName = m_strItemName;
  198.  
  199.     // Find out if the querydef exists already
  200.     CDaoQueryDefInfo queryInfo;
  201.     int nQueryDefCount = pDBTarget->GetQueryDefCount();
  202.     for (int i=0; i < nQueryDefCount; i++)
  203.     {
  204.         pDBTarget->GetQueryDefInfo(i,queryInfo);
  205.         if (queryInfo.m_strName == dlgRename.m_strName)
  206.         {
  207.             if (dlgRename.DoModal() == IDCANCEL)
  208.                 return FALSE;
  209.             i--;
  210.         }
  211.     }
  212.  
  213.     CDaoQueryDef qdTarget(pDBTarget);
  214.  
  215.     try
  216.     {
  217.         pDBSource->GetQueryDefInfo(m_strItemName,queryInfo,AFX_DAO_ALL_INFO);
  218.  
  219.         qdTarget.Create(dlgRename.m_strName,queryInfo.m_strSQL);
  220.  
  221.         qdTarget.Append();
  222.         qdTarget.Close();
  223.     }
  224.     catch (CDaoException* e)
  225.     {
  226.         DisplayDaoException(e);
  227.         e->Delete();
  228.     }
  229.  
  230.     m_strItemName = dlgRename.m_strName;
  231.     return TRUE;
  232. }
  233.