标题 VC++下使用ADO编写数据库程序
类别 编程珠矶
日期 07年02月09日
长度 9298 Bytes [Copy to clipboard]
VC++下使用ADO编写数据库程序
 
准备:
(1)、引入ADO类  
 
#import  "c:\program  files\common  files\system\ado\msado15.dll"  \
no_namespace  \
rename  ("EOF",  "adoEOF")            
(2)、初始化COM
 
在MFC中可以用AfxOleInit();非MFC环境中用:  
CoInitialize(NULL);
CoUnInitialize();
 
(3)#import  包含后就可以用3个智能指针了:_ConnectionPtr、_RecordsetPtr和_CommandPtr
 
1.连接和关闭数据库  (1)连接  
一般在App类成员函数InitInstance()里初始化
例子:连接Access数据库
           AfxOleInit();//初始化
           HRESULT  hr;
           try
           {
                       hr  =  m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
                       if(SUCCEEDED(hr))
                       {
                                   m_pConnection->ConnectionTimeout  =  0;
                                   hr  =  m_pConnection->Open(
"Provider=Microsoft.Jet.OLEDB.4.0;Data  Source=db.mdb",  "",  "",  adModeUnknown);
                                   //m_pConnection->PutDefaultDatabase  ((_bstr_t)"DB");//设置默认数
据库
 
                                   m_pCommand.CreateInstance(__uuidof(Command));
                                   m_pCommand->CommandTimeout  =  5;
                                   m_pCommand->ActiveConnection  =  m_pConnection;
                       }
           }
           catch(_com_error  e)///捕捉异常
           {
                       CString  errormessage;
                       errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
                       AfxMessageBox(errormessage);///显示错误信息
         return FALSE;
           }
 
 
(2)、关闭  
 
一般在App类成员函数InitInstance()里关闭数据库连接
//如果数据库连接有效
if(  m_pConnection->State  )
                       m_pConnection->Close();
m_pConnection  =  NULL;    
 
(3)、设置连接时间  //设置连接时间-----------------------------------  
pConnection->put_ConnectionTimeout(long(5));
2.打开一个结果集
 
(1)打开,首先创建一个_RecordsetPtr实例,然后调用Open()得到一条SQL语句的执行结果
_RecordsetPtr            m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
 
//  在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
//  因为它有时会经常出现一些意想不到的错误。jingzhou  xu
try
{
           m_pRecordset->Open("SELECT  *  FROM  DemoTable",//  查询DemoTable表中所有字段
           m_pConnection.GetInterfacePtr(),    //  获取库接库的IDispatch指针
           adOpenDynamic,
           adLockOptimistic,
           adCmdText);
}
catch(_com_error  *e)
{
           AfxMessageBox(e->ErrorMessage());
}
                       
(2)关闭结果集  m_pRecordset->Close();
  m_pRecordset = NULL;
 
3.操作一个结果集
 
(1)、遍历(读取)
a)、用pRecordset->adoEOF来判断数据库指针是否已经移到结果集的末尾了;m_pRecordset->BOF判断是否  在第一
条记录前面:  while(!m_pRecordset->adoEOF)
{
           var  =  m_pRecordset->GetCollect("Name");
           if(var.vt  !=  VT_NULL)
                       strName  =  (LPCSTR)_bstr_t(var);
           var  =  m_pRecordset->GetCollect("Age");
           if(var.vt  !=  VT_NULL)
                       strAge  =  (LPCSTR)_bstr_t(var);
           m_AccessList.AddString(  strName  +  "  -->  "+strAge  );
           m_pRecordset->MoveNext();
}
                       
b)、取得一个字段的值的办法有两种办法
 
一是
 
//表示取得第0个字段的值  m_pRecordset->GetCollect("Name");
 
或者  m_pRecordset->GetCollect(_variant_t(long(0));
 
二是
pRecordset->get_Collect("COLUMN_NAME");
 
或者  pRecordset->get_Collect(long(index));
 
(2)、添加
 
a)、调用m_pRecordset->AddNew();
b)、调用m_pRecordset->PutCollect("Name",_variant_t(m_szName));给每个字段赋值(m_szName为控件所对应的字符串变量)
c)、调用m_pRecordset->Update();确认
 
// 添加完后可读取显示
 对于MFC有些控件显示需要更新(比如ListBox)

(3)、修改
(4)、删除
a)、把记录指针移动到要删除的记录上,然后调用Delete(adAffectCurrent)  try
{
           //  假设删除第二条记录
           m_pRecordset->MoveFirst();
           m_pRecordset->Move(1);                
           //  从0开始
           m_pRecordset->Delete(adAffectCurrent);    
           //  参数adAffectCurrent为删除当前记录
           m_pRecordset->Update();
}
catch(_com_error  *e)
{
           AfxMessageBox(e->ErrorMessage());
}
 
4.直接执行SQL语句,除了要用到结果集其余的大部分功能都可以直接用SQL语言实现
 
(1)、用_CommandPtr和_RecordsetPtr配合
_CommandPtr                        m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
//  将库连接赋于它
m_pCommand->ActiveConnection  =  m_pConnection;    
//  SQL语句
m_pCommand->CommandText  =  "SELECT  *  FROM  DemoTable";    
//  执行SQL语句,返回记录集
m_pRecordset  =  m_pCommand->Execute(NULL,  NULL,adCmdText);              
(2)、直接用_ConnectionPtr执行SQL语句
_RecordsetPtr  Connection15::Execute  (  _bstr_t  CommandText,  
                                                                           VARIANT  *
RecordsAffected,  
                                                                           long  Options  )  
 
其中CommandText是命令字串,通常是SQL命令。  
参数RecordsAffected是操作完成后所影响的行数,  
参数Options表示CommandText中内容的类型,Options可以取如下值之一:  
adCmdText:表明CommandText是文本命令  
adCmdTable:表明CommandText是一个表名  
adCmdProc:表明CommandText是一个存储过程  
adCmdUnknown:未知
                                   
例子:
_variant_t  RecordsAffected;
m_pConnection->Execute("UPDATE  users  SET  old  =  old+1",&RecordsAffected,adCmdText);              
 
5.调用存储过程
(1)、利用_CommandPtr
_CommandPtr            m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection  =  m_pConnection;    //  将库连接赋于它
m_pCommand->CommandText  =  "Demo";    
m_pCommand->Execute(NULL,NULL,  adCmdStoredProc);                
(2)、直接用_ConnectionPtr直接调用(见4.(2))
 
6.遍历数据库中的所有表名  _ConnectionPtr  m_pConnect;  
_RecordsetPtr  pSet;  
HRESULT  hr;  
try  
{    
           hr  =  m_pConnect.CreateInstance("ADODB.Connection");        
           if(SUCCEEDED(hr))    
           {      
                       CString  dd;      
                       dd.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data  Source=%s",file);      
                       hr  =  m_pConnect->Open((_bstr_t)dd,"","",adModeUnknown);      
                       pSet  =  m_pConnect->OpenSchema(adSchemaTables);            
                       while(!(pSet->adoEOF))      
                       {                  
                                   //获取表格        
                                   _bstr_t  table_name  =  pSet->Fields->GetItem("TABLE_NAME")-
>Value;
                                   
                                   //获取表格类型                
                                   _bstr_t  table_type  =  pSet->Fields->GetItem("TABLE_TYPE")-
>Value;
                                   
                                   //过滤一下,只输出表格名称,其他的省略
                                   if  (  strcmp(((LPCSTR)table_type),"TABLE")==0){
                                               CString  tt;
                                               tt.Format("%s",(LPCSTR)table_name);          
                                               AfxMessageBox(tt);                
                                   }              
                                   pSet->MoveNext();        
                       }      
                       pSet->Close();    
           }    
           m_pConnect->Close();    
}catch(_com_error  e)///捕捉异常  
{    
           CString  errormessage;    
           errormessage.Format("连接数据库失败!rn错误信息:%s",e.ErrorMessage());
 
           AfxMessageBox(errormessage);
           return  -1;
}                        
7.遍历一个表中的所有字段
Field  *      field  =  NULL;                        
HRESULT      hr;
Fields  *    fields  =  NULL;
hr  =  m_pRecordset->get_Fields  (&fields);            //得到记录集的字段集和            
             
