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

ATL COM 和 ADO

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

 

类型:翻译
出处:http://www.codeguru.com
时间:2004-09-27

 


译者:王先生(MrWang2000)
Email : yuanzhaowang@sohu.com
    或yuanzhaowang@163.com


   最近我在NIIT.Bangalore做一个在线银行工程。这个工程几乎是用VB编写,
仅有一小部分涉及ATL组件,仅仅能教会我们编写分布式应用程序。
  我编写的一个中间层组件用到了ATL和ADO来查询后端(SQL Server),部分代码展示在这里。   我假设读者懂(至少了解)ATL 的 COM 编程和 VB 的 ADO 编程

什么是ADO?
  ADO是 ActiveX数据对象(ActiveX Data Object)的缩写。ADO使用OLEDB数据支持
提供了一个面向对象的访问数据源的接口,它是DAO and RDO 对象模型的集大成者,
集合了DAO 和 RDO 的优点

  C++编写OLEDB程序很容易。但是,那些没有提供指针和其他C++特性的语言
(如Visual Basic)实现OLEDB就很难了。

  这就是ADO真正露脸的原因。ADO是基于COM接口技术的OLEDB的高级接口,
所以,任何支持COM的应用程序都可以实现ADO

ADO的特征

。允许访问所有的数据类型
。提供自由线程
。提供异步查询
。提供客户端和服务器端指针
。提供分离的记录集

ADO的结构
在ADO模型中,我们将使用三种主要的对象类型
。Connection
。Command
。Recordset

  Connection 对象用来建立与数据源的连接,首先,数据源名称,所在位置,用户ID,密码等都存储在ConnectionString对象中,用来传递给Connection对象来连接数据源

  Command 对象用来执行SQL命令,查询和存储过程

  当一个查询被执行了,它返回一组由Recordset对象存储的结果集,Recordset中的数据可以被修改并更新到数据库中

使用ADO

  首先,我们将创建一个ATL DLL组件。这个组件由一个方法,
该方法有一个输入参数(该工程的用户ID)并返回相应的Recordset结果引用给VB 的客户机,然后客户机在一个窗体中显示数据

  为了创建DLL ,我们使用ATL COM AppWizard产生一个应用程序框架,给工程命名为FindCust,选择服务器类型为 Dynamic Link Library ,并选择support MFC library.选项

  向工程插入一个新的ATL对象(New ATL Object ),选择Simple Object
在 ATL Object Wizard Properties窗口的Short Name文本框中输入 Search 并点击OK,添加了对象

  在类视图(CLASSVIEW)中,右击接口名称并添加一个方法,给该方法起名为SearchCust
并把下面的文字输入到Parameters文本框中:

[in] BSTR bstrcustid,[out,retval] _Recordset **ptr

  点击OK按钮添加这个方法。

  由于SearchCust 方法返回一个Recordset 对象的引用,所以我们需要导入(import)ADO库:
打开StdAfx.h 文件并添加下列代码:

#import "C:\Program Files\Common Files\System\ADO\MSADO15.DLL"
rename_namespace("ADOCust") rename("EOF","EndOfFile")
using namespace ADOCust;

  这一步是为了让VC++编译器明白 在对象类型库 MSADO15.DLL 中定义的ADO对象

  rename_namespace 函数改变了一个名字空间的名称,DLL文件就是被导入到该名字空间中的。
rename选项把EOF关键字改成 EndOfFile,这是因为EOF已经被定义到标准头文件中了。

  .idl文件中也包含了SearchCust 方法,改方法返回Recordset 对象的引用,为了让MIDL编译器也明白ADO对象,
  用importlib语句在.idl文件 的library 段中导入类型库( 在importlib "stdole2.tlb"之后)如:

  importlib("C:\Program Files\Common Files\System\ADO\MSADO15.DLL");

  把接口的定义移动到.idl 文件新添加的imporlib语句的后边,也是为了让MIDL编译器明白ADO对象

  做完后,我的接口块定义如下

