| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061 | 
							- // This is a part of the Microsoft Foundation Classes C++ library.
 
- // Copyright (C) 1992-1998 Microsoft Corporation
 
- // All rights reserved.
 
- //
 
- // This source code is only intended as a supplement to the
 
- // Microsoft Foundation Classes Reference and related
 
- // electronic documentation provided with the library.
 
- // See these sources for detailed information regarding the
 
- // Microsoft Foundation Classes product.
 
- #ifndef __AFXDB_H__
 
- #define __AFXDB_H__
 
- #ifdef _AFX_NO_DB_SUPPORT
 
- 	#error Database classes not supported in this library variant.
 
- #endif
 
- #ifndef __AFXEXT_H__
 
- 	#include <afxext.h>
 
- #endif
 
- #ifndef __AFXDB__H__
 
- 	#include <afxdb_.h> // shared header DAO database classes
 
- #endif
 
- // include standard SQL/ODBC "C" APIs
 
- #ifndef __SQL
 
- 	#define SQL_NOUNICODEMAP
 
- 	#include <sql.h>        // core
 
- #endif
 
- #ifndef __SQLEXT
 
- 	#include <sqlext.h>     // extensions
 
- #endif
 
- #ifdef _AFX_MINREBUILD
 
- #pragma component(minrebuild, off)
 
- #endif
 
- #ifndef _AFX_FULLTYPEINFO
 
- #pragma component(mintypeinfo, on)
 
- #endif
 
- #ifndef _AFX_NOFORCE_LIBS
 
- /////////////////////////////////////////////////////////////////////////////
 
- // Win32 libraries
 
- #ifdef _AFXDLL
 
- 	#if defined(_DEBUG) && !defined(_AFX_MONOLITHIC)
 
- 		#ifndef _UNICODE
 
- 			#pragma comment(lib, "mfcd42d.lib")
 
- 		#else
 
- 			#pragma comment(lib, "mfcd42ud.lib")
 
- 		#endif
 
- 	#endif
 
- #endif
 
- #pragma comment(lib, "odbc32.lib")
 
- #pragma comment(lib, "odbccp32.lib")
 
- #endif //!_AFX_NOFORCE_LIBS
 
- /////////////////////////////////////////////////////////////////////////////
 
- #ifdef _AFX_PACKING
 
- #pragma pack(push, _AFX_PACKING)
 
- #endif
 
- /////////////////////////////////////////////////////////////////////////////
 
- // AFXDB - MFC SQL/ODBC/Database support
 
- // Classes declared in this file
 
- 	//CException
 
- 		class CDBException;    // abnormal return value
 
- 	//CFieldExchange
 
- 		class CFieldExchange;       // Recordset Field Exchange
 
- 	//CObject
 
- 		class CDatabase;    // Connecting to databases
 
- 		class CRecordset;   // Data result sets
 
- //CObject
 
- 	//CCmdTarget;
 
- 		//CWnd
 
- 			//CView
 
- 				//CScrollView
 
- 					//CFormView
 
- 						class CRecordView;     // view records with a form
 
- // Non CObject classes
 
- class CDBVariant;
 
- struct CRecordsetStatus;
 
- struct CFieldInfo;
 
- struct CODBCFieldInfo;
 
- struct CODBCParamInfo;
 
- /////////////////////////////////////////////////////////////////////////////
 
- // ODBC helpers
 
- // return code left in 'nRetCode'
 
- // This MACRO is now out-of-date (kept for backward compatibility)
 
- #define AFX_ODBC_CALL(SQLFunc) \
 
- 	do \
 
- 	{ \
 
- 	} while ((nRetCode = (SQLFunc)) == SQL_STILL_EXECUTING)
 
- // Not really required, but kept for compatibilty
 
- #define AFX_SQL_SYNC(SQLFunc) \
 
- 	do \
 
- 	{ \
 
- 		nRetCode = SQLFunc; \
 
- 	} while (0)
 
- // Now out-of-date (prs not used) but kept for compatibility
 
- #define AFX_SQL_ASYNC(prs, SQLFunc) AFX_ODBC_CALL(SQLFunc)
 
- // Max display length in chars of timestamp (date & time) value
 
- #define TIMESTAMP_PRECISION 23
 
- // AFXDLL support
 
- #undef AFX_DATA
 
- #define AFX_DATA AFX_DB_DATA
 
- //  Miscellaneous sizing info
 
- #define MAX_CURRENCY     30     // Max size of Currency($) string
 
- #define MAX_TNAME_LEN    64     // Max size of table names
 
- #define MAX_FNAME_LEN    256    // Max size of field names
 
- #define MAX_DBNAME_LEN   32     // Max size of a database name
 
- #define MAX_DNAME_LEN    256        // Max size of Recordset names
 
- #define MAX_CONNECT_LEN  512        // Max size of Connect string
 
- #define MAX_CURSOR_NAME  18     // Max size of a cursor name
 
- #define DEFAULT_FIELD_TYPE SQL_TYPE_NULL // pick "C" data type to match SQL data type
 
- // Timeout and net wait defaults
 
- #define DEFAULT_LOGIN_TIMEOUT 15    // seconds to before fail on connect
 
- #define DEFAULT_QUERY_TIMEOUT 15    // seconds to before fail waiting for results
 
- // Field Flags, used to indicate status of fields
 
- #define AFX_SQL_FIELD_FLAG_DIRTY    0x1
 
- #define AFX_SQL_FIELD_FLAG_NULL     0x2
 
- // Update options flags
 
- #define AFX_SQL_SETPOSUPDATES       0x0001
 
- #define AFX_SQL_POSITIONEDSQL       0x0002
 
- #define AFX_SQL_GDBOUND             0x0004
 
- /////////////////////////////////////////////////////////////////////////////
 
- // CDBException - something gone wrong
 
- // Dbkit extended error codes
 
- #define AFX_SQL_ERROR                           1000
 
- #define AFX_SQL_ERROR_CONNECT_FAIL              AFX_SQL_ERROR+1
 
- #define AFX_SQL_ERROR_RECORDSET_FORWARD_ONLY    AFX_SQL_ERROR+2
 
