在VC中用ADO除了用import#的方式外,还有其它方法吗?

FreeLunch 2001-12-12 06:14:25
...全文
202 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
vickowang 2001-12-13
  • 打赏
  • 举报
回复
还可以用控件
JoeXu 2001-12-13
  • 打赏
  • 举报
回复
有很多的办法:
只不过#import是最好用的,其他比较好的还有:
1、Smart point方法,com_ptr_t
2、用MFC OLE创建ADO应用

MFC OLE类似于#import,能够对一个类型库产生一个封装(wrapper),但是不象#import,MFC OLE不能够从类型库中产生枚举类型,但是它能够更干净的实现ADO。

MFC类CString和COleVariant隐藏了BSTRS和Variants的细节。需要注意的是,有MFC OLE产生的类封装都是继承了类ColeDispatchDriver,由ADO产生的失败的HRESULTS被封装在类ColeDispatchException中。

  首先我们需要说明一下用MFC OLE ClassWizard创建ADO应用的几个不可缺少的步骤:

  从Tools菜单中,选择Options,然后选择Directories tab,在Show Directories中,选择Library Files,然后在directories增加路径C:\program files\common files\system\ado,这样做的目的是设置包含ADO类型库的路径。

  从View菜单中,选择ClassWizard,点击Add Class按纽并选择From A Type Library...,然后在Type Library dialog box对话框中,从C:\program files\common files\system\ado选择文件msado15.dll,在Confirm Classes对话框中,选择所有列出的类并按OK按纽,退出ClassWizard。实际上,ClassWizard为你生成了两个文件msado15.h和msado15.cpp.

  下面的代码是实现ADO应用的代码:

  AfxOleInit(); file://初始化COM对象

  ...

  _Recordset Rs1; file://定义数据集对象

  COleException e;
  COleVariant Connect( "DSN=AdoDemo;UID=sa;PWD=;" );

  COleVariant Source ( "SELECT * FROM Authors" );

  file://创建数据集对象

  Rs1.CreateDispatch( "ADODB.Recordset.2.0", &e );

  Rs1.Open( (VARIANT) Source, (VARIANT) Connect, 0, 1, -1 );

  file://这里可以对结果集Rs1进行处理

  Rs1.Close();

  Rs1.ReleaseDispatch();

  AfxMessageBox("Success!");

  #import和MFC OLE都围绕着一个给定的自动化对象产生了一个封装类,它们分别继承自_com_ptr_t和ColeDispatchDriver。但是事实上,你可以通过使用Windows API函数直接初始化ADO对象,下面讨论直接用Win32 API函数来操作COM对象。

3、用COM API创建ADO应用

为了直接使用ADO和COM对象,需要添加两个头文件adoid.h和adoint.h,这两个头文件定义了CLSIDs,接口定义和你操作ADO类型库所需要的枚举类型。同时你也需要增加头文件INITGUID.H。

  为了能够编译用COM API创建的ADO工程文件,你需要安装OLE DB SDK或者是MSDASDK工具。下面是简单的示例代码:

  #include

  #include

  #include "adoid.h" // ADO的GUID's

  #include "adoint.h" // ADO的类、枚举等等

  void main()

  {

   HRESULT hr = S_OK;

   ADORecordset* Rs1 = NULL; // ADORecordset 是在adoint.h中定义的

   VARIANT Source;

   VARIANT Connect;

   VariantInit( &Source );

   VariantInit( &Connect );

   Source.vt = VT_BSTR;

   Source.bstrVal = ::SysAllocString( L"SELECT * FROM Authors");

   Connect.vt = VT_BSTR;

   Connect.bstrVal = ::SysAllocString( L"DSN=AdoDemo;UID=sa;PWD=;" );

   hr = CoCreateInstance( CLSID_CADORecordset,

   NULL,

   CLSCTX_INPROC_SERVER,

   IID_IADORecordset,

   (LPVOID *) &Rs1 );

   if( SUCCEEDED( hr ) ) hr = Rs1->Open( Source,

   Connect,

   adOpenForwardOnly,

   adLockReadOnly,

   -1 );

   file://这里你可以对记录集Rs1进行处理

   if( SUCCEEDED( hr ) ) hr = Rs1->Close();

   if( SUCCEEDED( hr ) ) { Rs1->Release(); Rs1 = NULL; }

   if( SUCCEEDED( hr ) ) ::MessageBox( NULL, "Success!", "", MB_OK );

  }
mooncat2000 2001-12-13
  • 打赏
  • 举报
回复
可以用ado控件,不过我不知如何操作Grid
望高手指点
FreeLunch 2001-12-13
  • 打赏
  • 举报
回复
打包之后,import#中的路径会影响它的运行吗?
FreeLunch 2001-12-13
  • 打赏
  • 举报
回复
to:xiaoxiaohan(萧晓寒)
有区别吗?
xiaoxiaohan 2001-12-13
  • 打赏
  • 举报
回复
你好,你是用MFC还是SDK?能说明白一点吗?
bluecrest 2001-12-13
  • 打赏
  • 举报
回复
不知道.net里面有没有CAdo
好像有的
lizmei001 2001-12-13
  • 打赏
  • 举报
回复
UP!
FreeLunch 2001-12-13
  • 打赏
  • 举报
回复
up!
FreeLunch 2001-12-13
  • 打赏
  • 举报
回复
打包时应注意些什么样呢?

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