if(SUCCEEDED(hr))  
       fields->get_Count(&ColCount);            
 
//得到记录集的字段集合中的字段的总个数            
for(i=0;iItem[i]->get_Name(&bstrColName);            //得到记录集//中的字段名
           strColName=bstrColName;            
           nameField  =  strColName;
           m_FieldsList.AddString(nameField);
}
if(SUCCEEDED(hr))
           fields->Release();//释放指针
 
附:
1、_variant_t
(1)、一般传给这3个指针的值都不是MFC直接支持的数据类型,而要用_variant_t转换一下
_variant_t(XX)可以把大多数类型的变量转换成适合的类型传入:
(2)、_variant_t  var;_variant_t  ->  long:  (long)var;
_variant_t  ->  CString:  CString  strValue  =  (LPCSTR)_bstr_t(var);
CString  ->  _variant_t:  _variant_t(strSql);
2、BSTR宽字符串与CString相互转换
 
BSTR  bstr;
CString  strSql;
CString  ->  BSTR:  bstr  =  strSql.AllocSysString();
BSTR  ->  CString:  strSql  =  (LPCSTR)bstr;
3、_bstr_t与CString相互转换
 
_bstr_t  bstr;
CString  strSql;
CString  ->  _bstr_t:  bstr  =  (_bstr_t)strSql;
_bstr_t  ->  CString:  strSql  =  (LPCSTR)bstr;
4、关于时间
Access:表示时间的字符串#2004-4-5#
Sql:表示时间的字符串''2004-4-5''
DateField(时间字段)  select  *  from  my_table  where  DateField  >  #2004-4-10#
 
 
 
           try
           {
                       m_pCommand->CommandText  =  "INSERT  INTO  tTest(age)  VALUES('23f2')  ";
                       m_pRecordset  =  m_pCommand->Execute(NULL,NULL,  adCmdText);    
           }
           catch(_com_error  e)///捕捉异常
           {
                       CString  errormessage;
                       errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
                       AfxMessageBox(errormessage);///显示错误信息
           }

CopyRight By CoolDiyer All Rights Reserved

转载于:https://www.cnblogs.com/cy163/archive/2007/04/05/700596.html

