中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > Windows编程
VC++程序员应当如何阅读ADO文档(4)
作者:佚名 时间:2007-12-10 17:12 出处:csdn 责编:月夜寒箫
              摘要:VC++程序员应当如何阅读ADO文档(4)

绑定条目宏

 

 

绑定条目宏定义了一个Recordset字段与一个变量间的对应关系。每个条目的绑定宏由开始宏与结束宏组成并配对使用。

 

 

定长数据的宏适用于adDate,adBoolean等,数字的宏适用于adTinyInt, adInteger和adDouble等,变长数据的宏适用于adChar, adVarChar和adVarBinary等。所有的数字类型,除了adVarNumeric以外也是定长数据类型。每个宏的族之间都有不同的参数组,因此你可以排除不感兴趣的绑定信息。

 

 

参见OLE DB程序员参考附录A:数据类型的更多信息

 

 

开始绑定条目

 

 

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

 

 

派生类的名字。

 

 

Ordinal

 

 

1开始的序号,对应于Recordset中的字段。

 

 

DataType

 

 

C/C++变量对应的ADO数据类型(参见DataTypeEnum以获得有效数据类型的列表)。如果需要,字段的值会被转换成该类型的值。

 

 

Buffer

 

 

对应的C/C++变量的名字。

 

 

Size

 

 

C/C++变量的最大字节数。如果是个变长字符串,使用0表示即可。

 

 

Status

 

 

指示变量的名字。该变量用以表示缓冲是否有效,数据转换是否成功。

 

 

adFldOK意味着转换成功;adFldNull意味着该字段的值为空。其他可能的值见后面的状态值列表。

 

 

Modify

 

 

逻辑标志。TRUE意味着ADO允许利用变量值更新Recordset中的字段的值。

 

 

设置该值为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_fnameStatus;

 

 

   ULONG   m_ul_lnameStatus;

 

 

};

 

 

 

 

void main(void)

 

 

{

 

 

   ::CoInitialize(NULL);

 

 

   try

 

 

      {

 

 

      _RecordsetPtr pRs("ADODB.Recordset");

 

 

      CCustomRs rs;

 

 

      IADORecordBindingPtr picRs(pRs);

 

 

     

 

 

      pRs->Open("SELECT * FROM Employee ORDER BY lname",

 

 

         "dsn=pubs;uid=sa;pwd=;",

 

 

         adOpenStatic, adLockOptimistic, adCmdText);

 

 

     

 

 

      TESTHR(picRs->BindToRecordset(&rs));

 

 

 

 

      while (!pRs->EndOfFile)

 

 

         {

 

 

      // 处理CCustomRs中的数据

 

 

         printf("Name = %s %s\n",

 

 

            (rs.m_ul_fnameStatus == adFldOK ? rs.m_ch_fname: "<Error>"),

 

 

            (rs.m_ul_lnameStatus == adFldOK ? rs.m_ch_lname: "<Error>"));

 

 

 

 

      // 移动到下一行,新行的值会被自动填充到对应的CCustomRs的变量中

 

 

         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());

 

 

      }

 

 

   ::CoUninitialize();

 

 

}

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有