为TRUE将允许更新,如果你只想检查字段的值而不想改变它那么就设置为FALSE。
Precision
数字型变量的位数。
Scale
数字型变量的小数位数。
Length
一个4字节变量的名字。该变量将包含缓冲区中数据的实际长度。
状态值
变量Status的值指示了一个字段的值是否被成功的拷贝到了对应的变量中。写数据时,可以给Status赋值为adFldNull来指示该字段将被设置为null。
常量
值
描述
adFldOK
0
一个非空的字段值被返回。
adFldBadAccessor
1
绑定无效。
adFldCantConvertValue
2
值因为符号不匹配或超界外的原因导致无法被正确转换。
adFldNull
3
读字段值时,指示一个空值被返回。写字段值时,指示当字段自身无法编码NULL时该字段将被设置为NULL。
adFldTruncated
4
变长数据或数字被截断。
adFldSignMismatch
5
值是有符号数,而数据类型是无符号数。
adFldDataOverFlow
6
数据值超出界限。
adFldCantCreate
7
不知名的列类型和字段已经被打开。
adFldUnavailable
8
字段值无法确定。比如一个新的未赋值的无缺省值的字段。
adFldPermissionDenied
9
未被允许更新数据。
adFldIntegrityViolation
10
更新字段时值违反了列的完整性要求。
adFldSchemaViolation
11
更新字段时值违反了列的规范要求。
adFldBadStatus
12
更新字段时,无效的状态参数。
adFldDefault
13
更新字段时,使用缺省值。
使用VC++对ADO的扩展的示例
在这个例子中,还使用了COM专有的“智能指针”功能,它能自动处理IADORecordBinding接口的QueryInterface和引用计数。如果没有智能指针,你得这样编码:
IADORecordBinding *picRs = NULL;
TESTHR(pRs->QueryInterface(
__uuidof(IADORecordBinding), (LPVOID*)&picRs));
if (picRs) picRs->Release();
使用智能指针,你可以用这样的语句从IADORecordBinding接口派生IADORecordBindingPtr类型:
_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));
然后这样实例化指针:
IADORecordBindingPtr picRs(pRs);
因为VC++的扩展由Recordset对象实现,因此智能指针picRs的构造函数使用了_RecordsetPtr类指针pRs。构造函数利用pRs调用QueryInterface来获得IADORecordBinding接口。
// 以下即是示例
程序#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>
#include <icrsint.h>
_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));
inline void TESTHR(HRESULT _hr) { if FAILED(_hr) _com_issue_error(_hr); }
class CCustomRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs)
ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_ch_fname,
sizeof(m_ch_fname), m_ul_fnameStatus, false)
ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_ch_lname,
sizeof(m_ch_lname), m_ul_lnameStatus, false)
END_ADO_BINDING()
public:
CHAR m_ch_fname[22];
CHAR m_ch_lname[32];
ULONG m_ul_fn