- #define AFX_SQL_ERROR_EMPTY_COLUMN_LIST         AFX_SQL_ERROR+3
 
- #define AFX_SQL_ERROR_FIELD_SCHEMA_MISMATCH     AFX_SQL_ERROR+4
 
- #define AFX_SQL_ERROR_ILLEGAL_MODE              AFX_SQL_ERROR+5
 
- #define AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED    AFX_SQL_ERROR+6
 
- #define AFX_SQL_ERROR_NO_CURRENT_RECORD         AFX_SQL_ERROR+7
 
- #define AFX_SQL_ERROR_NO_ROWS_AFFECTED          AFX_SQL_ERROR+8
 
- #define AFX_SQL_ERROR_RECORDSET_READONLY        AFX_SQL_ERROR+9
 
- #define AFX_SQL_ERROR_SQL_NO_TOTAL              AFX_SQL_ERROR+10
 
- #define AFX_SQL_ERROR_ODBC_LOAD_FAILED          AFX_SQL_ERROR+11
 
- #define AFX_SQL_ERROR_DYNASET_NOT_SUPPORTED     AFX_SQL_ERROR+12
 
- #define AFX_SQL_ERROR_SNAPSHOT_NOT_SUPPORTED    AFX_SQL_ERROR+13
 
- #define AFX_SQL_ERROR_API_CONFORMANCE           AFX_SQL_ERROR+14
 
- #define AFX_SQL_ERROR_SQL_CONFORMANCE           AFX_SQL_ERROR+15
 
- #define AFX_SQL_ERROR_NO_DATA_FOUND             AFX_SQL_ERROR+16
 
- #define AFX_SQL_ERROR_ROW_UPDATE_NOT_SUPPORTED  AFX_SQL_ERROR+17
 
- #define AFX_SQL_ERROR_ODBC_V2_REQUIRED          AFX_SQL_ERROR+18
 
- #define AFX_SQL_ERROR_NO_POSITIONED_UPDATES     AFX_SQL_ERROR+19
 
- #define AFX_SQL_ERROR_LOCK_MODE_NOT_SUPPORTED   AFX_SQL_ERROR+20
 
- #define AFX_SQL_ERROR_DATA_TRUNCATED            AFX_SQL_ERROR+21
 
- #define AFX_SQL_ERROR_ROW_FETCH                 AFX_SQL_ERROR+22
 
- #define AFX_SQL_ERROR_INCORRECT_ODBC            AFX_SQL_ERROR+23
 
- #define AFX_SQL_ERROR_UPDATE_DELETE_FAILED      AFX_SQL_ERROR+24
 
- #define AFX_SQL_ERROR_DYNAMIC_CURSOR_NOT_SUPPORTED  AFX_SQL_ERROR+25
 
- #define AFX_SQL_ERROR_FIELD_NOT_FOUND           AFX_SQL_ERROR+26
 
- #define AFX_SQL_ERROR_BOOKMARKS_NOT_SUPPORTED   AFX_SQL_ERROR+27
 
- #define AFX_SQL_ERROR_BOOKMARKS_NOT_ENABLED     AFX_SQL_ERROR+28
 
- #define AFX_SQL_ERROR_MAX                       AFX_SQL_ERROR+29
 
- class CDBException : public CException
 
- {
 
- 	DECLARE_DYNAMIC(CDBException)
 
- // Attributes
 
- public:
 
- 	RETCODE m_nRetCode;
 
- 	CString m_strError;
 
- 	CString m_strStateNativeOrigin;
 
- // Implementation (use AfxThrowDBException to create)
 
- public:
 
- 	CDBException(RETCODE nRetCode = SQL_SUCCESS);
 
- 	virtual void BuildErrorString(CDatabase* pdb, HSTMT hstmt,
 
- 		BOOL bTrace = TRUE);
 
- 	void Empty();
 
- 	virtual ~CDBException();
 
- 	virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError,
 
- 		PUINT pnHelpContext = NULL);
 
- #ifdef _DEBUG
 
- 	void TraceErrorMessage(LPCTSTR szTrace) const;
 
- #endif // DEBUG
 
- };
 
- void AFXAPI AfxThrowDBException(RETCODE nRetCode, CDatabase* pdb, HSTMT hstmt);
 
- //////////////////////////////////////////////////////////////////////////////
 
- // CDatabase - a SQL Database
 
- class CDatabase : public CObject
 
