转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 站长学院 >> Web开发 >> 正文
ADO VC++ Extensions使用详解         ★★★★

ADO VC++ Extensions使用详解

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1011 更新时间:2009/4/23 10:43:05

  ADO VC++ Extensions是ADO 2.0 版本提供的新接口,它支持不通过 VARIANT 便可将数据检索到本地的 C/C++ 数据类型中。此外,它还提供能简化接口使用过程的预处理宏,这些扩展程序使用简便并且性能良好。

  ADO VC++ Extensions 可将 Recordset 对象的字段映射到 C/C++ 变量,字段与变量的映射称为绑定条目。预处理宏用来定义数值、定长和变长变量的绑定。

  我们以一个简单的程序为例,说明如何在VC++中使用带Extensions 的ADO访问SQL SERVER数据库。我们假定安装了SQL SERVER数据库的Netbios名为nt_sqlserver,要访问的数据库名为pubs,操作的表名为authors。

  我们可以新建一个空的工程,选择Win32 Console Application类型。先加入一个头文件,并命名为ADOtest.h,源代码如下:

  //要使用 VC++ Extensions,必须在应用程序中包含的头文件:

  #include "icrsint.h"

  // 该类从"authors"表中 摘取出 fname, lname, city和state 四个字段

  class CAuthorsRs : public CADORecordBinding

  {

  BEGIN_ADO_BINDING(CAuthorsRs)

  ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_au_fname,

  sizeof(m_au_fname), l_fnameStatus, TRUE)

  ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_au_lname,

  sizeof(m_au_lname), l_lnameStatus, TRUE)

  ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_au_city,

  sizeof(m_au_city), l_cityStatus, TRUE)

  ADO_VARIABLE_LENGTH_ENTRY2(4, adChar, m_au_state,

  sizeof(m_au_state), l_stateStatus, TRUE)

  END_ADO_BINDING()

  public:

  char   m_au_fname[21];

  ULONG  l_fnameStatus;

  char   m_au_lname[41];

  ULONG  l_lnameStatus;

  char   m_au_city[21];

  ULONG  l_cityStatus;

  char   m_au_state[3];

  ULONG  l_stateStatus;

  };

  注意,将 BEGIN_ADO_BINDING 和 END_ADO_BINDING 宏之间的绑定条目用括号括起。不要在绑定条目结尾使用逗号或分号,因为这些定界符仅限在宏中使用。

  ADO_VARIABLE_LENGTH_BINDING

  _ENTRY2的参数说明如下:

  参数1:按顺序的字段号码,1为标识记录集中第一字段,2为标识记录集中第二字段,依此类推。

  参数2:储存已转换字段的变量的数据类型。

  参数3:临时的工作缓冲区,用于将字段值从 VARIANT转换为C/C++ 变量。

  参数4:变长变量所需的字节数。

  参数5:指示字段转换是否成功。

  参数6:布尔标志。如果为 TRUE,则表明 ADO 可以更新绑定的字段。如只检查字段而不将其更改,可设置为 FALSE。

  其中第5个参数为状态参数,它可告诉你从 Recordset 字段到C或C++变量的转换是否成功以及变量的内容是否有效。该参数的两个最重要的值是adFldOK(意味着转换成功)和adFldNull(意味着字段是NULL,即无值可供转换)。程序中要检测该参数以决定C或C++变量是否有效。例如,如果字段具有有效的行内容,状态将会是adFldOK,如果移动到另一个字段为 NULL 的行,则状态将是 adFldNull。

  源程序代码如下:

  #import "C:\Program Files\Common Files\System\ADO\msado15.dll" \

  no_namespace rename("EOF", "EndOfFile")

  #include 〈stdio.h〉

  #include 〈ole2.h〉

  #include "ADOtest.h"

  void main()

  {

   if(FAILED(::CoInitialize(NULL)))

   return;

   // 定义ADO 智能指针类的实例,并初始化

   RecordsetPtr pRstAuthors  = NULL;

  //定义其它变量

  //接口指针声明

  IADORecordBinding picRs = NULL; CAuthorsRs  authorsrs;

  //ADO函数要返回HRESULT,宏代码可以帮我们解释HRESULT的含义

  HRESULT hr;    

  // 打开 位于nt_sqlserver服务器上的 pubs数据库中的 Authors 表

   bstr_t strCnn("Provider=sqloledb;Data Source=nt_sqlserver;"

   "Initial Catalog=pubs;User Id=sa;Password=;");

  try

  {

   // 从 Authors 表中打开记录集

   if FAILED(hr = pRstAuthors.CreateInstance(__uuidof(Recordset)))

   com_issue_error(hr);

  pRstAuthors-〉CursorType = adOpenStatic;

    // 使用 client 游标 ,从而可以使用 AbsolutePosition 属性pRstAuthors-〉CursorLocation = adUseClient;

    pRstAuthors-〉Open("SELECT au_fname, au_lname, city, "

      "state FROM Authors ORDER BY au_id", strCnn, adOpenStatic,

      adLockReadOnly, adCmdText);

    // 打开一个 IADORecordBinding 接口指针(用来对记录集和C++类的绑定)

   if FAILED(hr = pRstAuthors-〉QueryInterface(_uuidof(IADORecordBinding),(LPVOID)&&picRs))

_com_issue_error(hr);

   // 调用 BindToRecordset 接口方法可使 Recordset 字段关联(或绑定)到C/C++ 变量,无论何时更改 Recordset 对象的当前行,C/C++ 变量都将自动更新

    if FAILED(hr = picRs-〉BindToRecordset(&&authorsrs))

_com_issue_error(hr);

    pRstAuthors-〉MoveFirst();

    while(true)

    {

      // 显示当前记录的信息

      printf("Record %ld of %d\n", pRstAuthors-〉AbsolutePosition,        pRstAuthors-〉RecordCount);

   printf("Author: %s %s\n ",

  authorsrs.l_fnameStatus == adFldOK ?

  authorsrs.m_au_fname : "〈NULL〉",

  authorsrs.l_lnameStatus == adFldOK ?

  authorsrs.m_au_lname : "〈NULL〉");

  printf("Location: %s, %s\n",

  authorsrs.l_cityStatus == adFldOK ?

  authorsrs.m_au_city : "〈NULL〉",

  authorsrs.l_stateStatus == adFldOK ?

  authorsrs.m_au_state : "〈NULL〉");

pRstAuthors-〉MoveNext();

   if(pRstAuthors-〉EndOfFile)

      {

break;

      }

    }

  // 退出前释放对象

  pRstAuthors-〉Close();

  // 这里释放 IADORecordset 接口

    if (picRs)

      picRs-〉Release();

  }

  catch(_com_error &&e)

  {

_bstr_t bstrSource(e.Source());

_bstr_t bstrDescription(e.Description());

    printf("Error\n");

    printf("\tCode = %08lx\n", e.Error());

printf("\tCode meaning = %s\n", e.ErrorMessage());

printf("\tSource = %s\n", (LPCSTR) bstrSource);

printf("\tDescription = %s\n", (LPCSTR) bstrDescription);

  }

   ::CoUninitialize();

  }

  编译链接之后,程序就可以运行了。这个例子的作用是将SQL SERVER中pubs库中authors表中的记录按字段au_id排序后,将记录在记录集中的位置、姓名、城市等几个字段的内容依次显示在屏幕上。


[VB.NET程序]GSM短信模块库函数,可以用VB,VC,调用简单实用  [网页制作]DIV CSS布局:自定义标签布局页面
[操作系统]svchost.exe进程详解之由浅入深  [VB.NET程序]学在 VC ,用在 VB - 透过语言看 世界
[VB.NET程序]用 VC 写 CRC32 DLL 给VB调用  [VB.NET程序]VB与VC混合编程中处理消息的方法
[VB.NET程序]ADO 在informix的 Addnew  [VB.NET程序]ADO 的测试
[VB.NET程序]ADO 揭密 1  [Web开发]VC++ ADO开发实践之七
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Web开发  · 网页制作
    · 平面设计  · 网站运营
    · 网站推广  · 搜索优化
    · 建站心得  · 站长故事
    · 互联动态
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台