#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. Java中MyEclipse快捷键整理

    ************************************  MyEclipse 快捷键1(CTRL) ************************************ Ctrl ...

  2. css 居中问题

    水平居中有text-align:center 和 margin:0 auto,前者是针对父元素进行设置而后者则是对子元素.margin:0 auto; 这里实现的前提是子元素没有float 浮动起来, ...

  3. HTTPS 协议和原理

    1 HTTPS 协议概述 HTTPS 可以认为是 HTTP + TLS.HTTP 协议大家耳熟能详了,目前大部分 WEB 应用和网站都是使用 HTTP 协议传输的. TLS 是传输层加密协议,它的前身 ...

  4. 网络监测工具-iftop教程

    在类Unix系统中可以使用top查看系统资源.进程.内存占用等信息.查看网络状态可以使用netstat.nmap等工具.若要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop. 一.if ...

  5. MS SQL数据类型比较

    字符串数据类型 char此数据类型可存储1~8000个定长字符串,字符串长度在创建时指定:如未指定,默认为char(1).每个字符占用1byte存储空间.nchar此数据类型可存储1~4000个定长U ...

  6. Handler用法

    1.子线程创建handler 方法一 HandlerThread handlerThread = new HandlerThread(" sub thread name");  / ...

  7. 使用SSIS汇集监控数据

    1.背景 数据库服务器部署有各类巡检脚本,现在想把巡检收集到的数据汇集到一起.Source源对应的是各业务数据库服务器,Destination目标对应的是保存汇集数据的服务器.前期部署的时候已将巡检相 ...

  8. cordova使用Gradle构建下载maven太慢,使用阿里云镜像

    修改build.gradle: buildscript { repositories { maven{ url 'http://maven.aliyun.com/nexus/content/group ...

  9. 基本C语言滤波算法

    11种软件滤波方法的示例程序 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad(); 1.限副滤波 /*  A值可根据实际情况调整 value为有效值,new ...

  10. Model Validation in ASP.NET Web API By Mike Wasson|July 20, 2012 268 of 294 people found this helpful

    using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using ...