下列头文件 (icrsint.h) 详细说明了允许客户提取一行数据并直接送至类数据成员的接口。客户程序需要在其类中包含绑定条目,以指定 Recordset Field 对象和类数据成员之间的关联。
#ifndef _ICRSINT_H_
#define _ICRSINT_H_
#include <olectl.h>
#include <stddef.h>
// forwards
class CADORecordBinding;
#define classoffset(base, derived) \
((DWORD)(static_cast<base*>((derived*)8))-8)
enum FieldStatusEnum
{
adFldOK = 0,
adFldBadAccessor = 1,
adFldCantConvertValue = 2,
adFldNull = 3,
adFldTruncated = 4,
adFldSignMismatch = 5,
adFldDataOverFlow = 6,
adFldCantCreate = 7,
adFldUnavailable = 8,
adFldPermissionDenied = 9,
adFldIntegrityViolation = 10,
adFldSchemaViolation = 11,
adFldBadStatus = 12,
adFldDefault = 13
};
typedef struct stADO_BINDING_ENTRY
{
ULONG ulOrdinal;
WORD wDataType;
BYTE bPrecision;
BYTE bScale;
ULONG ulSize;
ULONG ulOffSet;
ULONG ulIADOBindingEntriesOffSet;
ULONG ulFldStatusOffset;
BOOL fModify;
} ADO_BINDING_ENTRY;
#define BEGIN_ADO_BINDING(cls) public: \
typedef cls ADORowClass; \
const ADO_BINDING_ENTRY* STDMETHODCALLTYPE GetADOBindingEntries() { \
static const ADO_BINDING_ENTRY rgADOBindingEntries[] = {
#define ADO_FIXED_LENGTH_BINDING_ENTRY(Ordinal, DataType, Buffer, \ Status, Modify)\
{Ordinal, \
DataType, \
0, \
0, \
0, \
offsetof(ADORowClass, Buffer), \
classoffset(CADORecordBinding, ADORowClass), \
offsetof(ADORowClass, Status), \
Modify},
#define ADO_NUMERIC_BINDING_ENTRY(Ordinal, DataType, \
Buffer, Precision, Scale, Status, Modify)\
{Ordinal, \
DataType, \
Precision, \
Scale, \
0, \
offsetof(ADORowClass, Buffer), \
classoffset(CADORecordBinding, ADORowClass), \
offsetof(ADORowClass, Status), \
Modify},
#define ADO_VARIABLE_LENGTH_BINDING_ENTRY(Ordinal, DataType, \
Buffer, Size, Status, Modify)\
{Ordinal, \
DataType, \
0, \
0, \
Size, \
offsetof(ADORowClass, Buffer), \
classoffset(CADORecordBinding, ADORowClass), \
offsetof(ADORowClass, Status), \
Modify},
#define END_ADO_BINDING() {0, adEmpty, 0, 0, 0, 0, 0, adFldOK, FALSE}};\
return rgADOBindingEntries;}
//
// 客户端“record”类需要支持的接口。
// ADO 绑定条目提供执行该接口。
//
class CADORecordBinding
{
public:
STDMETHOD_(const ADO_BINDING_ENTRY*, GetADOBindingEntries)
(VOID) PURE;
};
//
// 接口允许客户程序获取数据记录并传递给类数据成员。
//
DEFINE_GUID(IID_IADORecordBinding,
0x00000544, 0, 0x10, 0x80,0,0,0xAA,0,0x6D,0x2E,0xA4);
DECLARE_INTERFACE_(IADORecordBinding, IUnknown)
{
public:
STDMETHOD(BindToRecordset)(CADORecordBinding *pAdoRecordBinding)PURE;
STDMETHOD(AddNew)(CADORecordBinding *pAdoRecordBinding) PURE;
STDMETHOD(Update)(CADORecordBinding *pAdoRecordBinding) PURE;
};
#endif // !_ICRSINT_H_