- {
 
- 	DECLARE_DYNAMIC(CDatabase)
 
- // Constructors
 
- public:
 
- 	CDatabase();
 
- 	enum DbOpenOptions
 
- 	{
 
- 		openExclusive =         0x0001, // Not implemented
 
- 		openReadOnly =          0x0002, // Open database read only
 
- 		useCursorLib =          0x0004, // Use ODBC cursor lib
 
- 		noOdbcDialog =          0x0008, // Don't display ODBC Connect dialog
 
- 		forceOdbcDialog =       0x0010, // Always display ODBC connect dialog
 
- 	};
 
- 	virtual BOOL Open(LPCTSTR lpszDSN, BOOL bExclusive = FALSE,
 
- 		BOOL bReadonly = FALSE, LPCTSTR lpszConnect = _T("ODBC;"),
 
- 		BOOL bUseCursorLib = TRUE);
 
- 	virtual BOOL OpenEx(LPCTSTR lpszConnectString, DWORD dwOptions = 0);
 
- 	virtual void Close();
 
- // Attributes
 
- public:
 
- 	HDBC m_hdbc;
 
- 	BOOL IsOpen() const;        // Database successfully opened?
 
- 	BOOL CanUpdate() const;
 
- 	BOOL CanTransact() const;   // Are Transactions supported?
 
- 	CString GetDatabaseName() const;
 
- 	const CString& GetConnect() const;
 
- 	DWORD GetBookmarkPersistence() const;
 
- 	int GetCursorCommitBehavior() const;
 
- 	int GetCursorRollbackBehavior() const;
 
- // Operations
 
- public:
 
- 	void SetLoginTimeout(DWORD dwSeconds);
 
- 	void SetQueryTimeout(DWORD dwSeconds);
 
- 	// transaction control
 
- 	BOOL BeginTrans();
 
- 	BOOL CommitTrans();
 
- 	BOOL Rollback();
 
- 	void ExecuteSQL(LPCTSTR lpszSQL);
 
- 	// Cancel asynchronous operation
 
- 	void Cancel();
 
- // Overridables
 
- public:
 
- 	// set special options
 
- 	virtual void OnSetOptions(HSTMT hstmt);
 
- // Implementation
 
- public:
 
- 	virtual ~CDatabase();
 
- #ifdef _DEBUG
 
- 	virtual void AssertValid() const;
 
- 	virtual void Dump(CDumpContext& dc) const;
 
- 	BOOL m_bTransactionPending;
 
- #endif //_DEBUG
 
- 	// general error check
 
- 	virtual BOOL Check(RETCODE nRetCode) const;
 
- 	BOOL PASCAL CheckHstmt(RETCODE, HSTMT hstmt) const;
 
- 	// Note: CDatabase::BindParameters is now documented and is no longer
 
- 	//  officially 'implementation.'  Feel free to use it.  It stays here
 
- 	//  because moving it would break binary compatibility.
 
- 	virtual void BindParameters(HSTMT hstmt);
 
- 	void ReplaceBrackets(LPTSTR lpchSQL);
 
- 	BOOL m_bStripTrailingSpaces;
 
- 	BOOL m_bIncRecordCountOnAdd;
 
- 	BOOL m_bAddForUpdate;
 
- 	char m_chIDQuoteChar;
 
- 	char m_reserved1[3];        // pad to even 4 bytes
 
- 	void SetSynchronousMode(BOOL bSynchronous); // Obsolete, doe nothing
 
- protected:
 
- 	CString m_strConnect;
 
- 	CPtrList m_listRecordsets;  // maintain list to ensure CRecordsets all closed
 
- 	int nRefCount;
 
- 	BOOL m_bUpdatable;
 
- 	BOOL m_bTransactions;
 
- 	SWORD m_nTransactionCapable;
 
- 	SWORD m_nCursorCommitBehavior;
 
- 	SWORD m_nCursorRollbackBehavior;
 
- 	DWORD m_dwUpdateOptions;
 
- 	DWORD m_dwBookmarkAttributes;   // cache driver bookmark persistence
 
- 	DWORD m_dwLoginTimeout;
 
- 	HSTMT m_hstmt;
 
- 	DWORD m_dwQueryTimeout;
 
- 	virtual void ThrowDBException(RETCODE nRetCode);
 
- 	void AllocConnect(DWORD dwOptions);
 
- 	BOOL Connect(DWORD dwOptions);
 
- 	void VerifyConnect();
 
- 	void GetConnectInfo();
 
- 	void Free();
 
- 	// friend classes that call protected CDatabase overridables
 
- 	friend class CRecordset;
 
- 	friend class CFieldExchange;
 
- 	friend class CDBException;
 
- };
 
- //////////////////////////////////////////////////////////////////////////////
 
- // CFieldExchange - for field exchange
 
- class CFieldExchange
 
- {
 
- // Attributes
 
- public:
 
- 	enum RFX_Operation
 
- 	{
 
- 		BindParam,          // register users parameters with ODBC SQLBindParameter
 
- 		RebindParam,        //  migrate param values to proxy array before Requery
 
- 		BindFieldToColumn,  // register users fields with ODBC SQLBindCol
 
- 		BindFieldForUpdate, // temporarily bind columns before update (via SQLSetPos)
 
- 		UnbindFieldForUpdate,   // unbind columns after update (via SQLSetPos)
 
- 		Fixup,              // Set string lengths, clear status bits
 
- 		MarkForAddNew,      // Prepare fields and flags for addnew operation
 
- 		MarkForUpdate,      // Prepare fields and flags for update operation
 
- 		Name,               // append dirty field name
 
- 		NameValue,          // append dirty name=value
 
- 		Value,              // append dirty value or parameter marker
 
- 		SetFieldNull,       // Set status bit for null value
 
- 		StoreField,         // archive values of current record
 
- 		LoadField,          // reload archived values into current record
 
- 		AllocCache,         // allocate cache used for dirty field check
 
- 		AllocMultiRowBuffer,    // allocate buffer holding multi rows of data
 
- 		DeleteMultiRowBuffer,   // delete buffer holding multi rows of data
 
- #ifdef _DEBUG
 
- 		DumpField,          // dump bound field name and value
 
- #endif
 
- 	};
 
- 	UINT m_nOperation;  // Type of exchange operation
 
- 	CRecordset* m_prs;  // recordset handle
 
- // Operations
 
- 	enum FieldType
 
- 	{
 
- 		noFieldType     = -1,
 
- 		outputColumn    = 0,
 
- 		param           = SQL_PARAM_INPUT,
 
- 		inputParam      = param,
 
- 		outputParam     = SQL_PARAM_OUTPUT,
 
- 		inoutParam      = SQL_PARAM_INPUT_OUTPUT,
 
- 	};
 
- // Operations (for implementors of RFX procs)
 
- 	BOOL IsFieldType(UINT* pnField);
 
- 	// Indicate purpose of subsequent RFX calls
 
- 	void SetFieldType(UINT nFieldType);
 
- // Implementation
 
- 	CFieldExchange(UINT nOperation, CRecordset* prs, void* pvField = NULL);
 
- 	void Default(LPCTSTR szName,
 
- 		void* pv, LONG* plLength, int nCType, UINT cbValue, UINT cbPrecision);
 
- 	// long binary helpers
 
- 	long GetLongBinarySize(int nField);
 
- 	void GetLongBinaryData(int nField, CLongBinary& lb, long* plSize);
 
- 	BYTE* ReallocLongBinary(CLongBinary& lb, long lSizeRequired,
 
- 		long lReallocSize);
 
- 	// Current type of field
 
- 	UINT m_nFieldType;
 
- 	UINT m_nFieldFound;
 
- 	CString* m_pstr;    // Field name or destination for building various SQL clauses
 
- 	BOOL m_bField;      // Value to set for SetField operation
 
- 	void* m_pvField;    // For indicating an operation on a specific field
 
- 	LPCTSTR m_lpszSeparator; // append after field names
 
- 	UINT m_nFields;     // count of fields for various operations
 
- 	UINT m_nParams;     // count of fields for various operations
 
- 	UINT m_nParamFields;    // count of fields for various operations
 
- 	HSTMT m_hstmt;      // For SQLBindParameter on update statement
 
- 	long m_lDefaultLBFetchSize;     // For fetching CLongBinary data of unknown len
 
- 	long m_lDefaultLBReallocSize;   // For fetching CLongBinary data of unknown len
 
- #ifdef _DEBUG
 
- 	CDumpContext* m_pdcDump;
 
- #endif //_DEBUG
 
- };
 
