#pragma once
#include <vector>
// 加入ADO支持库,
#import "C:\Program Files\Common Files\System\ado\msado15.dll" \
no_namespace \
rename ("EOF", "adoEOF") template<typename stDBDATA>
class CADO
{
public:
CADO();
virtual ~CADO();
public:
static void dump_com_error(_com_error &e);
bool Init();
bool Start();
void Uninit();
public:
void OnWrite(char* name, int age);
void OnRead();
void OnDelete();
void OnModify();
void OnExcute(); private: _ConnectionPtr m_pConnection; _CommandPtr m_pCommand;
_RecordsetPtr m_pRecordset;
_RecordsetPtr m_pRecordset1;
char* m_strCommand; }; template<class stDBDATA>
CADO<stDBDATA>::CADO()
{
Init();
} template<class stDBDATA>
CADO<stDBDATA>::~CADO()
{
Uninit();
} template<class stDBDATA>
void CADO<stDBDATA>::dump_com_error(_com_error &e)
{
char ErrorStr[MAX_PATH]; _bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
sprintf_s(ErrorStr, "\n\tADO Error\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n\n",
e.Error(), e.ErrorMessage(), (LPCTSTR)bstrSource, (LPCTSTR)bstrDescription);
printf(ErrorStr);
} template<class stDBDATA>
bool CADO<stDBDATA>::Init()
{
// 初始化COM,创建ADO连接等操作
int S_Result = OleInitialize(NULL);
HRESULT hr = m_pConnection.CreateInstance(__uuidof(Connection));
/*HRESULT hr = m_pConnection.CreateInstance("ADODB.Connection");*/
if(FAILED(hr))
{
printf("m_pConnection.CreateInstance调用失败\n");
return false;
}
try
{
// 打开本地Access库Demo.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);
}
catch(_com_error& e)
{
dump_com_error(e);
return false;
} return true;
} template<class stDBDATA>
bool CADO<stDBDATA>::Start()
{
// 使用ADO创建数据库记录集
m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{
m_pRecordset->Open("SELECT * FROM USERTABLE", // 查询User表中所有字段
m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error& e)
{
dump_com_error(e);
return false;
} return true;
} template<class stDBDATA>
void CADO<stDBDATA>::Uninit()
{
// 关闭ADO连接状态
if(m_pConnection->State)
{
m_pConnection->Close();
m_pConnection= NULL;
} if(m_pRecordset->State)
{
m_pRecordset->Close();
m_pRecordset.Release();
m_pRecordset = NULL;
}
} template<class stDBDATA>
void CADO<stDBDATA>::OnWrite(char* name, int age)
{
long age_l = age;
try
{
// 写入各字段值
m_pRecordset->AddNew();
m_pRecordset->PutCollect("Name", LPSTR(name));
m_pRecordset->PutCollect("Age", age_l);
m_pRecordset->Update();
}
catch(_com_error& e)
{
dump_com_error(e);
}
} template<class stDBDATA>
void CADO<stDBDATA>::OnRead()
{
_variant_t var; char strName[MAX_PATH];
int age; try
{
if(!m_pRecordset->BOF)
{
m_pRecordset->MoveFirst();
}
else
{
printf("表内数据为空\n");
return;
} while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
{
strcpy_s(strName, _bstr_t(var));
}
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
{
age = atol(_bstr_t(var));
} stDBDATA data(strName, age);
data.print(); m_pRecordset->MoveNext();
}
}
catch(_com_error& e)
{
dump_com_error(e);
}
} template<class stDBDATA>
void CADO<stDBDATA>::OnDelete()
{
try
{
m_pRecordset->MovePrevious();
// 删除当前行记录
m_pRecordset->Delete(adAffectCurrent);
m_pRecordset->Update(); }
catch(_com_error& e)
{
dump_com_error(e);
}
} template<class stDBDATA>
void CADO<stDBDATA>::OnModify()
{
char m_Name[MAX_PATH] = "fffff";
long m_Age = ; // 修改当前记录的字段值
try
{
m_pRecordset->PutCollect("Name", _variant_t(m_Name));
m_pRecordset->PutCollect("Age", m_Age);
m_pRecordset->Update();
}
catch(_com_error& e)
{
dump_com_error(e);
}
} template<class stDBDATA>
void CADO<stDBDATA>::OnExcute()
{
_CommandPtr m_pCommand;
m_strCommand = "delete from USERTABLE where Name = 'fffff'"; m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于它
m_pCommand->CommandText = _bstr_t((LPCTSTR)m_strCommand); // SQL语句
try
{
// 执行SQL语句,返回记录集,此记录不能做插入操作
// 故为了不和m_pRecordset相冲突, 放入新定义的m_pRecordset1
m_pRecordset1 = m_pCommand->Execute( NULL, NULL, adCmdText);
}
catch(_com_error& e)
{
dump_com_error(e);
}
}

 

 #include "ado.h"

 struct stDB
{
char name[MAX_PATH];
int age; stDB()
{ } stDB(char* _name, int _age)
{
strcpy_s(name,MAX_PATH, _name);
age = _age;
} void print()
{
printf("Name:%s------Age:%d\n", name, age);
}
}; int main()
{
CADO<stDB> ado;
ado.Start();
ado.OnRead();
ado.OnWrite("q1", );
ado.OnModify();
ado.OnDelete();
ado.OnExcute();
ado.OnRead();
system("pause");
return ;
}

ADO 读取 ACCESS的更多相关文章

  1. ADO访问Access数据库错误解决心得随笔

    最近在用ADO访问Access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下. 环境 win7 x86系统: VS2012编译器: Office2010: Access2000~ ...

  2. c# ADO连接Access 执行Open后程序自动退出

    今天利用ADO连接Access数据库的时候遇到了前所未见的问题,Access数据库连接串,OleDbConnection,open的时候,系统就会自动关闭所有调试. 我就很纠结了,这个AccessHe ...

  3. ADO读取EXCEL

    窗体上拖放ADOQuery1,DataSetProvider1,DataSource1,ClientDataSet1,OpenDialog1, ExcelApplication1,ExcelWorkb ...

  4. java读取ACCESS数据库的简单示例

    java读取ACCESS数据库的简单示例 虽然简单,对初学者来说,如果没有一段可以成功执行的代码供参考,还真难调试 先用ACCESS建一个数据库 DB1.MDB,里面有一表"table1&q ...

  5. PHP使用UTF8编码读取ACCESS的乱码问题解决方案(转)

    PHP使用UTF8编码读取ACCESS的乱码问题解决方案 http://it.xwstudy.com/readnews.php?id=627 来源:本站编辑 发布日期:2013-05-27 已有 17 ...

  6. x64 win64编译环境下ADO链接Access数据库的问题解决

    原文链接地址:https://blog.csdn.net/HW140701/article/details/71077579 Win32编译环境下,用ADO数据库连接Access数据库一般都不会报错, ...

  7. MFC通过ADO操作Access数据库

    我在<VC知识库在线杂志>第十四期和第十五期上曾发表了两篇文章——“直接通过ODBC读.写Excel表格文件”和“直接通过DAO读.写Access文件”,先后给大家介绍了ODBC和DAO两 ...

  8. 直接通过ADO操作Access数据库

    我在<VC知识库在线杂志>第十四期和第十五期上曾发表了两篇文章——“直接通过ODBC读.写Excel表格文件”和“直接通过DAO读.写Access文件”,先后给大家介绍了ODBC和DAO两 ...

  9. 如何读取Access里的OLE类型的图片

    身份证一类读卡器读取的照片信息,保存在Access数据库中一般为OLE型字段,图片为BMP格式,因为是用其读卡器写入的,其数据类型为常二进制数据. 再用报表或EXCEL读取这些图片时,如果将该图片字段 ...

随机推荐

  1. imx6 关闭调试串口

    需要关闭imx6调试串口,用作普通的串口使用. 参考链接 http://blog.csdn.net/neiloid/article/details/7585876 http://www.cnblogs ...

  2. https://yq.aliyun.com/articles/65125?spm=5176.100240.searchblog.18.afqQoU

    https://yq.aliyun.com/articles/65125?spm=5176.100240.searchblog.18.afqQoU

  3. css初始化样式代码

    为什么要初始化CSS? CSS初始化是指重设浏览器的样式.不同的浏览器默认的样式可能不尽相同,所以开发时的第一件事可能就是如何把它们统一.如果没对CSS初始化往往会出现浏览器之间的页面差异.每次新开发 ...

  4. Git的.gitignore文件配置

    .gitignore是Git工具的配置文件,用于屏蔽某些文件上传到线上. 创建.gitignore 在window系统中,不允许新建文件名以"."开头的文件,所以通过git bas ...

  5. MVC中的数据注解和验证

    数据注解和验证 用户输入验证在客户端浏览器中需要执行验证逻辑. 在客户端也需要执行. 注解是一种通用机制, 可以用来向框架注入元数据, 同时, 框架不只驱动元数据的验证, 还可以在生成显示和编辑模型的 ...

  6. duilib各种布局的作用,相对布局与绝对布局的的意义与用法

    大多数刚使用duilib的朋友时候非常依赖duilib自带的设计器,用他可以拖拉控件,可视化的做出自己想要的界面.可是用一段时间就会发现原带的设计器有很多bug,时不时会崩溃,支持的控件数量有限,属性 ...

  7. 阿里 otter搭建过程整理

    1 环境说明: 本机ip 192.168.8.3 虚拟机1 ip 192.168.8.5 虚拟机2 ip 192.168.8.6 虚拟机采取桥接模式 虚拟机系统为CentOS 2.6.32-279.e ...

  8. mysql dba系统学习(6)二进制日志binlog之二

    MySQL 5.5 中对于二进制日志 (binlog) 有 3 种不同的格式可选:Mixed,Statement,Row,默认格式是 Statement.总结一下这三种格式日志的优缺点.MySQL R ...

  9. [转]在Ubuntu 14.04安装和使用Docker

    在Ubuntu 14.04安装和使用Docker 作者:chszs,版权所有,未经同意,不得转载.博主主页:http://blog.csdn.net/chszs Docker是一个开源软件,它可以把一 ...

  10. 滚动轮播效果,.net 没得混看来只能去写js 了

    <!DOCTYPE html> <html> <head> <title> 滚动图片 </title> <style type=&qu ...