📄 afxdb.h
字号:
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:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -