VC++下使用ADO访问Access数据库完整篇

简介:

1、在StdAfx.h中引入ADO类支持
方法是在StdAfx.h中增加下面两句话:

#include <comdef.h>//如果需要则添加本句

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")

2、初始化COM环境
在MFC中可以用AfxOleInit()或CoInitialize(NULL),该函数一般放在InitInstance()历程里。

非MFC使用用CoInitialize(NULL)。

卸载COM环境使用CoUnInitialize(),一般放在主程序的析构函数里。

这样我们就会三个指针可用:_ConnectionPtr、_RecordsetPtr和_CommandPtr,分别代表:

_ConnectionPtr接口返回一个记录集或一个空指针,通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,对于要返回记录的操作通常使用_RecordserPtr来实现。而用 _ConnectionPtr操作时要想得到记录条数得遍历所有记录,用_RecordserPtr则不需要。

_RecordsetPtr指针是一个记录集对象。可以对记录集提供了更多的控制功能。它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给 _RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是使用已经创建了数据库连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。

_CommandPtr指针接口返回一个记录集。CommandPtr提供了一种简单方法来执行返回记录集的存储过程和SQL语句。可以利用全局 _ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。一次或少量数据库访问操作,一般是直接使用连接串,如果需要频繁访问数据库,涉及返回多个记录集,那么,建议同_RecordsetPtr用法一样,使用全局数据库连接后,再使用_CommandPtr 接口执行存储过程和SQL语句。

各指针的定义方法:

_ConnectionPtr m_pConnection;

_RecordsetPtr m_pRecordset;

_CommandPtr m_pCommand;

3、连接、关闭数据库
1、连接数据库

示例连接ACCESS,以昨天的FavorMan为例。

::CoInitialize(NULL);//数据库操作前先初始化COM环境

CString strSQL; //配置初始连接串
strSQL="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=blogurl.mdb;";
strSQL=strSQL+"Provider=Microsoft.Jet.OLEDB.4.0;"+"Data Source=blogurl.mdb;"+
"Jet OLEDB:Database Password="+//str为上面读到数据库路径信息!
DB_PASSWRD_STRING+";"+
"Persist Security Info=False;"; //注意一定需要输入四个\\\\才能表示"\\"
//如果单独输入,必须形式为"\\\\Abc\\db\\blogurl.mdb"格式!


//--连接数据库-----------------
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open((_bstr_t)strSQL,"","",adModeUnknown);///连接数据库
///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; }
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误:%s!",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息

return FALSE;
}

2、关闭数据库

if( m_pConnection->State )//如果连接有效

m_pConnection->Close();

m_pConnection = NULL;

4、数据库访问
_RecordsetPtr m_pRecordset;

m_pRecordset.CreateInstance("ADODB.Recordset");

try
{

//打开数据库
m_pRecordset->Open("SELECT * FROM BlogUrl",
m_pConnection.GetInterfacePtr(),//或使用_variant_t((IDispatch*)theApp.m_pConnection,true),,但需要extern声明theApp;
adOpenDynamic,
adLockOptimistic,
adCmdText);

//遍历读取

while(!m_pRecordset->adoEOF)//adoEOF判断数据库指针是否已经到结果集末尾;BOF判断是否在第一条记录前面
{
vID =m_pRecordset->GetCollect("ID");
//这里已经读到当前记录的ID,需要进行非空等判断,非空之后就可以处理,比如添加到列表框等。

//....
m_pRecordset->MoveNext();
}

m_pRecordset->Close();//关闭记录集
}
catch(_com_error error)
{
CString errorMessage;
errorMessage.Format("%s",(LPTSTR)error.Description());
AfxMessageBox(errorMessage);

}

取得某字段的值有两种办法,一种是指定该字段名,另一种是指定该字段的ID编号,从0开始。

