【理解绑定单元中的宏】
绑定单元定义了Recordset字段和变量之间的联系。 宏BEGIN_ADO_BINDING(Class)(开始宏)和END_ADO_BINDING()(结束宏)界定了一组绑定单元。
绑定单元中的宏提供了对于下列字段类型的支持:
■定长类型的数据。例如 adDate 或 adBoolean
■数值型数据。例如 adTinyInt, adInteger, 以及 adDouble
■变长类型的数据。例如 adChar, adVarChar 以及 adVarBinary
所有的数值型数据,除了 adVarNumeric 类型之外,同时也都是定长类型的数据。
不同的宏定义使用不同类型的参数,这样你就可以排除不感兴趣的绑定信息。
■开始数据绑定
BEGIN_ADO_BINDING(Class)
■定长类型的数据
ADO_FIXED_LENGTH_ENTRY(Ordinal, DataType, Buffer, Status, Modify) ADO_FIXED_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Modify) |
■数值型数据
ADO_NUMERIC_ENTRY(Ordinal, DataType, Buffer, Precision, Scale, Status, Modify) ADO_NUMERIC_ENTRY2(Ordinal, DataType, Buffer, Precision, Scale, Modify) |
■可变长度类型的数据
ADO_VARIABLE_LENGTH_ENTRY(Ordinal, DataType, Buffer, Size, Status, Length, Modify) ADO_VARIABLE_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Size, Status, Modify) ADO_VARIABLE_LENGTH_ENTRY3(Ordinal, DataType, Buffer, Size, Length, Modify) ADO_VARIABLE_LENGTH_ENTRY4(Ordinal, DataType, Buffer, Size, Modify) |
■结束数据绑定
END_ADO_BINDING()
参数: | 描述 | Class: | 绑定单元和C/C++变量定义所在的类。 | Ordinal: | 序数类型,从1开始计数的Recordset字段序号,该字段对应于指定的C/C++变量。 | DataType: | 和ADO中的数据类型等价的C/C++数据类型。相应的Recordset字段在需要时将转换为该数据类型。 | Buffer: | 用来存储Recordset字段的缓冲区名称。 | Size: | 缓冲区的最大尺寸。 | Status: | 状态位。指示缓冲区的内容的有效性,以及字段转换是否成功。其中有两个比较重要的值。一个是adFldOK, 表明转换是成功的;另一个是adFldNull, 表明字段值为NULL。更多的状态值,请参考MSDN | Modify: | 布尔类型。如果为TRUE, 表明ADO允许更新缓冲区中的数据。如果为FALSE,表明数据是只读的。 | Precision: | 数值类型的精度。 | Scale: | 数值类型的小数位数。Number of decimal places in a numeric variable. | Length: | 一个四字节的变量。用来包含缓冲区中数据的实际长度。 |
【Visual C++ Extensions 例程】
//引入msado15.dll文件,从而声明了ADO类型库 #import "c:/Program Files/Common Files/System/ADO/msado15.dll" no_namespace rename("EOF", "EndOfFile")
#include #include file://在此处包含icrsint.h头文件
file://_COM_SMARTPTR_TYPEDEF 宏定义了一个_com_ptr_t类型的智能(smart)指针IADORecordBingingPtr _COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));
file://定义一个测试函数 inline void TESTHR(HRESULT _hr) { if FAILED(_hr) _com_issue_error(_hr); }
file://定义一个派生自CADORecordBinding的类 class CCustomRs : public CADORecordBinding { file://开始进行数据类型绑定 BEGIN_ADO_BINDING(CCustomRs) file://把Recordset的第2个adVarChar类型的字段绑定到C/C++变量m_ch_fname上 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) file://结束绑定 END_ADO_BINDING()
file://紧接着定义上述宏中用到的C/C++变量 public: CHAR m_ch_fname[22]; CHAR m_ch_lname[32]; ULONG m_ul_fnameStatus; ULONG m_ul_lnameStatus; };
file://开始程序执行 void main(void) { ::CoInitialize(NULL); file://初始化COM对象 try { file://typedef _com_ptr_t<_Recordset, __uuidof(_Recordset)> _RecordsetPtr:指向一个_Recordset的智能指针 _RecordsetPtr pRs("ADODB.Recordset");
file://定义一个CCustomRS: public CADORecordBinding类的实例 CCustomRs rs;
file://把IADORecordBindingPtr接口类型对象picRs指定到pRs对象,从而实现接口和对象之间的关联 IADORecordBindingPtr picRs(pRs);
file://调用_Recordset的Open方法取得Recordset对象 pRs->Open("SELECT * FROM Employee ORDER BY lname", "dsn=pubs;uid=sa;pwd=;", adOpenStatic, adLockOptimistic, adCmdText);
file://利用CCustomRS类中的宏定义,实现数据之间的绑定 file://如果绑定成功,我们就可以使用rs对象的属性了 TESTHR(picRs->BindToRecordset(&rs));
file://大家注意,这里的EndOfFile对应上文import语句中的rename("EOF", "EndOfFile"),其实就是EOF。rename的作用为了防止命名冲突。 while (!pRs->EndOfFile) { // Process data in the CCustomRs C++ instance variables. printf("Name = %s %s/n", (rs.m_ul_fnameStatus == adFldOK ? rs.m_ch_fname: ""), (rs.m_ul_lnameStatus == adFldOK ? rs.m_ch_lname: ""));
// Move to the next row of the Recordset. // Fields in the new row will automatically be // placed in the CCustomRs C++ instance variables.
pRs->MoveNext(); } } catch (_com_error &e ) { printf("Error:/n"); printf("Code = %08lx/n", e.Error()); printf("Meaning = %s/n", e.ErrorMessage()); printf("Source = %s/n", (LPCSTR) e.Source()); printf("Description = %s/n", (LPCSTR) e.Description()); }
file://清除COM对象实例 ::CoUninitialize(); } |
 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |