AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

理解 Visual C++ Extensions for ADO

51自学网 2015-08-30 http://www.wanshiok.com

  【理解绑定单元中的宏

  绑定单元定义了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不保证资料的完整性。

上一篇:在Visual&nbsp;C++中使用内联汇编  下一篇:TCP/IP&nbsp;Winsock编程要点