假设上文的ID是从0开始,那么可以采用:
m_pRecordset->GetCollect(_variant_t(long(0));

也可以采用:
pRecordset->get_Collect("ID");

其它索引值读取类似处理。
附一些常用的执行语法:
1、添加记录

a、调用m_pRecordset->AddNew();

b、调用m_pRecordset->PutCollect("ID",vID);给ID字段赋值

c、调用m_pRecordset->Update();//确认并刷新入库

2、修改记录

方法类似添加记录,只是起初按照查询指定记录打开接口,比如SELECT * FROM ulist where ID=%d形式,不需要m_pRecordset->AddNew();,直接使用PutCollect("ID",vID)。

3、删除记录

删除记录只需要把记录指针移动到要删除的记录上,然后调用m_pRecordset->Delete(adAffectCurrent)

移动到指定记录上也有两种方法,一种直接使用查询指定记录(需要唯一字段)方式定位,另一种是使用Move(index)方式。

下面例子是使用Move方式到指定记录。

try

{

m_pRecordset->MoveFirst();//如果是采用SELECT * FROM ulist where ID=5方式打开数据库连接则不需要本句

m_pRecordset->Move(5);//假设删除第5条记录,如果是采用SELECT * FROM ulist where ID=5方式打开数据库连接则不需要本句

m_pRecordset->Delete(adAffectCurrent);

m_pRecordset->Update();

}

catch(_com_error error)

{

CString errorMessage;

errorMessage.Format("%s",(LPTSTR)error.Description());

AfxMessageBox(errorMessage);

}

4、_CommandPtr用法参考

a、_CommandPtr指针初始化

m_pCommand->ActiveConnection = m_pConnection;// 将库连接赋于它,或单独再创建也可以,根据实际需要定
m_pCommand->CommandText = "SELECT * FROM BlogUrll";

b、_CommandPtr与_RecordsetPtr配合读取记录集

m_pRecordset = m_pCommand->Execute(NULL, NULL,adCmdText);//执行SQL语句,返回结果记录集

c、直接使用_ConnectionPtr执行SQL语句

m_pConnection->Execute( _bstr_t CommandText,VARIANT * RecordsAffected,long Options )

例如:

m_pConnection->Execute("UPDATE BlogUrl SET ID= 1 WHERE ID = 5",&RecordsAffected,adCmdText);

5、遍历数据库中所有表名

m_pRecordset = m_pConnect->OpenSchema(adSchemaTables);

while(!(m_pRecordset ->adoEOF))
{
_bstr_t tblname = m_pRecordset->Fields->GetItem("TABLE_NAME")->Value;//获取表格

_bstr_t tbltype = m_pRecordset->Fields->GetItem("TABLE_TYPE")->Value;//获取表格类型

//这里可以对表格类型进行判断,判断后即可处理tblname

if (!strcmp(tbltype ,"TABLE"))
{
AfxMessageBox(tblname);
}

m_pRecordset->MoveNext();
}
m_pRecordset->Close();

6、遍历一个表中的所有字段

//方法1:

m_pRecordset = m_pConnect->OpenSchema(adSchemaColumns);

while(!(m_pRecordset ->adoEOF))
{
_bstr_t colname = m_pRecordset->Fields->GetItem("COLUMN_NAME")->Value;//获取字段名

AfxMessageBox(colname);

m_pRecordset->MoveNext();
}
m_pRecordset->Close();
//方法2:

FieldsPtr pFields = NULL;

HRESULT hr = m_pRecordset->get_Fields (&pFields);//得到记录集的字段集

if(!SUCCEEDED(hr)) return;

int iColCount;

pFields->get_Count(&iColCount);//字段总数

BSTR bstrColName;

for(int i=0;i<iColCount;i++)//按记录集的各字段循环

{

//pFields->GetItem(_variant_t(i))->get_Name(&bstrColName);

pFields->Item(_variant_t(i))->get_Name(&bstrColName);//获得字段名字

CString csName=bstrColName;

//pField->Item[i]->get_Type(&fType);//获取字段类型

//pField->Item[i]->get_DefinedSize(&lSize);//获得字段的大小

AfxMessageBox(csName);
}
if(NULL != hr)
tblfields ->Release();//释放指针

7、常用数据格式转换

_variant_t var;

BSTR bvar;

CString csVar;

_bstr_t bstr;

_variant_t 转化为long型: (long)var;

_variant_t转化为 CString型: csVar= (LPCSTR)_bstr_t(var);

CString转化为_variant_t型: _variant_t(csVar);或(LPTSTR)(LPCTSTR)csVar;

CString转化为BSTR型: bvar= csVar.AllocSysString();

BSTR转化为CString型:csVar= (LPCSTR)bvar;

CString转化为_bstr_t型: bstr = (_bstr_t)csVar;

_bstr_t 转化为CString型:csVar= (LPCSTR)bstr;

chars-d
+关注
目录
打赏
0
0
0
0
3
分享
相关文章
优化微服务架构中的数据库访问:策略与最佳实践
在微服务架构中,数据库访问的效率直接影响到系统的性能和可扩展性。本文探讨了优化微服务架构中数据库访问的策略与最佳实践,包括数据分片、缓存策略、异步处理和服务间通信优化。通过具体的技术方案和实例分析,提供了一系列实用的建议,以帮助开发团队提升微服务系统的响应速度和稳定性。
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
44 11
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
152 4
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
61 3
打破瓶颈:利用Java连接池技术提升数据库访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,避免了频繁的连接建立和断开,显著提升了数据库访问效率。常见的连接池库包括HikariCP、C3P0和DBCP,它们提供了丰富的配置选项和强大的功能,帮助优化应用性能。
87 2
优化微服务架构中的数据库访问:策略与实践
随着微服务架构的普及,如何高效管理和优化数据库访问成为了关键挑战。本文探讨了在微服务环境中优化数据库访问的策略,包括数据库分片、缓存机制、异步处理等技术手段。通过深入分析实际案例和最佳实践,本文旨在为开发者提供实际可行的解决方案,以提升系统性能和可扩展性。
|
4月前
|
彻底革新你的数据库操作体验!Micronaut数据访问技巧让你瞬间爱上代码编写!
【9月更文挑战第10天】Java开发者们一直在寻找简化应用程序与数据库交互的方法。Micronaut作为一个现代框架,提供了多种工具和特性来提升数据访问效率。本文介绍如何使用Micronaut简化数据库操作,并提供具体示例代码。Micronaut支持JPA/Hibernate、SQL及NoSQL(如MongoDB),简化配置并无缝集成。通过定义带有`@Repository`注解的接口,可以实现Spring Data风格的命名查询。
82 6
C#一分钟浅谈:使用 ADO.NET 进行数据库访问
【9月更文挑战第3天】在.NET开发中,与数据库交互至关重要。ADO.NET是Microsoft提供的用于访问关系型数据库的类库,包含连接数据库、执行SQL命令等功能。本文从基础入手,介绍如何使用ADO.NET进行数据库访问,并提供示例代码,同时讨论常见问题及其解决方案,如连接字符串错误、SQL注入风险和资源泄露等,帮助开发者更好地利用ADO.NET提升应用的安全性和稳定性。
379 6
PolarDB Proxy配置与优化:提升数据库访问效率
【9月更文挑战第6天】PolarDB是阿里云推出的高性能分布式关系型数据库,PolarDB Proxy作为其关键组件,位于客户端与PolarDB集群间,负责SQL请求的解析与转发,并支持连接池管理、SQL过滤及路由规则等功能。本文详细介绍了PolarDB Proxy的配置方法,包括连接池、负载均衡和SQL过滤设置,并探讨了监控调优、缓存及网络优化策略,以帮助提升数据库访问效率。
69 1
|
4月前
|
探索研究Servlet 数据库访问
【9月更文挑战第28天】
40 0