VC++下使用ADO编写数据库程序

本文详细介绍使用ADO进行数据库操作的方法,包括连接数据库、执行SQL语句、遍历表和字段等核心功能,并提供实用代码示例。
部署运行你感兴趣的模型镜像

准备:(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)连接 例子:连接Access数据库m_pConnection.CreateInstance(__uuidof(Connection));

try   {  // 打开本地Access库Demo.mdb m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Demo.mdb",  "","",adModeUnknown);

}

catch(_com_error e)

AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");

 return FALSE;

}   

(2)、关闭 //如果数据库连接有效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 xutry{ 

m_pRecordset->Open("SELECT * FROM DemoTable",// 查询DemoTable表中所有字段 m_pConnection.GetInterfacePtr(),  // 获取库接库的IDispatch指针nDynamic, adLockOptimistic, adCmdText);

}

catch(_com_error *e)

{ AfxMessageBox(e->ErrorMessage());}  

(2)关闭结果集 m_pRecordset->Close();

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();给每个字段赋值c)、调用m_pRecordset->Update();确认

(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#

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

编 者 的 话 5 第1篇 基础篇 6 第1章 数据库原理与访问 7 1.1 数据库基本原理 7 1.1.1 概述 7 1.1.2 桌面数据库 7 1.1.3 对象数据库 8 1.1.4 关系数据库服务器 9 1.1.5 选择适用的数据库 9 1.2 数据库访问技术 10 1.2.1 概述 10 1.2.2 ODBC API 10 1.2.3 ODBC的MFC类 11 1.2.4 DAO与RDO 11 1.2.5 OLE DB与ADO 12 1.3 数据库操纵语言SQL 13 1.3.1 SQL命令 13 1.3.2 SQL从句 13 1.3.3 SQL运算符 14 1.3.4 SQL合计函数 14 1.4 小 结 14 第2章 COM与数据库访问 15 2.1 COM的基本原理 15 2.1.1 COM历史 16 2.1.2 COM结构 16 2.1.3 COM优势 17 2.1.4 COM接口 18 2.1.5 COM与数据库访问 19 2.1.6 COM与Internet 19 2.2 ACTIVEX的数据库访问 19 2.2.1 ActiveX简介 19 2.2.2 ActiveX对数据库访问的支持 20 2.3 ATL的数据库访问 20 2.3.1 ATL目标 20 2.3.2 ATL内容简介 22 2.3.3 ATL对数据库访问的支持 22 2.4 小 结 23 第3章 数据库开发过程 23 3.1 阶段1:调查与分析 24 3.2 阶段2:数据建模 24 3.3 阶段3:功能设计 24 3.4 阶段4:选择数据库系统 25 3.5 阶段5:选择数据库访问技术 25 3.6 阶段6:代码设计 25 3.7 阶段7:测试与调试 26 3.8 阶段8:发行产品 26 第4章 VC++数据库开发基础 26 4.1 VC++ 6.0工程创建向导 26 4.2 VC++ 6.0数据库新建工具 27 4.3 VC++ 6.0的数据库工程 29 4.4 小 结 31 第2篇 实例篇 32 第5章 ODBC API编程 33 5.1 了解ODBC API 34 5.2 ODBC API编程步骤 34 5.2.1 步骤1:连接数据源 34 5.2.2 步骤2:分配语句句柄 36 5.2.3 步骤3:准备并执行SQL语句 36 5.2.4 步骤4:获取结果集 37 5.2.5 步骤5:提交事务 38 5.2.6 步骤6:断开数据源连接并释放环境句柄 39 5.3 ODBC API编程实例 39 5.3.1 实例概述 39 5.3.2 实例实现过程 40 5.3.3 编译并运行ODBCDemo1工程 97 5.3.4 ODBCDemo1实例小结 98 5.4 本 章 小 结 99 第6章 MFC ODBC编程 100 6.1 了解MFC ODBC 100 6.1.1 CDatabase类 100 6.1.2 CRecordSet类 100 6.2 MFC ODBC数据库访问技术 101 6.2.1 记录查询 101 6.2.2 记录添加 102 6.2.3 记录删除 102 6.2.4 记录修改 102 6.2.5 撤销数据库更新操作 103 6.2.6 直接执行SQL语句 103 6.2.7 MFC ODBC的数据库操作过程 103 6.3 MFC ODBC编程实例 104 6.3.1 实例概述 104 6.3.2 实例实现过程 105 6.3.3 编译并运行ODBCDemo2工程 132 6.3.4 ODBCDemo2实例小结 137 6.4 本 章 小 结 137 第7章 DAO数据库编程 138 7.1 DAO的数据访问 138 7.1.1 DAO对象 138 7.1.2 MFC对DAO的支持 139 7.1.3 DAO与ODBC的比较 139 7.1.4 MFC的DAO类简介 139 7.2 DAO编程实例 142 7.2.1 实例概述 142 7.2.2 实例实现过程 143 7.2.3 运行DAODemo工程 167 7.2.4 DAODemo实例小结 171 7.3 小 结 172 第8章 OLE DB客户数据库编程 172 8.1 OLE DB原理 172 8.1.1 OLE DB与ODBC 172 8.1.2 OLE DB的结构 173 8.1.3 OLE DB的优越性 173 8.1.4 OLE DB对象 174 8.1.5 OLE DB客户模板结构 177 8.1.6 OLE DB客户模
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值