[
object,
uuid(EB78D558-E071-4D25-80DD-41FD3519934E),
dual,
helpstring("ISearch Interface"),
pointer_default(unique)
]
interface ISearch : IDispatch
{
[id(1), helpstring("method SearchCust")]
HRESULT SearchCust([in] BSTR rcustid,
[out,retval] _Recordset **ptr);
};


构建ATL组件

现在我们已经准备好编写SearchCust方法的代码来获得相应的讯息,我们需要做如下这些事情:
。初始化COM库
。连接到数据源
。执行SQL命令
。返回Recordset对象
。反初始化COM库

初始化COM库
CoInitialize(NULL);

为了连接数据源,首先要声明一个Connection对象指针传递组件类的ID
_ConnectionPtr conptr(__uuidof(Connection));

现在调用Open函数来家里与数据源的连接

conptr->Open(_T("Provider=SQLOLEDB.1;
        Data Source=SQLServer;
        Initial Catalog=Customer"),
        _T("user1"),
        _T(""),
        adOpenUnspecified);


  Open函数由四个参数。第一个参数是连接字符串,包含提供者的名字和要连接的SQL Server的名字。 第二个参数和第三个参数是用来建立连接的用户名和密码。 第四个参数是使用的指针的类型 _T宏确保了字符串的UNICODE的兼容性

  为了执行SQL命令,通过传递一个Command对象的CLSID来建立一个Command对象指针

_CommandPtr cmd(__uuidof(Command));

  设置Command对象的ActiveConnection 属性为打开的Connection对象的指针

cmd->ActiveConnection=conptr;

  把要执行的SQL语句存储到Command对象的CommandText属性中

cmd->CommandText="<Your SQL statement goes here>"

  创建Recordset 对象并指明作为记录源的Command对象

_RecordsetPtr rst(__uuidof(Recordset));
rst->PutRefSource(cmd);

现在打开Recordset,使用Open方法,如下:
_variant_v vNull;

rst->Open(vNull,
     vNull,
     adOpenDynamic,
     adLockOptimistic,
     adCmdText);

Open方法由五个参数
   第一个和第二个参数是数据源的名称和各自的活动连接由于数据源在Connection对象中
已经被ActiveConnection 属性指定了,而且在Command 对象中也被指定了,
所以第一个和第二个参数使用了NULL的变体值。第三个参数指明了指针类型,
第四个参数指明了锁定参数,第五个参数指明了在命令被发送时数据库应该怎样评估命令

  现在 创建的Recordset对象指针将会引用由SQL语句返回的记录集,
我们应该把这个Recordset返回给客户机,使用如下代码:
rst->QueryInterface(__uuidof(_Recordset), (void **) ptr);

QueryInterface函数使用了Recordset对象的IID 并返回由SQL语句返回的记录集的引用,
当客户机调用SearchCust 方法时,这个指针会返回给客户机

反初始化 COM库
::CoUninitialize();

现在 构建(build)组件,这将会把DLL注册到注册表中

创建客户机

打开 VB 并创建一个新的标准EXE工程(Standard EXE project)
很简单,这里就不详细描述了

 

 

 

 

 

 

 

 

 


 


[办公软件]RIGHT函数和逻辑与&和Value函数在Excel中的应用举…  [电脑技术]使用?和*两个通配符迅速批量(搜索)查找文件
[聊天工具]Google Suggest十大妙用  [聊天工具]保驾护航Web迅雷 全新版本给你更多安全
[聊天工具]玩转火狐的Cookie 让火狐狸吃好小甜饼!  [聊天工具]P2P下载的好工具 POCO完全攻略
[聊天工具]横扫一切高价话费 Vbuzzer八分钱国际长途任你打  [聊天工具]众人拾柴火焰高 改进迅雷于不经意间 迅雷
[聊天工具]中英文互翻 Google Toolbar4中文版试用手记  [聊天工具]巧用µTorrent 体验国外下载站的乐趣
教程录入: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……
    咸宁网络警察报警平台