- /////////////////////////////////////////////////////////////////////////////
 
- // Global helper
 
- HENV AFXAPI AfxGetHENV();
 
- /////////////////////////////////////////////////////////////////////////////
 
- // Recordset Field Exchange helpers
 
- void AFXAPI AfxStoreField(CRecordset& rs, UINT nField, void* pvField);
 
- void AFXAPI AfxLoadField(CRecordset& rs, UINT nField,
 
- 	void* pvField, long* plLength);
 
- BOOL AFXAPI AfxCompareValueByRef(void* pvData, void* pvCache, int nDataType);
 
- void AFXAPI AfxCopyValueByRef(void* pvCache, void* pvData,
 
- 	long* plLength, int nDataType);
 
- /////////////////////////////////////////////////////////////////////////////
 
- // Standard Recordset Field Exchange routines
 
- // text data
 
- void AFXAPI RFX_Text(CFieldExchange* pFX, LPCTSTR szName, CString& value,
 
- 	// Default max length for char and varchar, default datasource type
 
- 	int nMaxLength = 255, int nColumnType = SQL_VARCHAR, short nScale = 0);
 
- void AFXAPI RFX_Text(CFieldExchange* pFX, LPCTSTR szName, LPTSTR value,
 
- 	int nMaxLength, int nColumnType = SQL_VARCHAR, short nScale = 0);
 
- // boolean data
 
- void AFXAPI RFX_Bool(CFieldExchange* pFX, LPCTSTR szName, BOOL& value);
 
- // integer data
 
- void AFXAPI RFX_Long(CFieldExchange* pFX, LPCTSTR szName, long& value);
 
- void AFXAPI RFX_Int(CFieldExchange* pFX, LPCTSTR szName, int& value);
 
- void AFXAPI RFX_Single(CFieldExchange* pFX, LPCTSTR szName, float& value);
 
- void AFXAPI RFX_Double(CFieldExchange* pFX, LPCTSTR szName, double& value);
 
- // date and time
 
- void AFXAPI RFX_Date(CFieldExchange* pFX, LPCTSTR szName, CTime& value);
 
- void AFXAPI RFX_Date(CFieldExchange* pFX, LPCTSTR szName, TIMESTAMP_STRUCT& value);
 
- void AFXAPI RFX_Date(CFieldExchange* pFX, LPCTSTR szName, COleDateTime& value);
 
- // Binary data
 
- void AFXAPI RFX_Binary(CFieldExchange* pFX, LPCTSTR szName, CByteArray& value,
 
- 	// Default max length is for binary and varbinary
 
- 	int nMaxLength = 255);
 
- void AFXAPI RFX_Byte(CFieldExchange* pFX, LPCTSTR szName, BYTE& value);
 
- void AFXAPI RFX_LongBinary(CFieldExchange* pFX, LPCTSTR szName, CLongBinary& value);
 
- /////////////////////////////////////////////////////////////////////////////
 
- // Bulk Recordset Field Exchange helpers
 
- void AFXAPI AfxRFXBulkDefault(CFieldExchange* pFX, LPCTSTR szName,
 
- 	void* pv, long* rgLengths, int nCType, UINT cbValue);
 
- /////////////////////////////////////////////////////////////////////////////
 
- // Bulk Recordset Field Exchange routines
 
- void AFXAPI RFX_Text_Bulk(CFieldExchange* pFX, LPCTSTR szName,
 
- 	LPSTR* prgStrVals, long** prgLengths, int nMaxLength);
 
- void AFXAPI RFX_Bool_Bulk(CFieldExchange* pFX, LPCTSTR szName,
 
- 	BOOL** prgBoolVals, long** prgLengths);
 
- void AFXAPI RFX_Int_Bulk(CFieldExchange* pFX, LPCTSTR szName,
 
- 	int** prgIntVals, long** prgLengths);
 
- void AFXAPI RFX_Long_Bulk(CFieldExchange* pFX, LPCTSTR szName,
 
- 	long** prgLongVals, long** prgLengths);
 
- void AFXAPI RFX_Single_Bulk(CFieldExchange* pFX, LPCTSTR szName,
 
- 	float** prgFltVals, long** prgLengths);
 
- void AFXAPI RFX_Double_Bulk(CFieldExchange* pFX, LPCTSTR szName,
 
- 	double** prgDblVals, long** prgLengths);
 
- void AFXAPI RFX_Date_Bulk(CFieldExchange* pFX, LPCTSTR szName,
 
- 	TIMESTAMP_STRUCT** prgTSVals, long** prgLengths);
 
- void AFXAPI RFX_Byte_Bulk(CFieldExchange* pFX, LPCTSTR szName,
 
- 	BYTE** prgByteVals, long** prgLengths);
 
- void AFXAPI RFX_Binary_Bulk(CFieldExchange* pFX, LPCTSTR szName,
 
- 	BYTE** prgByteVals, long** prgLengths, int nMaxLength);
 
- /////////////////////////////////////////////////////////////////////////////
 
- // Database Dialog Data Exchange cover routines
 
- // Cover routines provide database semantics on top of DDX routines
 
- // simple text operations
 
- void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, BYTE& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, int& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, UINT& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, long& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, DWORD& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, CString& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, LPTSTR pstrValue,
 
- 	int nMaxLen, CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, double& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, float& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, CTime& value,
 
- 	CRecordset* pRecordset);
 
- // special control types
 
