#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. 五子棋AI清月连珠开源

    经过差不多两年的业余时间学习和编写,最近把清月连珠的无禁手部分完善得差不多了.这中间进行了很多思考,也有很多错误认识,到现在有一些东西还没有全面掌握,所以想通过开源于大家共同交流. 最近一直发表一些五 ...

  2. JMeter学习-038-JMeter Linux 环境配置

    1.1.下载 Download URL:http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-3.0.tg ...

  3. nuget github host

    191.236.146.247 www.nuget.org191.236.146.247 nuget.org 192.30.253.112 github.com192.30.253.113 githu ...

  4. Sqlserver 导出数据脚本

    编写数据压缩选项的脚本 true 要编写脚本的数据的类型 仅限数据

  5. Linux 搭建NTP服务器

    NTP服务器[Network Time Protocol(NTP]是用来使计算机时间同步化的一种协议,NTP服务器可以对其它服务器做时间同步化,从而达到时间统一. 配置环境及要求: A. 假设10.8 ...

  6. Quartus II USB-Blaster驱动解决

    Quartus II USB-Blaster驱动解决 之前安装Quartus II 13.0,但FPGA开发板链接的USB-Blaster链接无法被Quartus识别,改装Quartus II 11. ...

  7. Easy Tag Write(3.3)

    package skyseraph.android.util; /** * @Title : Constant.java * @Package : tcl.nfc.tv.util * @ClassNa ...

  8. springmvc中的controller是单例的

    今天发现spring3中的controller默认是单例的,若是某个controller中有一个私有的变量a,所有请求到同一个controller时,使用的a变量是共用的,即若是某个请求中修改了这个变 ...

  9. 18.有一个网页地址, 比如PHP开发资源网主页: http://www.phpres.com/index.html,如何得到它的内容?

    方法1(对于PHP5及更高版本): $readcontents = fopen("http://www.phpres.com/index.html", "rb" ...

  10. Hdu 1052 Tian Ji -- The Horse Racing

    Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...