CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  数据库

vc++数据库编程

楼主xiaoheichm(小黑)2002-04-18 18:15:22 在 VC/MFC / 数据库 提问

我现在要做一个数据库编程的课题,很不好意思我现在只会一点vc,其他的工具一窍不通,请各位兄台在我不知得何门而入的时候给我指点迷京。就算介绍几本这方面的书也好。 问题点数:100、回复次数:7Top

1 楼kingofvc(提薪像做贼 )回复于 2002-04-18 18:18:36 得分 20

会vc就用CRecordset类好了     很方便的     比odbc   api方便n倍Top

2 楼storein(满天星)回复于 2002-04-18 18:49:54 得分 10

你应该把你的要求说的更详细Top

3 楼chen780831(初来乍到)回复于 2002-04-18 18:52:09 得分 50

一、ADO概述  
   
  ADO是Microsoft为最新和最强大的数据访问范例   OLE   DB   而设计的,是一个便于使用的应用程序层接口。ADO   使您能够编写应用程序以通过   OLE.DB   提供者访问和操作数据库服务器中的数据。ADO   最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ADO   在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。之所以称为   ADO,是用了一个比较熟悉的暗喻,OLE   自动化接口。  
   
  OLE   DB是一组”组件对象模型”(COM)   接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。OLE   DB是Microsoft   UDA(Universal   Data   Access)策略的技术基础。OLE   DB   为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。也就是说,OLE   DB   并不局限于   ISAM、Jet   甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。在实际应用中,这种多样性意味着可以访问驻留在   Excel   电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如   Microsoft   Exchange   中的数据。但是,OLE   DB   应用程序编程接口的目的是为各种应用程序提供最佳的功能,它并不符合简单化的要求。您需要的API   应该是一座连接应用程序和   OLE   DB   的桥梁,这就是   ActiveX   Data   Objects   (ADO)。  
   
  二、在VC中使用ADO  
   
  1、引入ADO库文件  
   
  使用ADO前必须在工程的stdafx.h文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下所示:  
   
  代码1:用#import引入ADO库文件  
   
  #import   "c:\program   files\common   files\system\ado\msado15.dll"    
   
  no_namespaces   rename("EOF"   adoEOF")  
   
  这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。现在不需添加另外的头文件,就可以使用ADO接口了。  
   
  2、初始化OLE/COM库环境  
   
  必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。  
   
     
   
  代码2:初始化OLE/COM库环境  
   
  BOOL   CADOApp::InitInstance()  
   
  {  
   
  if(!AfxOleInit())  
   
     
   
  {  
   
  AfxMessageBox(“OLE初始化出错!”);  
   
  return   FALSE;  
   
  }    
   
  ……  
   
     
   
  }  
   
  函数AfxOleInit在每次应用程序启动时初始化OLE/COM库环境。  
   
  同DAO和CDatabase一样,ADO由几个接口组成:  
   
  _ConnectionPtr,_CommandPtr和_RecordsetPtr.  
   
  不同于DAO和Cdatabase的是,ADO基于COM的接口,因此,假如你没有接触过COM,你应该在使用ADO前先找有关书籍了解一下COM。  
   
  3、ADO接口简介  
   
  ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。  
   
  _ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。通常同CDatabase一样,使用它创建一个数据连接,然后使用其它对象执行数据输入输出操作。  
   
  _CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。  
   
  _RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。  
   
     
   
  4、使用_ConnectionPtr接口  
   
  _ConnectionPtr是一个连接接口,它类似于CDatabase和CDaoDatabase。它们的工作原理相似。首先创建一个_ConnectionPtr接口实例,接着指向并打开一个ODBC数据源或OLE   DB数据提供者(Provider)。以下代码和CDaoDatabase分别创建一个基于DSN和非DSN的数据连接。  
   
     
   
  代码3:使用CDaoDatabase(基于DSN)  
   
  CDaoDatabase   MyDb   =   new   CDaoDatabase();  
   
  MyDb.Open(NULL,FALSE,FALSE,"ODBC;DSN=samp;UID=admin;PWD=admin");  
   
     
   
     
   
  代码4:使用CDaoDatabase(基于非DSN)  
   
  CDaoDatabase   MyDb   =   new   CDaoDatabase();  
   
  MyDb.Open(NULL,FALSE,FALSE,"ODBC;DRIVER={SQL   Server};SERVER=server;  
   
  DATABASE=samp;UID=admin;PWD=admin");  
   
     
   
     
   
  代码5:使用_ConnectionPtr(基于DSN)  
   
  _ConnectionPtr   MyDb;  
   
  MyDb.CreateInstance(__uuidof(Connection));  
   
  MyDb->Open("DSN=samp;UID=admin;PWD=admin","","",-1);  
   
     
   
     
   
  代码6:使用_ConnectionPtr   (基于非DSN)  
   
  _ConnectionPtr   MyDb;  
   
  MyDb.CreateInstance(__uuidof(Connection));  
   
  MyDb->Open("Provider=SQLOLEDB;SERVER=server;DATABASE=samp;UID=admin;  
   
  PWD=admin","","",-1);  
   
     
   
  5、使用_RecordsetPtr接口  
   
  _RecordsetPtr接口的使用方法和CDaoDatabase类似,通过以下代码的比较,你会发现使用_RecordsetPtr接口非常简单(以下代码使用上面已经创建的数据连接):  
   
     
   
  代码7:使用CDaoDatabase执行SQL语句  
   
  CDaoRecordset   MySet   =   new   CDaoRecordset(MyDb);  
   
  MySet->Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT   *   FROM   t_samp");  
   
  Now   using   ADO:  
   
     
   
     
   
  代码8:使用_RecordsetPtr执行SQL语句  
   
  _RecordsetPtr   MySet;  
   
  MySet.CreateInstance(__uuidof(Recordset));  
   
  MySet->Open("SELECT   *   FROM   some_table",  
   
  MyDb.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);  
   
  现在我们已经有了一个数据连接和一个记录集,接下来就可以使用数据了。从以下代码可以看到,使用ADO的_RecordsetPtr接口,就不需要象DAO那样频繁地使用大而复杂的数据结构VARIANT,并强制转换各种数据类型了,这也是ADO的优点之一。假定程序有一个名称为m_List的的ListBox控件,下面代码我们用_RecordsetPtr接口获取记录集数据并填充这个ListBox控件:  
   
     
   
  代码9:使用DAO访问数据  
   
  VARIANT   *   vFieldValue;  
   
  COleVariant   covFieldValue;  
   
  CString   Holder;  
   
  while(!MySet->IsEOF())  
   
  {  
   
  MySet->GetFieldValue("FIELD_1",   covFieldValue);  
   
  vFieldValue   =   (LPVARIANT)covFieldValue;  
   
  if(vFieldValue->vt!-VT_NULL)  
   
  {  
   
  Holder.Format("%s",vFieldValue->pbVal);  
   
  m_List.AddString(Holder);  
   
     
   
  }  
   
  MySet.MoveNext();  
   
     
   
  }  
   
     
   
  代码10:使用ADO访问数据  
   
  _variant_t   Holder  
   
  try{  
   
  while(!MySet->adoEOF)  
   
  {  
   
  Holder   =   MySet->GetCollect("FIELD_1");  
   
  if(Holder.vt!=VT_NULL)  
   
  m_List.AddString((char*)_bstr_t(Holder));  
   
  MySet->MoveNext();  
   
  }  
   
  }  
   
  catch(_com_error   *   e)  
   
     
   
  {  
   
  CString   Error   =   e->ErrorMessage();  
   
  AfxMessageBox(e->ErrorMessage());  
   
  }  
   
  catch(...)  
   
  {  
   
  MessageBox("ADO发生错误!");  
   
  }  
   
  必须始终在代码中用try和catch来捕获ADO错误,否则ADO错误会使你的应用程序崩溃。当ADO发生运行时错误时(如数据库不存在),OLE   DB数据提供者将自动创建一个_com_error对象,并将有关错误信息填充到这个对象的成员变量.  
   
     
   
  6、使用_CommandPtr接口  
   
  _CommandPtr接口返回一个Recordset对象,并且提供了更多的记录集控制功能,以下代码示例了使用_CommandPtr接口的方法:  
   
     
   
  代码11:使用_CommandPtr接口获取数据  
   
  _CommandPtr   pCommand;  
   
  _RecordsetPtr   MySet;  
   
  pCommand.CreateInstance(__uuidof(Command));  
   
  pCommand->ActiveConnection=MyDb;  
   
  pCommand->CommandText="select   *   from   some_table";  
   
  pCommand->CommandType=adCmdText;    
   
  pCommand->Parameters->Refresh();  
   
  MySet=pCommand->Execute(NULL,NULL,adCmdUnknown);  
   
  _variant_t   TheValue   =   MySet->GetCollect("FIELD_1");  
   
  CString   sValue=(char*)_bstr_t(TheValue);  
   
  Top

4 楼xinzhou(天上的月亮)回复于 2002-04-18 18:53:42 得分 5

直接用odbc和mfc就很方便的!Top

5 楼ju_feng(NorthSky)回复于 2002-04-18 19:12:22 得分 5

hehe   去找几个源程序并且有解释的书!就可以了Top

6 楼goldmoon(亮子)回复于 2002-04-18 19:16:34 得分 5

还是用ADO比较方便Top

7 楼bobofu(有问题要问)回复于 2002-04-18 19:23:27 得分 5

yes,用ADO吧Top

相关问题

  • vc++数据库编程
  • vc++数据库编程求救
  • VC数据库编程问题
  • VC数据库编程好乱
  • VC数据库编程问题
  • 用vc对数据库编程
  • 数据库编程用 VC 好还是 DELPHIH 好 ?
  • 关于VC数据库编程的问题
  • 数据库编程,addnew()不成功的问题(VC+ODBC)
  • vc中用ado进行数据库编程的问题

关键词

  • ado
  • 应用程序
  • 接口
  • 数据
  • 文件
  • 代码
  • 数据库
  • vc
  • db
  • microsoft

得分解答快速导航

  • 帖主:xiaoheichm
  • kingofvc
  • storein
  • chen780831
  • xinzhou
  • ju_feng
  • goldmoon
  • bobofu

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo