home *** CD-ROM | disk | FTP | other *** search
/ Total C++ 2 / TOTALCTWO.iso / borland / mfcinc.pak / AFXDAO.H < prev    next >
C/C++ Source or Header  |  1997-05-06  |  39KB  |  1,319 lines

  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1995 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10.  
  11. #ifndef __AFXDAO_H
  12. #define __AFXDAO_H
  13.  
  14. #ifdef _AFX_NO_DAO_SUPPORT
  15.     #error DAO Database classes not supported in this library variant.
  16. #endif
  17.  
  18. #ifndef __AFXDISP_H__
  19.     #include <afxdisp.h>    // Must include this before dao headers
  20. #endif
  21. #ifndef _DBDAOINT_H_
  22.     #include <dbdaoint.h>
  23. #endif
  24. #ifndef _DAOGETRW_H_
  25.     #include <daogetrw.h>
  26. #endif
  27. #ifndef _DBDAOID_H_
  28.     #include <dbdaoid.h>
  29. #endif
  30. #ifndef _DBDAOERR_H_
  31.     #include <dbdaoerr.h>
  32. #endif
  33.  
  34. #ifndef __AFXDB__H__
  35.     #include <afxdb_.h> // shared header with ODBC database classes
  36. #endif
  37.  
  38. #ifdef _AFX_MINREBUILD
  39. #pragma component(minrebuild, off)
  40. #endif
  41. #ifndef _AFX_FULLTYPEINFO
  42. #pragma component(mintypeinfo, on)
  43. #endif
  44.  
  45. #ifndef _AFX_NOFORCE_LIBS
  46. #ifndef _MAC
  47.  
  48. /////////////////////////////////////////////////////////////////////////////
  49. // Win32 libraries
  50.  
  51. #ifdef _AFXDLL
  52.     #if defined(_DEBUG) && !defined(_AFX_MONOLITHIC)
  53.         #ifndef _UNICODE
  54.             #pragma comment(lib, "mfco40d.lib")
  55.             #pragma comment(lib, "mfcd40d.lib")
  56.         #else
  57.             #pragma comment(lib, "mfco40ud.lib")
  58.             #pragma comment(lib, "mfcd40ud.lib")
  59.         #endif
  60.     #endif
  61.  
  62. #endif
  63.  
  64. // DAO GUIDs in uuid2.lib
  65. #pragma comment(lib, "uuid2.lib")
  66.  
  67. #else //!_MAC
  68.  
  69. /////////////////////////////////////////////////////////////////////////////
  70. // Macintosh libraries
  71.  
  72. #endif //_MAC
  73. #endif //!_AFX_NOFORCE_LIBS
  74.  
  75. #ifdef _AFX_PACKING
  76. #pragma pack(push, _AFX_PACKING)
  77. #endif
  78.  
  79. ////////////////////////////////////////////////////////////////////////
  80. // AFXDAO - MFC Database support using DAO
  81.  
  82. // Classes declared in this file
  83.  
  84.     // CException
  85.         class CDaoException;    // DAO error/exception handling
  86.  
  87.     // CObject
  88.         class CDaoRecordView;
  89.         class CDaoWorkspace;    // DAO engine/transaction/security manager
  90.         class CDaoDatabase;     // DAO database manager
  91.         class CDaoRecordset;    // DAO result set manager
  92.         class CDaoTableDef;     // DAO base table manager
  93.         class CDaoQueryDef;     // DAO query manager
  94.  
  95.     // Non-CObject classes
  96.         class CDaoFieldExchange;
  97.         struct CDaoFieldCache;
  98.         struct CDaoErrorInfo;
  99.         struct CDaoWorkspaceInfo;
  100.         struct CDaoDatabaseInfo;
  101.         struct CDaoTableDefInfo;
  102.         struct CDaoFieldInfo;
  103.         struct CDaoIndexInfo;
  104.         struct CDaoRelationInfo;
  105.         struct CDaoQueryDefInfo;
  106.         struct CDaoParameterInfo;
  107.  
  108. /////////////////////////////////////////////////////////////////////////////
  109. // AFXDLL support
  110.  
  111. #undef AFX_DATA
  112. #define AFX_DATA AFX_DB_DATA
  113.  
  114. ////////////////////////////////////////////////////////////////////////
  115. // Data caching structures
  116. struct CDaoFieldCache
  117. {
  118.     void* m_pvData;     // Pointer to cached data of any supported type.
  119.     BYTE m_nStatus;     // (NULL) status cache.
  120.     BYTE m_nDataType;       // Type of data cached.
  121. };
  122.  
  123. ////////////////////////////////////////////////////////////////////////
  124. // Info structures
  125.  
  126. struct CDaoErrorInfo
  127. {
  128. // Attributes
  129.     long m_lErrorCode;
  130.     CString m_strSource;
  131.     CString m_strDescription;
  132.     CString m_strHelpFile;
  133.     long m_lHelpContext;
  134.  
  135. #ifdef _DEBUG
  136.     virtual void Dump(CDumpContext& dc) const;
  137. #endif
  138. };
  139.  
  140. struct CDaoWorkspaceInfo
  141. {
  142. // Attributes
  143.     CString m_strName;              // Primary
  144.     CString m_strUserName;          // Secondary
  145.     BOOL m_bIsolateODBCTrans;       // All
  146.  
  147. #ifdef _DEBUG
  148.     virtual void Dump(CDumpContext& dc) const;
  149. #endif
  150. };
  151.  
  152. struct CDaoDatabaseInfo
  153. {
  154. // Attributes
  155.     CString m_strName;              // Primary
  156.     BOOL m_bUpdatable;              // Primary
  157.     BOOL m_bTransactions;           // Primary
  158.     CString m_strVersion;           // Secondary
  159.     long m_lCollatingOrder;         // Secondary
  160.     short m_nQueryTimeout;          // Secondary
  161.     CString m_strConnect;           // All
  162.  
  163. #ifdef _DEBUG
  164.     virtual void Dump(CDumpContext& dc) const;
  165. #endif
  166. };
  167.  
  168. struct CDaoTableDefInfo
  169. {
  170. // Attributes
  171.     CString m_strName;              // Primary
  172.     BOOL m_bUpdatable;              // Primary
  173.     long m_lAttributes;             // Primary
  174.     COleDateTime m_dateCreated;     // Secondary
  175.     COleDateTime m_dateLastUpdated; // Secondary
  176.     CString m_strSrcTableName;      // Secondary
  177.     CString m_strConnect;           // Secondary
  178.     CString m_strValidationRule;    // All
  179.     CString m_strValidationText;    // All
  180.     long m_lRecordCount;            // All
  181.  
  182. #ifdef _DEBUG
  183.     virtual void Dump(CDumpContext& dc) const;
  184. #endif
  185. };
  186.  
  187. struct CDaoFieldInfo
  188. {
  189. // Attributes
  190.     CString m_strName;              // Primary
  191.     short m_nType;                  // Primary
  192.     long m_lSize;                   // Primary
  193.     long m_lAttributes;             // Primary
  194.     short m_nOrdinalPosition;       // Secondary
  195.     BOOL m_bRequired;               // Secondary
  196.     BOOL m_bAllowZeroLength;        // Secondary
  197.     long m_lCollatingOrder;         // Secondary
  198.     CString m_strForeignName;       // Secondary
  199.     CString m_strSourceField;       // Secondary
  200.     CString m_strSourceTable;       // Secondary
  201.     CString m_strValidationRule;    // All
  202.     CString m_strValidationText;    // All
  203.     CString m_strDefaultValue;      // All
  204.  
  205. #ifdef _DEBUG
  206.     virtual void Dump(CDumpContext& dc) const;
  207. #endif
  208. };
  209.  
  210. struct CDaoIndexFieldInfo
  211. {
  212. // Attributes
  213.     CString m_strName;              // Primary
  214.     BOOL m_bDescending;             // Primary
  215.  
  216. #ifdef _DEBUG
  217.     virtual void Dump(CDumpContext& dc) const;
  218. #endif
  219. };
  220.  
  221. struct CDaoIndexInfo
  222. {
  223. // Constructors
  224.     CDaoIndexInfo();
  225.  
  226. // Attributes
  227.     CString m_strName;                      // Primary
  228.     CDaoIndexFieldInfo* m_pFieldInfos;      // Primary
  229.     short m_nFields;                        // Primary
  230.     BOOL m_bPrimary;                        // Secondary
  231.     BOOL m_bUnique;                         // Secondary
  232.     BOOL m_bClustered;                      // Secondary
  233.     BOOL m_bIgnoreNulls;                    // Secondary
  234.     BOOL m_bRequired;                       // Secondary
  235.     BOOL m_bForeign;                        // Secondary
  236.     long m_lDistinctCount;                  // All
  237.  
  238. // Implementation
  239.     virtual ~CDaoIndexInfo();
  240.     BOOL m_bCleanupFieldInfo;
  241.  
  242. #ifdef _DEBUG
  243.     virtual void Dump(CDumpContext& dc) const;
  244. #endif
  245. };
  246.  
  247. struct CDaoRelationFieldInfo
  248. {
  249. // Attributes
  250.     CString m_strName;              // Primary
  251.     CString m_strForeignName;       // Primary
  252.  
  253. #ifdef _DEBUG
  254.     virtual void Dump(CDumpContext& dc) const;
  255. #endif
  256. };
  257.  
  258. struct CDaoRelationInfo
  259. {
  260. // Constructor
  261.     CDaoRelationInfo();
  262.  
  263. // Attributes
  264.     CString m_strName;              // Primary
  265.     CString m_strTable;             // Primary
  266.     CString m_strForeignTable;      // Primary
  267.     long m_lAttributes;             // Secondary
  268.     CDaoRelationFieldInfo* m_pFieldInfos;   // Secondary
  269.     short m_nFields;                // Secondary
  270.  
  271. // Implementation
  272.     virtual ~CDaoRelationInfo();
  273.     BOOL m_bCleanupFieldInfo;
  274.  
  275. #ifdef _DEBUG
  276.     virtual void Dump(CDumpContext& dc) const;
  277. #endif
  278. };
  279.  
  280. struct CDaoQueryDefInfo
  281. {
  282. // Attributes
  283.     CString m_strName;              // Primary
  284.     short m_nType;                  // Primary
  285.     COleDateTime m_dateCreated;     // Secondary
  286.     COleDateTime m_dateLastUpdated; // Secondary
  287.     BOOL m_bUpdatable;              // Secondary
  288.     BOOL m_bReturnsRecords;         // Secondary
  289.     CString m_strSQL;               // All
  290.     CString m_strConnect;           // All
  291.     short m_nODBCTimeout;           // See readme
  292.  
  293. #ifdef _DEBUG
  294.     virtual void Dump(CDumpContext& dc) const;
  295. #endif
  296. };
  297.  
  298. struct CDaoParameterInfo
  299. {
  300. // Attributes
  301.     CString m_strName;              // Primary
  302.     short m_nType;                  // Primary
  303.     COleVariant m_varValue;         // Secondary
  304.  
  305. #ifdef _DEBUG
  306.     virtual void Dump(CDumpContext& dc) const;
  307. #endif
  308. };
  309.  
  310. ////////////////////////////////////////////////////////////////////////
  311. // DAO Helpers
  312. //
  313.  
  314. // Flags for getting and/or setting object properties
  315. #define AFX_DAO_PRIMARY_INFO    0x00000001  // Get only primary
  316. #define AFX_DAO_SECONDARY_INFO  0x00000002  // Get primary & secondary
  317. #define AFX_DAO_ALL_INFO        0x00000004  // Get All info
  318.  
  319. // Jet engine TRUE/FALSE definitions
  320. #define AFX_DAO_TRUE                    (-1L)
  321. #define AFX_DAO_FALSE                   0
  322.  
  323. // Set CDaoRecordset::Open option to use m_nDefaultType
  324. #define AFX_DAO_USE_DEFAULT_TYPE        (-1L)
  325.  
  326. // Flags used for Move/Find
  327. #define AFX_DAO_NEXT                    (+1L)
  328. #define AFX_DAO_PREV                    (-1L)
  329. #define AFX_DAO_FIRST                   LONG_MIN
  330. #define AFX_DAO_LAST                    LONG_MAX
  331.  
  332. // Default sizes for DFX function PreAlloc sizes
  333. #define AFX_DAO_TEXT_DEFAULT_SIZE       255
  334. #define AFX_DAO_BINARY_DEFAULT_SIZE     2048
  335. #define AFX_DAO_LONGBINARY_DEFAULT_SIZE 32768
  336.  
  337. // Flag used for DFX functions dwBindOptions bitmask
  338. #define AFX_DAO_ENABLE_FIELD_CACHE      0x01
  339. #define AFX_DAO_DISABLE_FIELD_CACHE     0
  340.  
  341. // Field Flags, used to indicate status of fields
  342. #define AFX_DAO_FIELD_FLAG_DIRTY            0x01
  343. #define AFX_DAO_FIELD_FLAG_NULL             0x02
  344. #define AFX_DAO_FIELD_FLAG_NULLABLE_KNOWN   0x04
  345. #define AFX_DAO_FIELD_FLAG_NULLABLE         0x08
  346.  
  347. // Extended error codes
  348. #define NO_AFX_DAO_ERROR                        0
  349. #define AFX_DAO_ERROR_MIN                       2000
  350. #define AFX_DAO_ERROR_ENGINE_INITIALIZATION     AFX_DAO_ERROR_MIN + 0
  351. #define AFX_DAO_ERROR_DFX_BIND                  AFX_DAO_ERROR_MIN + 1
  352. #define AFX_DAO_ERROR_OBJECT_NOT_OPEN           AFX_DAO_ERROR_MIN + 2
  353. #define AFX_DAO_ERROR_MAX                       AFX_DAO_ERROR_MIN + 2
  354.  
  355. // Object status flags
  356. #define AFX_DAO_IMPLICIT_WS                     0x01
  357. #define AFX_DAO_IMPLICIT_DB                     0x02
  358. #define AFX_DAO_IMPLICIT_QD                     0x04
  359. #define AFX_DAO_IMPLICIT_TD                     0x08
  360. #define AFX_DAO_IMPLICIT_CLOSE                  0x40
  361. #define AFX_DAO_DEFAULT_WS                      0x80
  362.  
  363. // CDaoRecordView status flags
  364. #define AFX_DAOVIEW_SCROLL_NEXT                 0x01
  365. #define AFX_DAOVIEW_SCROLL_LAST                 0x02
  366. #define AFX_DAOVIEW_SCROLL_BACKWARD             0x04
  367.  
  368. // Logging helpers
  369. void AFXAPI AfxDaoCheck(SCODE scode, LPCSTR lpszDaoCall,
  370.     LPCSTR lpszFile, int nLine, int nError = NO_AFX_DAO_ERROR,
  371.     BOOL bMemOnly = FALSE);
  372.  
  373. #ifdef _DEBUG
  374. void AFXAPI AfxDaoTrace(SCODE scode, LPCSTR lpszDaoCall,
  375.     LPCSTR lpszFile, int nLine);
  376. #endif
  377.  
  378. #ifdef _DEBUG
  379. #define DAO_CHECK(f)            AfxDaoCheck(f, #f, THIS_FILE, __LINE__)
  380. #define DAO_CHECK_ERROR(f, err) AfxDaoCheck(f, #f, THIS_FILE, __LINE__, err)
  381. #define DAO_CHECK_MEM(f)        AfxDaoCheck(f, #f, THIS_FILE, __LINE__, \
  382.                                     NO_AFX_DAO_ERROR, TRUE)
  383. #define DAO_TRACE(f)            AfxDaoTrace(f, #f, THIS_FILE, __LINE__)
  384. #else
  385. #define DAO_CHECK(f)            AfxDaoCheck(f, NULL, NULL, 0)
  386. #define DAO_CHECK_ERROR(f, err) AfxDaoCheck(f, NULL, NULL, 0, err)
  387. #define DAO_CHECK_MEM(f)        AfxDaoCheck(f, NULL, NULL, 0, \
  388.                                     NO_AFX_DAO_ERROR, TRUE)
  389. #define DAO_TRACE(f)            f
  390. #endif
  391.  
  392. /////////////////////////////////////////////////////////////////////////////
  393. // CDaoFieldExchange - for field exchange
  394. class CDaoFieldExchange
  395. {
  396. // Attributes
  397. public:
  398.     enum DFX_Operation
  399.     {
  400.         AddToParameterList,     // builds PARAMETERS clause
  401.         AddToSelectList,        // builds SELECT clause
  402.         BindField,              // sets up binding structure
  403.         BindParam,              // sets parameter values
  404.         Fixup,                  // sets NULL status
  405.         AllocCache,             // allocates cache used for dirty check
  406.         StoreField,             // saves current record to cache
  407.         LoadField,              // restores cached data to member vars
  408.         FreeCache,              // frees cache
  409.         SetFieldNull,           // sets field status & value to NULL
  410.         MarkForAddNew,          // marks fields dirty if not PSEUDO NULL
  411.         MarkForEdit,            // marks fields dirty if don't match cache
  412.         SetDirtyField,          // sets field values marked as dirty
  413. #ifdef _DEBUG
  414.         DumpField,
  415. #endif
  416.         MaxDFXOperation,        // dummy operation type for input checking
  417.     };
  418.  
  419.     UINT m_nOperation;          // type of exchange operation
  420.     CDaoRecordset* m_prs;       // recordset handle
  421.  
  422. // Operations
  423. public:
  424.     enum FieldType
  425.     {
  426.         none,
  427.         outputColumn,
  428.         param,
  429.     };
  430.  
  431.     void SetFieldType(UINT nFieldType);
  432.     BOOL IsValidOperation();
  433.  
  434. // Implementation
  435. public:
  436.     CDaoFieldExchange(UINT nOperation, CDaoRecordset* prs,
  437.         void* pvField = NULL);
  438.  
  439.     void Default(LPCTSTR lpszName, void* pv, DWORD dwFieldType,
  440.         DWORD dwBindOptions = 0);
  441.  
  442.     static void PASCAL AppendParamType(CString& strParamList, DWORD dwParamType);
  443.     static CDaoFieldCache* PASCAL GetCacheValue(CDaoRecordset* prs, void* pv);
  444.     static void PASCAL SetNullValue(void* pv, DWORD dwDataType);
  445.     static BOOL PASCAL IsNullValue(void* pv, DWORD dwDataType);
  446.     static void PASCAL AllocCacheValue(CDaoFieldCache*& pCache, DWORD dwDataType);
  447.     static void PASCAL DeleteCacheValue(CDaoFieldCache* pCache, DWORD dwDataType);
  448.     static void PASCAL CopyValue(void* pvSrc, void* pvDest, DWORD dwDataType);
  449.     static BOOL PASCAL CompareValue(void* pvSrc, void* pvDest, DWORD dwDataType);
  450.     static void PASCAL FillVariant(void* pvValue, DWORD dwDataType, COleVariant** ppVar);
  451.  
  452.     // Current type of field
  453.     UINT m_nFieldType;
  454.     void* m_pvField;
  455.     UINT m_nField;
  456.     UINT m_nParam;
  457.     UINT m_nFieldFound;
  458.  
  459. #ifdef _DEBUG
  460.     CDumpContext* m_pdcDump;
  461. #endif //_DEBUG
  462. };
  463.  
  464. /////////////////////////////////////////////////////////////////////////////
  465. // Standard RecordSet Field Exchange routines
  466.  
  467. // variable length data
  468. void AFXAPI DFX_Text(CDaoFieldExchange* pFX, LPCTSTR lpszName,
  469.     CString& value, int nPreAllocSize = AFX_DAO_TEXT_DEFAULT_SIZE,
  470.     DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE);
  471. void AFXAPI DFX_Binary(CDaoFieldExchange* pFX, LPCTSTR lpszName,
  472.     CByteArray& value, int nPreAllocSize = AFX_DAO_BINARY_DEFAULT_SIZE,
  473.     DWORD dwBindOptions = 0);
  474. void AFXAPI DFX_LongBinary(CDaoFieldExchange* pFX, LPCTSTR lpszName,
  475.     CLongBinary& value, DWORD dwPreAllocSize = AFX_DAO_LONGBINARY_DEFAULT_SIZE,
  476.     DWORD dwBndOptions = 0);
  477.  
  478. //fixed length data
  479. void AFXAPI DFX_Bool(CDaoFieldExchange* pFX, LPCTSTR lpszName,
  480.     BOOL& value, DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE);
  481. void AFXAPI DFX_Byte(CDaoFieldExchange* pFX, LPCTSTR lpszName,
  482.     BYTE& value, DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE);
  483. void AFXAPI DFX_Short(CDaoFieldExchange* pFX, LPCTSTR lpszName,
  484.     short& value, DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE);
  485. void AFXAPI DFX_Long(CDaoFieldExchange* pFX, LPCTSTR lpszName,
  486.     long& value, DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE);
  487. void AFXAPI DFX_Currency(CDaoFieldExchange* pFX, LPCTSTR lpszName,
  488.     COleCurrency& value, DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE);
  489. void AFXAPI DFX_Single(CDaoFieldExchange* pFX, LPCTSTR lpszName,
  490.     float& value, DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE);
  491. void AFXAPI DFX_Double(CDaoFieldExchange* pFX, LPCTSTR lpszName,
  492.     double& value, DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE);
  493. void AFXAPI DFX_DateTime(CDaoFieldExchange* pFX, LPCTSTR lpszName,
  494.     COleDateTime& value, DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE);
  495.  
  496. //////////////////////////////////////////////////////////////////////////
  497. // Database Dialog Data Exchange cover routines
  498. // Cover routines provide database semantics on top of DDX routines
  499.  
  500. // simple text operations
  501. void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, BOOL& value,
  502.     CDaoRecordset* pRecordset);
  503. void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, BYTE& value,
  504.     CDaoRecordset* pRecordset);
  505. void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, short& value,
  506.     CDaoRecordset* pRecordset);
  507. void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, long& value,
  508.     CDaoRecordset* pRecordset);
  509. void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, COleCurrency& value,
  510.     CDaoRecordset* pRecordset);
  511. void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, DWORD& value,
  512.     CDaoRecordset* pRecordset);
  513. void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, float& value,
  514.     CDaoRecordset* pRecordset);
  515. void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, double& value,
  516.     CDaoRecordset* pRecordset);
  517. void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, COleDateTime& value,
  518.     CDaoRecordset* pRecordset);
  519. void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, CString& value,
  520.     CDaoRecordset* pRecordset);
  521.  
  522. // special control types
  523. void AFXAPI DDX_FieldCheck(CDataExchange* pDX, int nIDC, int& value,
  524.     CDaoRecordset* pRecordset);
  525. void AFXAPI DDX_FieldRadio(CDataExchange* pDX, int nIDC, int& value,
  526.     CDaoRecordset* pRecordset);
  527. void AFXAPI DDX_FieldLBString(CDataExchange* pDX, int nIDC,
  528.     CString& value, CDaoRecordset* pRecordset);
  529. void AFXAPI DDX_FieldCBString(CDataExchange* pDX, int nIDC,
  530.     CString& value, CDaoRecordset* pRecordset);
  531. void AFXAPI DDX_FieldLBStringExact(CDataExchange* pDX, int nIDC,
  532.     CString& value, CDaoRecordset* pRecordset);
  533. void AFXAPI DDX_FieldCBStringExact(CDataExchange* pDX, int nIDC,
  534.     CString& value, CDaoRecordset* pRecordset);
  535. void AFXAPI DDX_FieldLBIndex(CDataExchange* pDX, int nIDC, int& index,
  536.     CDaoRecordset* pRecordset);
  537. void AFXAPI DDX_FieldCBIndex(CDataExchange* pDX, int nIDC, int& index,
  538.     CDaoRecordset* pRecordset);
  539. void AFXAPI DDX_FieldLBStringExact(CDataExchange* pDX, int nIDC, CString& value,
  540.     CDaoRecordset* pRecordset);
  541. void AFXAPI DDX_FieldCBStringExact(CDataExchange* pDX, int nIDC, CString& value,
  542.     CDaoRecordset* pRecordset);
  543. void AFXAPI DDX_FieldScroll(CDataExchange* pDX, int nIDC, int& value,
  544.     CDaoRecordset* pRecordset);
  545.  
  546. ////////////////////////////////////////////////////////////////////////
  547. // CDaoWorkspace - a DAO Workspace
  548.  
  549. class CDaoWorkspace : public CObject
  550. {
  551.     DECLARE_DYNAMIC(CDaoWorkspace)
  552.  
  553. // Constructors
  554. public:
  555.     CDaoWorkspace();
  556.  
  557.     virtual void Create(LPCTSTR lpszName, LPCTSTR lpszUserName,
  558.         LPCTSTR lpszPassword);
  559.     virtual void Append();
  560.  
  561.     virtual void Open(LPCTSTR lpszName = NULL);
  562.     virtual void Close();
  563.  
  564. // Attributes
  565. public:
  566.     DAOWorkspace* m_pDAOWorkspace;
  567.  
  568.     static CString PASCAL GetVersion();
  569.     static CString PASCAL GetIniPath();
  570.     static void PASCAL SetIniPath(LPCTSTR lpszRegistrySubKey);
  571.     static void PASCAL SetDefaultUser(LPCTSTR lpszDefaultUser);
  572.     static void PASCAL SetDefaultPassword(LPCTSTR lpszPassword);
  573.     static short PASCAL GetLoginTimeout();
  574.     static void PASCAL SetLoginTimeout(short nSeconds);
  575.  
  576.     CString GetName();
  577.     CString GetUserName();
  578.     void SetIsolateODBCTrans(BOOL bIsolateODBCTrans);
  579.     BOOL GetIsolateODBCTrans();
  580.  
  581.     BOOL IsOpen() const;
  582.  
  583. // Operations
  584. public:
  585.     void BeginTrans();
  586.     void CommitTrans();
  587.     void Rollback();
  588.  
  589.     static void PASCAL CompactDatabase(LPCTSTR lpszSrcName,
  590.         LPCTSTR lpszDestName, LPCTSTR lpszLocale = dbLangGeneral,
  591.         int nOptions = 0);
  592.     // Password parameter added late in dev cycle, new interface req'd
  593.     static void PASCAL CompactDatabase(LPCTSTR lpszSrcName,
  594.         LPCTSTR lpszDestName, LPCTSTR lpszLocale, int nOptions,
  595.         LPCTSTR lpszPassword);
  596.     static void PASCAL RepairDatabase(LPCTSTR lpszName);
  597.  
  598.     static void PASCAL Idle(int nAction = dbFreeLocks);
  599.  
  600.     short GetWorkspaceCount();
  601.     void GetWorkspaceInfo(int nIndex, CDaoWorkspaceInfo& wkspcinfo,
  602.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  603.     void GetWorkspaceInfo(LPCTSTR lpszName, CDaoWorkspaceInfo& wkspcinfo,
  604.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  605.  
  606.     short GetDatabaseCount();
  607.     void GetDatabaseInfo(int nIndex, CDaoDatabaseInfo& dbinfo,
  608.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  609.     void GetDatabaseInfo(LPCTSTR lpszName, CDaoDatabaseInfo& dbinfo,
  610.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  611.  
  612. // Overridables
  613. public:
  614.  
  615. // Implementation
  616. public:
  617.     virtual ~CDaoWorkspace();
  618.  
  619. #ifdef _DEBUG
  620.     virtual void AssertValid() const;
  621.     virtual void Dump(CDumpContext& dc) const;
  622. #endif
  623.  
  624.     DAOWorkspaces* m_pDAOWorkspaces;
  625.     DAODatabases* m_pDAODatabases;
  626.     int m_nStatus;
  627.  
  628.     CMapPtrToPtr m_mapDatabases;        // Map of all Open CDaoDatabases
  629.  
  630. protected:
  631.     BOOL m_bOpen;
  632.     BOOL m_bNew;
  633.  
  634.     static void AFX_CDECL InitializeEngine();
  635.  
  636.     void InitWorkspacesCollection();
  637.     void FillWorkspaceInfo(DAOWorkspace* pDAOWorkspace,
  638.         CDaoWorkspaceInfo& wsinfo, DWORD dwOptions);
  639.  
  640.     void InitDatabasesCollection();
  641.     void FillDatabaseInfo(DAODatabase* pDAODatabase,
  642.         CDaoDatabaseInfo& dbinfo, DWORD dwOptions);
  643.  
  644.     virtual void ThrowDaoException(int nError = NO_AFX_DAO_ERROR);
  645. };
  646.  
  647. ////////////////////////////////////////////////////////////////////////
  648. // CDaoException - DAO error trapping mechanism
  649. class CDaoException : public CException
  650. {
  651.     DECLARE_DYNAMIC(CDaoException)
  652.  
  653. // Constructors
  654. public:
  655.     CDaoException();
  656.  
  657. // Attributes
  658. public:
  659.     CDaoErrorInfo* m_pErrorInfo;
  660.  
  661.     SCODE m_scode;
  662.     int m_nAfxDaoError;     // DAO class extended error code
  663.  
  664. // Operations
  665. public:
  666.     short GetErrorCount();
  667.     void GetErrorInfo(int nIndex);
  668.  
  669. // Implementation
  670. public:
  671.     virtual ~CDaoException();
  672.  
  673.     DAOError* m_pDAOError;
  674.     DAOErrors* m_pDAOErrors;
  675.  
  676.     virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError,
  677.         PUINT pnHelpContext = NULL);
  678.  
  679. protected:
  680.     void InitErrorsCollection();
  681.     void FillErrorInfo();
  682. };
  683.  
  684. void AFXAPI AfxThrowDaoException(int nAfxDaoError = NO_AFX_DAO_ERROR,
  685.     SCODE scode = S_OK);
  686.  
  687.  
  688. ////////////////////////////////////////////////////////////////////////
  689. // CDaoDatabase - a DAO Database
  690.  
  691. class CDaoDatabase : public CObject
  692. {
  693.     DECLARE_DYNAMIC(CDaoDatabase)
  694.  
  695. // Constructors
  696. public:
  697.     CDaoDatabase(CDaoWorkspace* pWorkspace = NULL);
  698.  
  699.     virtual void Create(LPCTSTR lpszName,
  700.         LPCTSTR lpszLocale = dbLangGeneral, int dwOptions = 0);
  701.  
  702.     virtual void Open(LPCTSTR lpszName, BOOL bExclusive = FALSE,
  703.         BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = _T(""));
  704.     virtual void Close();
  705.  
  706. // Attributes
  707. public:
  708.     CDaoWorkspace* m_pWorkspace;
  709.     DAODatabase* m_pDAODatabase;
  710.  
  711.     BOOL IsOpen() const;
  712.  
  713.     BOOL CanUpdate();
  714.     BOOL CanTransact();
  715.  
  716.     CString GetName();
  717.     CString GetConnect();
  718.  
  719.     CString GetVersion();
  720.     short GetQueryTimeout();
  721.     void SetQueryTimeout(short nSeconds);
  722.     long GetRecordsAffected();
  723.  
  724. // Operations
  725. public:
  726.     void Execute(LPCTSTR lpszSQL, int nOptions = dbFailOnError);
  727.  
  728.     void DeleteTableDef(LPCTSTR lpszName);
  729.     void DeleteQueryDef(LPCTSTR lpszName);
  730.  
  731.     void CreateRelation(LPCTSTR lpszName, LPCTSTR lpszTable,
  732.         LPCTSTR lpszForeignTable, long lAttributes,
  733.         LPCTSTR lpszField, LPCTSTR lpszForeignField);
  734.     void CreateRelation(CDaoRelationInfo& relinfo);
  735.     void DeleteRelation(LPCTSTR lpszName);
  736.  
  737.     short GetTableDefCount();
  738.     void GetTableDefInfo(int nIndex, CDaoTableDefInfo& tabledefinfo,
  739.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  740.     void GetTableDefInfo(LPCTSTR lpszName, CDaoTableDefInfo& tabledefinfo,
  741.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  742.  
  743.     short GetRelationCount();
  744.     void GetRelationInfo(int nIndex, CDaoRelationInfo& relinfo,
  745.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  746.     void GetRelationInfo(LPCTSTR lpszName, CDaoRelationInfo& relinfo,
  747.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  748.  
  749.     short GetQueryDefCount();
  750.     void GetQueryDefInfo(int nIndex, CDaoQueryDefInfo& querydefinfo,
  751.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  752.     void GetQueryDefInfo(LPCTSTR lpszName, CDaoQueryDefInfo& querydefinfo,
  753.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  754.  
  755. // Overridables
  756. public:
  757.  
  758. // Implementation
  759. public:
  760.     virtual ~CDaoDatabase();
  761.  
  762. #ifdef _DEBUG
  763.     virtual void AssertValid() const;
  764.     virtual void Dump(CDumpContext& dc) const;
  765. #endif
  766.  
  767.     DAOTableDefs* m_pDAOTableDefs;
  768.     DAORelations* m_pDAORelations;
  769.     DAOQueryDefs* m_pDAOQueryDefs;
  770.     DAORecordsets* m_pDAORecordsets;
  771.     int m_nStatus;
  772.  
  773.     CMapPtrToPtr m_mapTableDefs;        // Map of all Open CDaoTableDefs
  774.     CMapPtrToPtr m_mapQueryDefs;        // Map of all Open CDaoQueryDefs
  775.     CMapPtrToPtr m_mapRecordsets;       // Map of all Open CDaoRecordsets
  776.  
  777. protected:
  778.     BOOL m_bOpen;
  779.  
  780.     void InitWorkspace();
  781.     void InitTableDefsCollection();
  782.     void FillTableDefInfo(DAOTableDef* pDAOTableDef,
  783.         CDaoTableDefInfo& tabledefinfo, DWORD dwOptions);
  784.     void InitRelationsCollection();
  785.     void FillRelationInfo(DAORelation* pDAORelation,
  786.         CDaoRelationInfo& relinfo, DWORD dwOptions);
  787.     void InitQueryDefsCollection();
  788.     void FillQueryDefInfo(DAOQueryDef* pDAOQueryDef,
  789.         CDaoQueryDefInfo& querydefinfo, DWORD dwOptions);
  790.  
  791.     virtual void ThrowDaoException(int nError = NO_AFX_DAO_ERROR);
  792. };
  793.  
  794.  
  795. ////////////////////////////////////////////////////////////////////////
  796. // CDaoTableDef - a DAO TableDef
  797.  
  798. class CDaoTableDef : public CObject
  799. {
  800.     DECLARE_DYNAMIC(CDaoTableDef)
  801.  
  802. // Constructors
  803. public:
  804.     CDaoTableDef(CDaoDatabase* pDatabase);
  805.  
  806.     virtual void Create(LPCTSTR lpszName, long lAttributes = 0,
  807.         LPCTSTR lpszSrcTable = NULL, LPCTSTR lpszConnect = NULL);
  808.     virtual void Append();
  809.  
  810.     virtual void Open(LPCTSTR lpszName);
  811.     virtual void Close();
  812.  
  813. // Attributes
  814. public:
  815.     CDaoDatabase* m_pDatabase;
  816.     DAOTableDef* m_pDAOTableDef;
  817.  
  818.     BOOL IsOpen() const;
  819.     BOOL CanUpdate();
  820.  
  821.     void SetName(LPCTSTR lpszName);
  822.     CString GetName();
  823.     void SetSourceTableName(LPCTSTR lpszSrcTableName);
  824.     CString GetSourceTableName();
  825.     void SetConnect(LPCTSTR lpszConnect);
  826.     CString GetConnect();
  827.     void SetAttributes(long lAttributes);
  828.     long GetAttributes();
  829.     COleDateTime GetDateCreated();
  830.     COleDateTime GetDateLastUpdated();
  831.     void SetValidationRule(LPCTSTR lpszValidationRule);
  832.     CString GetValidationRule();
  833.     void SetValidationText(LPCTSTR lpszValidationText);
  834.     CString GetValidationText();
  835.     long GetRecordCount();
  836.  
  837. // Overridables
  838. public:
  839.  
  840. // Operations
  841. public:
  842.     void CreateField(LPCTSTR lpszName, short nType, long lSize,
  843.         long lAttributes = 0);
  844.     void CreateField(CDaoFieldInfo& fieldinfo);
  845.     void DeleteField(LPCTSTR lpszName);
  846.     void DeleteField(int nIndex);
  847.  
  848.     void CreateIndex(CDaoIndexInfo& indexinfo);
  849.     void DeleteIndex(LPCTSTR lpszName);
  850.     void DeleteIndex(int nIndex);
  851.  
  852.     short GetFieldCount();
  853.     void GetFieldInfo(int nIndex, CDaoFieldInfo& fieldinfo,
  854.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  855.     void GetFieldInfo(LPCTSTR lpszName, CDaoFieldInfo& fieldinfo,
  856.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  857.  
  858.     short GetIndexCount();
  859.     void GetIndexInfo(int nIndex, CDaoIndexInfo& indexinfo,
  860.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  861.     void GetIndexInfo(LPCTSTR lpszName, CDaoIndexInfo& indexinfo,
  862.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  863.  
  864.     void RefreshLink();
  865.  
  866. // Implementation
  867. public:
  868.     ~CDaoTableDef();
  869.  
  870. #ifdef _DEBUG
  871.     virtual void AssertValid() const;
  872.     virtual void Dump(CDumpContext& dc) const;
  873. #endif
  874.  
  875.     DAOFields* m_pDAOFields;
  876.     DAOIndexes* m_pDAOIndexes;
  877.  
  878. protected:
  879.     BOOL m_bOpen;
  880.     BOOL m_bNew;
  881.  
  882.     void InitFieldsCollection();
  883.     void InitIndexesCollection();
  884.  
  885.     virtual void ThrowDaoException(int nError = NO_AFX_DAO_ERROR);
  886. };
  887.  
  888.  
  889. ////////////////////////////////////////////////////////////////////////
  890. // CDaoQueryDef - a DAO QueryDef
  891.  
  892. class CDaoQueryDef : public CObject
  893. {
  894.     DECLARE_DYNAMIC(CDaoQueryDef)
  895.  
  896. // Constructors
  897. public:
  898.     CDaoQueryDef(CDaoDatabase* pDatabase);
  899.  
  900.     virtual void Create(LPCTSTR lpszName = NULL,
  901.         LPCTSTR lpszSQL = NULL);
  902.     virtual void Append();
  903.  
  904.     virtual void Open(LPCTSTR lpszName = NULL);
  905.     virtual void Close();
  906.  
  907. // Attributes
  908. public:
  909.     CDaoDatabase* m_pDatabase;
  910.     DAOQueryDef* m_pDAOQueryDef;
  911.  
  912.     BOOL CanUpdate();
  913.  
  914.     CString GetName();
  915.     void SetName(LPCTSTR lpszName);
  916.     CString GetSQL();
  917.     void SetSQL(LPCTSTR lpszSQL);
  918.     short GetType();
  919.     COleDateTime GetDateCreated();
  920.     COleDateTime GetDateLastUpdated();
  921.     CString GetConnect();
  922.     void SetConnect(LPCTSTR lpszConnect);
  923.     short GetODBCTimeout();
  924.     void SetODBCTimeout(short nODBCTimeout);
  925.     BOOL GetReturnsRecords();
  926.     void SetReturnsRecords(BOOL bReturnsRecords);
  927.     long GetRecordsAffected();
  928.  
  929.     BOOL IsOpen() const;
  930.  
  931. // Operations
  932. public:
  933.     virtual void Execute(int nOptions = dbFailOnError);
  934.  
  935.     virtual COleVariant GetParamValue(LPCTSTR lpszName);
  936.     virtual COleVariant GetParamValue(int nIndex);
  937.     virtual void SetParamValue(LPCTSTR lpszName,
  938.         const COleVariant& varValue);
  939.     virtual void SetParamValue(int nIndex,
  940.         const COleVariant& varValue);
  941.     void SetParamValueNull(LPCTSTR lpszName);
  942.     void SetParamValueNull(int nIndex);
  943.  
  944.     short GetFieldCount();
  945.     void GetFieldInfo(int nIndex, CDaoFieldInfo& fieldinfo,
  946.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  947.     void GetFieldInfo(LPCTSTR lpszName, CDaoFieldInfo& fieldinfo,
  948.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  949.  
  950.     short GetParameterCount();
  951.     void GetParameterInfo(int nIndex, CDaoParameterInfo& paraminfo,
  952.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  953.     void GetParameterInfo(LPCTSTR lpszName,
  954.         CDaoParameterInfo& paraminfo,
  955.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  956.  
  957. // Overridables
  958. public:
  959.  
  960. // Implementation
  961. public:
  962.     ~CDaoQueryDef();
  963.  
  964. #ifdef _DEBUG
  965.     virtual void AssertValid() const;
  966.     virtual void Dump(CDumpContext& dc) const;
  967. #endif
  968.  
  969.     DAOFields* m_pDAOFields;
  970.     DAOParameters* m_pDAOParameters;
  971.  
  972. protected:
  973.     BOOL m_bOpen;
  974.     BOOL m_bNew;
  975.  
  976.     void InitFieldsCollection();
  977.     void InitParametersCollection();
  978.     void FillParameterInfo(DAOParameter* pDAOParameter,
  979.         CDaoParameterInfo& paraminfo, DWORD dwInfoOptions);
  980.  
  981.     virtual void ThrowDaoException(int nError = NO_AFX_DAO_ERROR);
  982. };
  983.  
  984.  
  985. ////////////////////////////////////////////////////////////////////////
  986. // CDaoRecordset - the result of a query or base table browse
  987.  
  988. class CDaoRecordset : public CObject
  989. {
  990.     DECLARE_DYNAMIC(CDaoRecordset)
  991.  
  992. // Constructor
  993. public:
  994.     CDaoRecordset(CDaoDatabase* pDatabase = NULL);
  995.  
  996.     virtual void Open(int nOpenType = AFX_DAO_USE_DEFAULT_TYPE,
  997.         LPCTSTR lpszSQL = NULL, int nOptions = 0);
  998.     virtual void Open(CDaoQueryDef* pQueryDef,
  999.         int nOpenType = dbOpenDynaset, int nOptions = 0);
  1000.     virtual void Open(CDaoTableDef* pTableDef,
  1001.         int nOpenType = dbOpenTable, int nOptions = 0);
  1002.     virtual void Close();
  1003.  
  1004. // Attributes
  1005. public:
  1006.     CDaoDatabase* m_pDatabase;  // Source database for this result set
  1007.     DAORecordset* m_pDAORecordset;
  1008.  
  1009.     CString m_strFilter;    // Filter string used when constructing SQL
  1010.     CString m_strSort;      // Sort string used when constructing SQL
  1011.  
  1012.     int m_nFields;
  1013.     int m_nParams;
  1014.  
  1015.     BOOL m_bCheckCacheForDirtyFields;   // Switch for dirty field checking.
  1016.  
  1017.     BOOL CanUpdate() const;
  1018.     BOOL CanAppend() const;
  1019.     BOOL CanScroll() const;
  1020.     BOOL CanRestart();
  1021.     BOOL CanTransact();
  1022.     BOOL CanBookmark();
  1023.  
  1024.     BOOL IsOpen() const;
  1025.     BOOL IsBOF();
  1026.     BOOL IsEOF();
  1027.     BOOL IsDeleted() const;
  1028.  
  1029.     BOOL IsFieldDirty(void* pv);
  1030.     BOOL IsFieldNull(void* pv);
  1031.     BOOL IsFieldNullable(void* pv);
  1032.  
  1033.     CString GetName();
  1034.     short GetType();
  1035.     short GetEditMode();
  1036.     CString GetSQL() const;
  1037.  
  1038.     COleDateTime GetDateCreated();
  1039.     COleDateTime GetDateLastUpdated();
  1040.     COleVariant GetLastModifiedBookmark();
  1041.     CString GetValidationRule();
  1042.     CString GetValidationText();
  1043.     CString GetCurrentIndex();
  1044.     void SetCurrentIndex(LPCTSTR lpszIndex);
  1045.  
  1046.     long GetRecordCount();
  1047.  
  1048. // Operations
  1049. public:
  1050.     // Cursor operations
  1051.     void MoveNext();
  1052.     void MovePrev();
  1053.     void MoveFirst();
  1054.     void MoveLast();
  1055.     virtual void Move(long lRows);
  1056.  
  1057.     BOOL FindNext(LPCTSTR lpszFilter);
  1058.     BOOL FindPrev(LPCTSTR lpszFilter);
  1059.     BOOL FindFirst(LPCTSTR lpszFilter);
  1060.     BOOL FindLast(LPCTSTR lpszFilter);
  1061.     virtual BOOL Find(long lFindType, LPCTSTR lpszFilter);
  1062.  
  1063.     COleVariant GetBookmark();
  1064.     void SetBookmark(COleVariant varBookmark);
  1065.     long GetAbsolutePosition();
  1066.     void SetAbsolutePosition(long lPosition);
  1067.     float GetPercentPosition();
  1068.     void SetPercentPosition(float fPosition);
  1069.  
  1070.     // seek allowed on recordset opened as tables (max keys = 13)
  1071.     BOOL Seek(LPCTSTR lpszComparison, COleVariant* pKey1,
  1072.         COleVariant* pKey2 = NULL, COleVariant* pKey3 = NULL);
  1073.     BOOL Seek(LPCTSTR lpszComparison, COleVariant* pKeyArray, WORD nKeys);
  1074.  
  1075.     // edit buffer operations
  1076.     virtual void AddNew();
  1077.     virtual void Edit();
  1078.     virtual void Update();
  1079.     virtual void Delete();
  1080.     virtual void CancelUpdate();
  1081.  
  1082.     // field operations
  1083.     virtual COleVariant GetFieldValue(LPCTSTR lpszName);
  1084.     virtual COleVariant GetFieldValue(int nIndex);
  1085.     virtual void SetFieldValue(LPCTSTR lpszName,
  1086.         const COleVariant& varValue);
  1087.     virtual void SetFieldValue(int nIndex,
  1088.         const COleVariant& varValue);
  1089.     void SetFieldValue(int nIndex, LPCTSTR lpszValue);
  1090.     void SetFieldValue(LPCTSTR lpszName, LPCTSTR lpszValue);
  1091.     void SetFieldValueNull(LPCTSTR lpszName);
  1092.     void SetFieldValueNull(int nIndex);
  1093.  
  1094.     virtual COleVariant GetParamValue(LPCTSTR lpszName);
  1095.     virtual COleVariant GetParamValue(int nIndex);
  1096.     virtual void SetParamValue(LPCTSTR lpszName,
  1097.         const COleVariant& varValue);
  1098.     virtual void SetParamValue(int nIndex,
  1099.         const COleVariant& varValue);
  1100.     void SetParamValueNull(LPCTSTR lpszName);
  1101.     void SetParamValueNull(int nIndex);
  1102.  
  1103.     void SetFieldDirty(void* pv, BOOL bDirty = TRUE);
  1104.     void SetFieldNull(void* pv, BOOL bNull = TRUE);
  1105.  
  1106.     void SetLockingMode(BOOL bPessimistic);
  1107.     BOOL GetLockingMode();
  1108.  
  1109.     // Recordset operations
  1110.     virtual void Requery();
  1111.  
  1112.     // Jet's remote data caching operations
  1113.     void SetCacheStart(COleVariant varBookmark);
  1114.     COleVariant GetCacheStart();
  1115.     void SetCacheSize(long lSize);
  1116.     long GetCacheSize();
  1117.     void FillCache(long* pSize = NULL, COleVariant* pBookmark = NULL);
  1118.  
  1119.     short GetFieldCount();
  1120.     void GetFieldInfo(int nIndex, CDaoFieldInfo& fieldinfo,
  1121.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  1122.     void GetFieldInfo(LPCTSTR lpszName, CDaoFieldInfo& fieldinfo,
  1123.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  1124.  
  1125.     short GetIndexCount();
  1126.     void GetIndexInfo(int nIndex, CDaoIndexInfo& indexinfo,
  1127.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  1128.     void GetIndexInfo(LPCTSTR lpszName, CDaoIndexInfo& indexinfo,
  1129.         DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
  1130.  
  1131. // Overridables
  1132. public:
  1133.     virtual CString GetDefaultDBName();
  1134.     virtual CString GetDefaultSQL();
  1135.  
  1136.     // for recordset field exchange
  1137.     virtual void DoFieldExchange(CDaoFieldExchange* pFX);
  1138.  
  1139. // Implementation
  1140. public:
  1141.     virtual ~CDaoRecordset();
  1142.  
  1143. #ifdef _DEBUG
  1144.     virtual void AssertValid() const;
  1145.     virtual void Dump(CDumpContext& dc) const;
  1146. #endif
  1147.  
  1148.     CString m_strSQL;
  1149.  
  1150.     CDaoQueryDef* m_pQueryDef;  // Source query for this result set
  1151.     CDaoTableDef* m_pTableDef;
  1152.     ICDAORecordset* m_pICDAORecordsetGetRows;
  1153.     DAOFields* m_pDAOFields;
  1154.     DAOIndexes* m_pDAOIndexes;
  1155.  
  1156.     void ResetCursor();
  1157.     void SetCursorAttributes();
  1158.     void ResetCursorAttributes();
  1159.     void GetDataAndFixupNulls();
  1160.     DWORD GetFieldLength(int nFieldIndex);
  1161.  
  1162.     BOOL IsFieldStatusDirty(UINT nField);
  1163.     void SetDirtyFieldStatus(UINT nField);
  1164.     void ClearDirtyFieldStatus(UINT nField);
  1165.  
  1166.     BOOL IsFieldStatusNull(UINT nField);
  1167.     void SetNullFieldStatus(UINT nField);
  1168.     void ClearNullFieldStatus(UINT nField);
  1169.  
  1170.     BOOL IsFieldStatusNullable(UINT nField);
  1171.     void SetNullableFieldStatus(UINT nField);
  1172.  
  1173.     BOOL IsFieldStatusNullableKnown(UINT nField);
  1174.     void SetNullableKnownFieldStatus(UINT nField);
  1175.  
  1176.     void ClearFieldStatusFlags();
  1177.     BOOL IsMatch();
  1178.  
  1179.     DWORD m_cbFixedLengthFields;
  1180.     DAOCOLUMNBINDING* m_prgDaoColBindInfo;
  1181.     DWORD* m_pulColumnLengths;
  1182.     DAOFETCHROWS m_DaoFetchRows;
  1183.     BYTE* m_pbFieldFlags;
  1184.     BYTE* m_pbParamFlags;
  1185.  
  1186.     CMapPtrToPtr* m_pMapFieldCache;
  1187.     CMapPtrToPtr* m_pMapFieldIndex;
  1188.  
  1189.     static void AFX_CDECL StripBrackets(LPCTSTR lpszSrc, LPTSTR lpszDest);
  1190.  
  1191. protected:
  1192.     BOOL m_bOpen;
  1193.     int m_nStatus;
  1194.  
  1195.     BOOL m_bAppendable;
  1196.     BOOL m_bScrollable;
  1197.     BOOL m_bDeleted;
  1198.  
  1199.     int m_nOpenType;
  1200.     int m_nDefaultType;
  1201.     int m_nOptions;
  1202.  
  1203.     CString m_strRequerySQL;
  1204.     CString m_strRequeryFilter;
  1205.     CString m_strRequerySort;
  1206.  
  1207.     void BuildSQL();
  1208.     void AllocDatabase();
  1209.  
  1210.     // RFX Operation Cover Functions
  1211.     void BuildSelectList();
  1212.     void BuildParameterList();
  1213.     void BindFields();
  1214.     void BindParameters();
  1215.     void Fixup();
  1216.     void AllocCache();
  1217.     void StoreFields();
  1218.     void LoadFields();
  1219.     void FreeCache();
  1220.     void MarkForEdit();
  1221.     void MarkForAddNew();
  1222.     int GetFieldIndex(void* pv);
  1223.     virtual void SetDirtyFields();
  1224.  
  1225.     void InitFieldsCollection();
  1226.     void InitIndexesCollection();
  1227.  
  1228.     virtual void ThrowDaoException(int nError = NO_AFX_DAO_ERROR);
  1229.  
  1230.     friend class CDaoFieldExchange;
  1231.     friend class CDaoRecordView;
  1232. };
  1233.  
  1234. /////////////////////////////////////////////////////////////////////////////
  1235. // CDaoRecordView - form for viewing data records
  1236.  
  1237. class CDaoRecordView : public CFormView
  1238. {
  1239.     DECLARE_DYNAMIC(CDaoRecordView)
  1240.  
  1241. // Construction
  1242. protected:  // must derive your own class
  1243.     CDaoRecordView(LPCTSTR lpszTemplateName);
  1244.     CDaoRecordView(UINT nIDTemplate);
  1245.  
  1246. // Attributes
  1247. public:
  1248.     virtual CDaoRecordset* OnGetRecordset() = 0;
  1249.  
  1250.     BOOL IsOnLastRecord();
  1251.     BOOL IsOnFirstRecord();
  1252.  
  1253. // Operations
  1254. public:
  1255.     virtual BOOL OnMove(UINT nIDMoveCommand);
  1256.  
  1257. // Implementation
  1258. public:
  1259.     virtual ~CDaoRecordView();
  1260. #ifdef _DEBUG
  1261.     virtual void AssertValid() const;
  1262.     virtual void Dump(CDumpContext& dc) const;
  1263. #endif
  1264.     virtual void OnInitialUpdate();
  1265.  
  1266. protected:
  1267.     int m_nStatus;
  1268.     COleVariant m_varBookmarkCurrent;
  1269.     COleVariant m_varBookmarkFirst;
  1270.     COleVariant m_varBookmarkLast;
  1271.  
  1272.     //{{AFX_MSG(CDaoRecordView)
  1273.     afx_msg void OnUpdateRecordFirst(CCmdUI* pCmdUI);
  1274.     afx_msg void OnUpdateRecordPrev(CCmdUI* pCmdUI);
  1275.     afx_msg void OnUpdateRecordNext(CCmdUI* pCmdUI);
  1276.     afx_msg void OnUpdateRecordLast(CCmdUI* pCmdUI);
  1277.     //}}AFX_MSG
  1278.     afx_msg void OnMove(int cx, int cy);
  1279.  
  1280.     DECLARE_MESSAGE_MAP()
  1281. };
  1282.  
  1283. /////////////////////////////////////////////////////////////////////////////
  1284. // DAODBEngine helpers - implementation specific and undocumented
  1285. void AFXAPI AfxDaoInit();
  1286. DAODBEngine* AFXAPI AfxDaoGetEngine();
  1287. void AFXAPI AfxDaoTerm();
  1288.  
  1289. /////////////////////////////////////////////////////////////////////////////
  1290. // Inline function declarations
  1291.  
  1292. #ifdef _AFX_PACKING
  1293. #pragma pack(pop)
  1294. #endif
  1295.  
  1296. #ifdef _AFX_ENABLE_INLINES
  1297. #define _AFXDAOCORE_INLINE inline
  1298. #define _AFXDAODFX_INLINE inline
  1299. #define _AFXDAOVIEW_INLINE inline
  1300. #include <afxdao.inl>
  1301. #undef _AFXDAOCORE_INLINE
  1302. #undef _AFXDAODFX_INLINE
  1303. #undef _AFXDAOVIEW_INLINE
  1304. #endif
  1305.  
  1306. #undef AFX_DATA
  1307. #define AFX_DATA
  1308.  
  1309. #ifdef _AFX_MINREBUILD
  1310. #pragma component(minrebuild, on)
  1311. #endif
  1312. #ifndef _AFX_FULLTYPEINFO
  1313. #pragma component(mintypeinfo, off)
  1314. #endif
  1315.  
  1316. #endif //__AFXDAO_H__
  1317.  
  1318. /////////////////////////////////////////////////////////////////////////////
  1319.