VC++下使用ADO编写数据库程序(关键文章)相关推荐

  1. VC++下使用ADO编写数据库程序 – 操作大全

    准备: (1).引入ADO类 1 #import "c:/program files/common files/system/ado/msado15.dll" / 2 no_nam ...

  2. [转]VC++下使用ADO操作数据库

    (1).引入ADO类 1 2 3 #import "c:program filescommon filessystemadomsado15.dll" no_namespace re ...

  3. 在VC中使用ADO开发数据库应用程序

    在VC中使用ADO开发数据库应用程序 一.ADO概述 ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口.ADO 使您能够编写应用程序以通过 ...

  4. linux下 为自己编写的程序 添加tab自动补全 功能

    linux下 为自己编写的程序 添加tab自动补全功能 入门 complete 在我的tmp下随便写了一个a.sh, 为他补全 edit /etc/bash_completion.d/foo _foo ...

  5. VC下发布的Release版程序的异常捕捉

    VC下发布的Release版程序的异常捕捉寻找Release版程发生异常退出的地方比Debug版麻烦得多.发生异常的时候windows通常会弹出一个错误对话框,点击详细信息,我们能获得出错的地址和大概 ...

  6. ubuntu系统下C语言编写简单程序

    文章目录 一.学习了解ubuntu系统下vim编辑器的基本运用. 1.如何进入vim编辑器 2.vim编辑器命令模式基本命令 3.vim编辑器编辑模式 4.vim编辑器末行模式命令 二.ubuntu系 ...

  7. VC下sql+ado数据库v_strTemp.vt == VT_NULL判断的问题

    自己先顶一个,百度知道里有一个提问的也遇到过类似问题 CString str; _variant_t var; 以下代码: ① var=m_pRecordset->GetCollect (&qu ...

  8. C语言的VC开发环境界面介绍,【c语言在vc++6.0中编写界面程序】

    到现在为止,C++ 仍然是计算机编程领域的经典语言之一,C++ 17 标准在2017上半年已经探讨确定.本期我们汇集了编程专家--祁宇(<深入应用 C++ 11>作者,C++ 开源社区 p ...

  9. 你想要的~最全的Windows下编写swift程序

    Windows下编写swift程序 一.安装VScode 1.官网下载最新版 VScode下载地址 2.将vscode修改为中文环境 1)使用快捷键[Ctrl+Shift+P](!或者F1)弹出查找命 ...

  10. python是什么语言编写的程序称为_Python 学习(一)【Python语言简介-Python是什么】...

    Python是一种编程语言,它的名字来源于一个喜剧.也许最初设计Python这种语言的人并没有想到今天Python会在工业和科研上获得如此广泛的使用. Python是什么(转载自Primus) 著名的 ...

最新文章

  1. DM***时使用OSPF时邻居不断UPDOWN
  2. java.lang.reflect.InaccessibleObjectException: Unable to make
  3. BROCADE使用小技巧
  4. 2.10 词嵌入除偏-深度学习第五课《序列模型》-Stanford吴恩达教授
  5. 传输预编码matlab,基于MATLAB的MIMO系统预编码性能仿真教程.doc
  6. 5.10 阻尼倒数法
  7. leetcode257. 二叉树的所有路径(两种做法)
  8. Git添加为远程仓库
  9. mysql隔离级别和mvcc_数据库MVCC和隔离级别的关系是什么?
  10. MyEclipse打包jar 并加入第三方包
  11. Linux find命令 查找文件、目录
  12. msgpack php 安装,在ubuntu16.04下编译安装php7的扩张msgpack2.0.1
  13. 在一个请求分页系统中,分别采用 FIFO、LRU和 OPT页面置换算法时,假如一个作业的页面走向为 4、3、2、1、4、3、5、4、3、2、1、5,当分配给该作业的物理块数M分别为 3、4时,
  14. visio_连接线样式设置:如箭头线
  15. 准程序员应如何使用Ipad!!!
  16. 【实用】Visio制作坐标轴
  17. 存储基础知识——SAN
  18. html表格字间距怎么调整,word表格中怎么调整文字行间距以及字符间距?
  19. 保留指定小数位数js函数封装
  20. 解决C/C++报错error: cannot pass objects of non-trivially-copyable type ‘std::string’问题

热门文章

  1. C# string 特殊的引用类型
  2. 【JZOJ4788】【NOIP2016提高A组模拟9.17】序列
  3. 数据结构(主席树):HZOI 2016 采花
  4. 【看别人的,学习】文本增强,再也不怕用户要修改标准界面的字段描述了
  5. MySQL中 slave_compressed_protocol=ON 的压缩效果实验
  6. 并发编程(十四)—— ScheduledThreadPoolExecutor 实现原理与源码深度解析 之DelayWorkQueue...
  7. 高性能迷你React框架anujs1.0.6发布
  8. 纯干货!如何做一个成功的大数据项目
  9. 打造高效的运维日志收集与分析平台
  10. 修改 Ubuntu SSH 登录后的欢迎信息