- void AFXAPI DDX_FieldCheck(CDataExchange* pDX, int nIDC, int& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldRadio(CDataExchange* pDX, int nIDC, int& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldLBString(CDataExchange* pDX, int nIDC,
 
- 	CString& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldCBString(CDataExchange* pDX, int nIDC,
 
- 	CString& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldLBIndex(CDataExchange* pDX, int nIDC, int& index,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldCBIndex(CDataExchange* pDX, int nIDC, int& index,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldLBStringExact(CDataExchange* pDX, int nIDC,
 
- 	CString& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldCBStringExact(CDataExchange* pDX, int nIDC,
 
- 	CString& value,
 
- 	CRecordset* pRecordset);
 
- void AFXAPI DDX_FieldScroll(CDataExchange* pDX, int nIDC, int& value,
 
- 	CRecordset* pRecordset);
 
- //////////////////////////////////////////////////////////////////////////////
 
- // CRecordset - the result of a SQL Statement
 
- #define AFX_DB_USE_DEFAULT_TYPE     (0xFFFFFFFF)
 
- // Most Move constants out of date
 
- // #define AFX_MOVE_FIRST      0x80000000L
 
- // #define AFX_MOVE_PREVIOUS   (-1L)
 
- #define AFX_MOVE_REFRESH    0L
 
- // #define AFX_MOVE_NEXT       (+1L)
 
- // #define AFX_MOVE_LAST       0x7fffffffL
 
- #define AFX_RECORDSET_STATUS_OPEN    (+1L)
 
- #define AFX_RECORDSET_STATUS_CLOSED  0L
 
- #define AFX_RECORDSET_STATUS_UNKNOWN (-1L)
 
- class CRecordset : public CObject
 
- {
 
- 	DECLARE_DYNAMIC(CRecordset)
 
- // Constructor
 
- public:
 
- 	CRecordset(CDatabase* pDatabase = NULL);
 
- public:
 
- 	virtual ~CRecordset();
 
- 	enum OpenType
 
- 	{
 
- 		dynaset,        // uses SQLExtendedFetch, keyset driven cursor
 
- 		snapshot,       // uses SQLExtendedFetch, static cursor
 
- 		forwardOnly,    // uses SQLFetch
 
- 		dynamic         // uses SQLExtendedFetch, dynamic cursor
 
- 	};
 
- 	enum OpenOptions
 
- 	{
 
- 		none =                      0x0,
 
- 		readOnly =                  0x0004,
 
- 		appendOnly =                0x0008,
 
- 		skipDeletedRecords =        0x0010, // turn on skipping of deleted records, Will slow Move(n).
 
- 		noDirtyFieldCheck =         0x0020, // disable automatic dirty field checking
 
- 		useBookmarks =              0x0100, // turn on bookmark support
 
- 		useMultiRowFetch =          0x0200, // turn on multi-row fetch model
 
- 		userAllocMultiRowBuffers =  0x0400, // if multi-row fetch on, user will alloc memory for buffers
 
- 		useExtendedFetch =          0x0800, // use SQLExtendedFetch with forwardOnly type recordsets
 
- 		executeDirect =             0x2000, // Directly execute SQL rather than prepared execute
 
- 		optimizeBulkAdd =           0x4000, // Use prepared HSTMT for multiple AddNews, dirty fields must not change.
 
- 		firstBulkAdd =              0x8000, // INTERNAL to MFC, don't specify on Open.
 
- 	};
 
- 	virtual BOOL Open(UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
 
- 		LPCTSTR lpszSQL = NULL, DWORD dwOptions = none);
 
- 	virtual void Close();
 
- // Attributes
 
- public:
 
- 	HSTMT m_hstmt;          // Source statement for this resultset
 
- 	CDatabase* m_pDatabase;       // Source database for this resultset
 
- 	CString m_strFilter;        // Where clause
 
- 	CString m_strSort;      // Order By Clause
 
- 	BOOL CanAppend() const;     // Can AddNew be called?
 
- 	BOOL CanRestart() const;    // Can Requery be called to restart a query?
 
- 	BOOL CanScroll() const;     // Can MovePrev and MoveFirst be called?
 
- 	BOOL CanTransact() const;   // Are Transactions supported?
 
- 	BOOL CanUpdate() const;     // Can Edit/AddNew/Delete be called?
 
- 	BOOL CanBookmark() const;       // Can Get/SetBookmark be called?
 
- 	const CString& GetSQL() const;      // SQL executed for this recordset
 
- 	const CString& GetTableName() const;        // Table name
 
- 	BOOL IsOpen() const;        // Recordset successfully opened?
 
- 	BOOL IsBOF() const;     // Beginning Of File
 
- 	BOOL IsEOF() const;     // End Of File
 
- 	BOOL IsDeleted() const;     // On a deleted record
 
- 	BOOL IsFieldDirty(void *pv);    // has field been updated?
 
- 	BOOL IsFieldNull(void *pv); // is field NULL valued?
 
- 	BOOL IsFieldNullable(void *pv); // can field be set to a NULL value
 
- 	long GetRecordCount() const;        // Records seen so far or -1 if unknown
 
- 	void GetStatus(CRecordsetStatus& rStatus) const;
 
- // Operations
 
- public:
 
- 	// cursor operations
 
- 	void MoveNext();
 
- 	void MovePrev();
 
- 	void MoveFirst();
 
- 	void MoveLast();
 
- 	virtual void Move(long nRows, WORD wFetchType = SQL_FETCH_RELATIVE);
 
- 	void SetAbsolutePosition(long nRows);
 
- 	void GetBookmark(CDBVariant& varBookmark);
 
- 	void SetBookmark(const CDBVariant& varBookmark);
 
- 	virtual void SetRowsetSize(DWORD dwNewRowsetSize);
 
- 	DWORD GetRowsetSize() const;
 
- 	DWORD GetRowsFetched() const;
 
- 	virtual void CheckRowsetError(RETCODE nRetCode);
 
- 	void RefreshRowset(WORD wRow, WORD wLockType = SQL_LOCK_NO_CHANGE);
 
- 	void SetRowsetCursorPosition(WORD wRow, WORD wLockType = SQL_LOCK_NO_CHANGE);
 
- 	WORD GetRowStatus(WORD wRow) const;
 
- 	// edit buffer operations
 
- 	virtual void AddNew();      // add new record at the end
 
- 	virtual void Edit();        // start editing
 
- 	virtual BOOL Update();      // update it
 
- 	virtual void Delete();      // delete the current record
 
- 	void CancelUpdate();        // cancel pending Edit/AddNew
 
- 	BOOL FlushResultSet() const;
 
- 	// field operations
 
- 	short GetODBCFieldCount() const;
 
- 	void GetODBCFieldInfo(short nIndex, CODBCFieldInfo& fieldinfo);
 
- 	void GetODBCFieldInfo(LPCTSTR lpszName, CODBCFieldInfo& fieldinfo);
 
- 	void GetFieldValue(LPCTSTR lpszName, CDBVariant& varValue,
 
- 		short nFieldType = DEFAULT_FIELD_TYPE);
 
- 	void GetFieldValue(short nIndex, CDBVariant& varValue,
 
- 		short nFieldType = DEFAULT_FIELD_TYPE);
 
- 	void GetFieldValue(LPCTSTR lpszName, CString& strValue);
 
- 	void GetFieldValue(short nIndex, CString& strValue);
 
- 	void SetFieldDirty(void *pv, BOOL bDirty = TRUE);
 
- 	void SetFieldNull(void *pv, BOOL bNull = TRUE);
 
- 	void SetParamNull(int nIndex, BOOL bNull = TRUE);
 
- 	// locking control during Edit
 
- 	enum LockMode
 
- 	{
 
- 		optimistic,
 
- 		pessimistic,
 
- 	};
 
- 	void SetLockingMode(UINT nMode);
 
- 	// Recordset operations
 
- 	virtual BOOL Requery();         // Re-execute query based on new params
 
- 	// Cancel asynchronous operation
 
- 	void Cancel();
 
- // Overridables
 
- public:
 
- 	// Get default connect string
 
- 	virtual CString GetDefaultConnect();
 
- 	// Get SQL to execute
 
- 	virtual CString GetDefaultSQL();
 
- 	// set special options
 
- 	virtual void OnSetOptions(HSTMT hstmt);
 
- 	// for recordset field exchange
 
- 	virtual void DoFieldExchange(CFieldExchange* pFX);
 
- 	virtual void DoBulkFieldExchange(CFieldExchange* pFX);
 
- // Implementation
 
- public:
 
- #ifdef _DEBUG
 
- 	virtual void AssertValid() const;
 
- 	virtual void Dump(CDumpContext& dc) const;
 
- #endif //_DEBUG
 
- 	virtual BOOL Check(RETCODE nRetCode) const; // general error check
 
- 	void InitRecord();
 
- 	void ResetCursor();
 
- 	void CheckRowsetCurrencyStatus(UWORD wFetchType, long nRows);
 
- 	RETCODE FetchData(UWORD wFetchType, SDWORD nRow,
 
- 		DWORD* pdwRowsFetched);
 
- 	void SkipDeletedRecords(UWORD wFetchType, long nRows,
 
- 		DWORD* pdwRowsFetched, RETCODE* pnRetCode);
 
- 	virtual void SetRowsetCurrencyStatus(RETCODE nRetCode,
 
- 		UWORD wFetchType, long nRows, DWORD dwRowsFetched);
 
- 	virtual void PreBindFields();   // called before data fields are bound
 
- 	UINT m_nFields;         // number of RFX fields
 
- 	UINT m_nParams;         // number of RFX params
 
- 	BOOL m_bCheckCacheForDirtyFields;   // switch for dirty field checking
 
- 	BOOL m_bRebindParams;     // date or UNICODE text parameter existence flag
 
- 	BOOL m_bLongBinaryColumns;  // long binary column existence flag
 
- 	BOOL m_bUseUpdateSQL;   // uses SQL-based updates
 
- 	DWORD m_dwOptions;          // archive dwOptions on Open
 
- 	SWORD m_nResultCols;    // number of columns in result set
 
- 	BOOL m_bUseODBCCursorLib;   // uses ODBC cursor lib if m_pDatabase not Open
 
- 	CODBCFieldInfo* m_rgODBCFieldInfos; // Array of field info structs with ODBC meta-data
 
- 	CFieldInfo* m_rgFieldInfos;         // Array of field info structs with MFC specific field data
 
- 	CMapPtrToPtr m_mapFieldIndex;       // Map of member address to field index
 
- 	CMapPtrToPtr m_mapParamIndex;       // Map of member address to field index
 
- 	BOOL IsSQLUpdatable(LPCTSTR lpszSQL);
 
- 	BOOL IsSelectQueryUpdatable(LPCTSTR lpszSQL);
 
- 	static BOOL PASCAL IsJoin(LPCTSTR lpszJoinClause);
 
- 	static LPCTSTR PASCAL FindSQLToken(LPCTSTR lpszSQL, LPCTSTR lpszSQLToken);
 
- 	// RFX Operations on fields of CRecordset
 
- 	UINT BindParams(HSTMT hstmt);
 
- 	void RebindParams(HSTMT hstmt);
 
- 	UINT BindFieldsToColumns();
 
- 	void BindFieldsForUpdate();
 
- 	void UnbindFieldsForUpdate();
 
- 	void Fixups();
 
- 	UINT AppendNames(CString* pstr, LPCTSTR szSeparator);
 
- 	UINT AppendValues(HSTMT hstmt, CString* pstr, LPCTSTR szSeparator);
 
- 	UINT AppendNamesValues(HSTMT hstmt, CString* pstr, LPCTSTR szSeparator);
 
- 	void StoreFields();
 
- 	void LoadFields();
 
- 	void MarkForAddNew();
 
- 	void MarkForUpdate();
 
- 	void AllocDataCache();
 
- 	void FreeDataCache();
 
- #ifdef _DEBUG
 
- 	void DumpFields(CDumpContext& dc) const;
 
- #endif //_DEBUG
 
- 	// RFX operation helper functions
 
- 	virtual void ThrowDBException(RETCODE nRetCode, HSTMT hstmt = SQL_NULL_HSTMT);
 
- 	int GetBoundFieldIndex(void* pv);
 
- 	int GetBoundParamIndex(void* pv);
 
- 	short GetFieldIndexByName(LPCTSTR lpszFieldName);
 
- 	void AllocStatusArrays();
 
- 	long* GetFieldLengthBuffer(DWORD nField, int nFieldType);   // for fields & params
 
- 	BYTE GetFieldStatus(DWORD nField);
 
- 	void SetFieldStatus(DWORD nField, BYTE bFlags);
 
- 	void ClearFieldStatus();
 
- 	BOOL IsFieldStatusDirty(DWORD nField) const;
 
- 	void SetDirtyFieldStatus(DWORD nField);
 
- 	void ClearDirtyFieldStatus(DWORD nField);
 
- 	BOOL IsFieldStatusNull(DWORD nField) const;
 
- 	void SetNullFieldStatus(DWORD nField);
 
- 	void ClearNullFieldStatus(DWORD nField);
 
- 	BOOL IsParamStatusNull(DWORD nField) const;
 
- 	void SetNullParamStatus(DWORD nField);
 
- 	void ClearNullParamStatus(DWORD nField);
 
- 	BOOL IsFieldNullable(DWORD nField) const;
 
- 	void** m_pvFieldProxy;
 
- 	void** m_pvParamProxy;
 
- 	UINT m_nProxyFields;
 
- 	UINT m_nProxyParams;
 
- 	// GetFieldValue helpers
 
- 	static short PASCAL GetDefaultFieldType(short nSQLType);
 
- 	static void* PASCAL GetDataBuffer(CDBVariant& varValue, short nFieldType,
 
- 		int* pnLen, short nSQLType, UDWORD nPrecision);
 
- 	static int PASCAL GetTextLen(short nSQLType, UDWORD nPrecision);
 
- 	static long PASCAL GetData(CDatabase* pdb, HSTMT hstmt, short nFieldIndex,
 
- 		short nFieldType, LPVOID pvData, int nLen, short nSQLType);
 
- 	static void PASCAL GetLongBinaryDataAndCleanup(CDatabase* pdb, HSTMT hstmt,
 
- 		short nFieldIndex, long nActualSize, LPVOID* ppvData, int nLen,
 
- 		CDBVariant& varValue, short nSQLType);
 
- 	static void PASCAL GetLongCharDataAndCleanup(CDatabase* pdb, HSTMT hstmt,
 
- 		short nFieldIndex, long nActualSize, LPVOID* ppvData, int nLen,
 
- 		CString& strValue, short nSQLType);
 
- protected:
 
- 	UINT m_nOpenType;
 
- 	UINT m_nDefaultType;
 
- 	enum EditMode
 
- 	{
 
- 		noMode,
 
- 		edit,
 
- 		addnew
 
- 	};
 
- 	long m_lOpen;
 
- 	UINT m_nEditMode;
 
- 	BOOL m_bEOFSeen;
 
- 	long m_lRecordCount;
 
- 	long m_lCurrentRecord;
 
- 	CString m_strCursorName;
 
- 	// Perform operation based on m_nEditMode
 
- 	BOOL UpdateInsertDelete();
 
- 	BOOL m_nLockMode;       // Control concurrency for Edit()
 
- 	UDWORD m_dwDriverConcurrency;   // driver supported concurrency types
 
- 	UDWORD m_dwConcurrency; // requested concurrency type
 
- 	UWORD* m_rgRowStatus;     // row status used by SQLExtendedFetch and SQLSetPos
 
- 	DWORD m_dwRowsFetched;  // number of rows fetched by SQLExtendedFetch
 
- 	HSTMT m_hstmtUpdate;
 
- 	BOOL m_bRecordsetDb;
 
- 	BOOL m_bBOF;
 
- 	BOOL m_bEOF;
 
- 	BOOL m_bUpdatable;      // Is recordset updatable?
 
- 	BOOL m_bAppendable;
 
- 	CString m_strSQL;       // SQL statement for recordset
 
- 	CString m_strUpdateSQL; // SQL statement for updates
 
- 	CString m_strTableName;     // source table of recordset
 
- 	BOOL m_bScrollable; // supports MovePrev
 
- 	BOOL m_bDeleted;
 
- 	int m_nFieldsBound;
 
- 	BYTE* m_pbFieldFlags;
 
- 	BYTE* m_pbParamFlags;
 
- 	LONG* m_plParamLength;
 
- 	DWORD m_dwInitialGetDataLen;    // Initial GetFieldValue alloc size for long data
 
- 	DWORD m_dwRowsetSize;
 
- 	DWORD m_dwAllocatedRowsetSize;
 
- protected:
 
- 	CString m_strRequerySQL;    // archive SQL string for use in Requery()
 
- 	CString m_strRequeryFilter; // archive filter string for use in Requery()
 
- 	CString m_strRequerySort;   // archive sort string for use in Requery()
 
- 	void SetState(int nOpenType, LPCTSTR lpszSQL, DWORD dwOptions);
 
- 	BOOL AllocHstmt();
 
- 	void BuildSQL(LPCTSTR lpszSQL);
 
- 	void PrepareAndExecute();
 
- 	void BuildSelectSQL();
 
- 	void AppendFilterAndSortSQL();
 
- 	BOOL IsRecordsetUpdatable();
 
- 	void VerifyDriverBehavior();
 
- 	DWORD VerifyCursorSupport();
 
- 	void EnableBookmarks();
 
- 	void SetUpdateMethod();
 
- 	void SetConcurrencyAndCursorType(HSTMT hstmt, DWORD dwScrollOptions);
 
- 	void AllocAndCacheFieldInfo();
 
- 	void AllocRowset();
 
- 	void FreeRowset();
 
- 	void ExecuteSetPosUpdate();
 
- 	void PrepareUpdateHstmt();
 
- 	void BuildUpdateSQL();
 
- 	void ExecuteUpdateSQL();
 
- 	void SendLongBinaryData(HSTMT hstmt);
 
- 	virtual long GetLBFetchSize(long lOldSize);     // CLongBinary fetch chunking
 
- 	virtual long GetLBReallocSize(long lOldSize);   // CLongBinary realloc chunking
 
- 	friend class CFieldExchange;
 
- 	friend class CRecordView;
 
- };
 
- /////////////////////////////////////////////////////////////////////////////
 
- // Info helper definitions
 
- #define AFX_CURRENT_RECORD_UNDEFINED (-2)
 
- #define AFX_CURRENT_RECORD_BOF (-1)
 
- // For returning status for a recordset
 
- struct CRecordsetStatus
 
- {
 
- 	long m_lCurrentRecord;  // -2=Unknown,-1=BOF,0=1st record. . .
 
- 	BOOL m_bRecordCountFinal;// Have we counted all records?
 
- };
 
- // Must maintian data binding info
 
- struct CFieldInfo
 
- {
 
- 	// MFC specific info
 
- 	void* m_pvDataCache;
 
- 	long m_nLength;
 
- 	int m_nDataType;
 
- 	BYTE m_bStatus;
 
- #ifdef _DEBUG
 
- 	void* m_pvBindAddress;
 
- #endif
 
- };
 
- struct CODBCFieldInfo
 
- {
 
- 	// meta data from ODBC
 
- 	CString m_strName;
 
- 	SWORD m_nSQLType;
 
- 	UDWORD m_nPrecision;
 
- 	SWORD m_nScale;
 
- 	SWORD m_nNullability;
 
- };
 
- struct CODBCParamInfo
 
- {
 
- 	// meta data from ODBC
 
- 	SWORD m_nSQLType;
 
- 	UDWORD m_nPrecision;
 
- 	SWORD m_nScale;
 
- 	SWORD m_nNullability;
 
- };
 
- /////////////////////////////////////////////////////////////////////////////
 
- // CDBVariant
 
- #define DBVT_NULL       0
 
- #define DBVT_BOOL       1
 
- #define DBVT_UCHAR      2
 
- #define DBVT_SHORT      3
 
- #define DBVT_LONG       4
 
- #define DBVT_SINGLE     5
 
- #define DBVT_DOUBLE     6
 
- #define DBVT_DATE       7
 
- #define DBVT_STRING     8
 
- #define DBVT_BINARY     9
 
- class CDBVariant
 
- {
 
- // Constructor
 
- public:
 
- 	CDBVariant();
 
- // Attributes
 
- public:
 
- 	DWORD m_dwType;
 
- 	union
 
- 	{
 
- 	  BOOL              m_boolVal;
 
- 	  unsigned char     m_chVal;
 
- 	  short             m_iVal;
 
- 	  long              m_lVal;
 
- 	  float             m_fltVal;
 
- 	  double            m_dblVal;
 
- 	  TIMESTAMP_STRUCT* m_pdate;
 
- 	  CString*          m_pstring;
 
- 	  CLongBinary*      m_pbinary;
 
- 	};
 
- // Operations
 
- 	void Clear();
 
- // Implementation
 
- public:
 
- 	virtual ~CDBVariant();
 
- };
 
- /////////////////////////////////////////////////////////////////////////////
 
- // CRecordView - form for viewing data records
 
- #ifdef _AFXDLL
 
- class CRecordView : public CFormView
 
- #else
 
- class AFX_NOVTABLE CRecordView : public CFormView
 
- #endif
 
- {
 
- 	DECLARE_DYNAMIC(CRecordView)
 
- // Construction
 
- protected:  // must derive your own class
 
- 	CRecordView(LPCTSTR lpszTemplateName);
 
- 	CRecordView(UINT nIDTemplate);
 
- // Attributes
 
- public:
 
- 	virtual CRecordset* OnGetRecordset() = 0;
 
- 	BOOL IsOnLastRecord();
 
- 	BOOL IsOnFirstRecord();
 
- // Operations
 
- public:
 
- 	virtual BOOL OnMove(UINT nIDMoveCommand);
 
- // Implementation
 
- public:
 
- 	virtual ~CRecordView();
 
- #ifdef _DEBUG
 
- 	virtual void AssertValid() const;
 
- 	virtual void Dump(CDumpContext& dc) const;
 
- #endif
 
- 	virtual void OnInitialUpdate();
 
- protected:
 
- 	BOOL m_bOnFirstRecord;
 
- 	BOOL m_bOnLastRecord;
 
- 	//{{AFX_MSG(CRecordView)
 
- 	afx_msg void OnUpdateRecordFirst(CCmdUI* pCmdUI);
 
- 	afx_msg void OnUpdateRecordPrev(CCmdUI* pCmdUI);
 
- 	afx_msg void OnUpdateRecordNext(CCmdUI* pCmdUI);
 
- 	afx_msg void OnUpdateRecordLast(CCmdUI* pCmdUI);
 
- 	//}}AFX_MSG
 
- 	afx_msg void OnMove(int cx, int cy);
 
- private: BOOL _CallOnMove(UINT _x) {return OnMove(_x); } // __BORLANDC__ MS-BUG
 
- 	DECLARE_MESSAGE_MAP()
 
- };
 
- /////////////////////////////////////////////////////////////////////////////
 
- // Inline function declarations
 
- #ifdef _AFX_PACKING
 
- #pragma pack(pop)
 
- #endif
 
- #ifdef _AFX_ENABLE_INLINES
 
- #define _AFXDBCORE_INLINE AFX_INLINE
 
- #define _AFXDBRFX_INLINE AFX_INLINE
 
- #define _AFXDBVIEW_INLINE AFX_INLINE
 
- #include <afxdb.inl>
 
- #undef _AFXDBVIEW_INLINE
 
- #undef _AFXDBCORE_INLINE
 
- #undef _AFXDBRFX_INLINE
 
- #endif
 
- #undef AFX_DATA
 
- #define AFX_DATA
 
- #ifdef _AFX_MINREBUILD
 
- #pragma component(minrebuild, on)
 
- #endif
 
- #ifndef _AFX_FULLTYPEINFO
 
- #pragma component(mintypeinfo, off)
 
- #endif
 
- #endif //__AFXDB_H__
 
- /////////////////////////////////////////////////////////////////////////////
 
 
  |