第一步:建立数据库

假设有一个sql文件

mysql>use dbname;                   //创建一个数据库名为dbname的数据库(空数据库)

mysql>set names utf8;              //编码,mysql>source D:/dbname.sql;  //导入一个数据库源文件创建数据库内容

我做的工程数据库名称是db_grain

第二步创建数据源

三、搭建数据源。

本项目中是用的是odbc(驱动)+mysql的数据源

1、安装相应的mysql-connector(分32,64位)。

我装的是mysql-connector-odbc-5.1.5-win32.msi驱动。

2、控制面板è管理工具(或{性能与…..})è数据源(odbc)è添加è你相应的odbc驱动。

(我的是5.1)è完成

3.完成后会跳出下面对话框。Name可以自己填,软件项目中会用到下面你填的内容

database在填写server,port,user,password后直接下拉得到,如果没有则前面的填写错误

4.

配置ado cpp文件

1、在项目中导入下面两个文件到相应包下面。

5.修改ado.cpp文件的OnInitADOConn()//不同驱的数据源只要改onInitADOConn()中的两个值(bstr_t strConnect,m_pConnection->Open)就行了,其他不要改

void ADO::OnInitADOConn()

{

::CoInitialize(NULL);

try

{

m_pConnection.CreateInstance("ADODB.Connection"); //这里不用改

_bstr_t strConnect="DRIVER={MySQL ODBC 5.1 Driver};//这里改成你的驱动名称(假如你的是access数据驱动改成你的access驱动如Microsoft Access Driver (*.mdb))

Server=localhost;

/*

Persist Security Info ----是否保存安全信息User ID-------------------用户名PassWord------------------密码Initial Catalog-----------数据库的名称或者数据库ip或者目录Data Source---------------数据源

*/

PassWord=123456;

Persist Security Info=False;

User ID=root;

Data Source=autoresour";

m_pConnection->Open(strConnect,"","",adModeUnknown); //

/* Open (

const _variant_t & Source,

const _variant_t & ActiveConnection,

enum CursorTypeEnum CursorType,//””

enum LockTypeEnum LockType,//一般为””

long Options ); }*/ //一般是 adModeUnknown

catch(_com_error e)

{

AfxMessageBox(e.Description()); //

}

}

以我工程的数据源名称为"autoresour"为例

// ADO.cpp: implementation of the ADO class.

//

//

#include "stdafx.h"

#include "ADO.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

//

// Construction/Destruction

//

ADO::ADO()

{

}

ADO::~ADO()

{

}

void ADO::OnInitADOConn()

{

::CoInitialize(NULL);

try

{

m_pConnection.CreateInstance("ADODB.Connection"); //创建连接对象实例

_bstr_t strConnect="DRIVER={MySQL ODBC 5.2w Driver};Server=localhost;PassWord=123456;Persist Security Info=False;User ID=root;Data Source=autoresour";

m_pConnection->Open(strConnect,"","",adModeUnknown); //打开数据库

}

catch(_com_error e)

{

AfxMessageBox(e.Description()); //弹出错误处理

}

}

_RecordsetPtr& ADO::OpenRecordset(CString sql)

{

ASSERT(!sql.IsEmpty()); //SQL语句不能为空

try

{

m_pRecordset.CreateInstance(__uuidof(Recordset)); //创建记录集对象实例

m_pRecordset->Open(_bstr_t(sql), m_pConnection.GetInterfacePtr(),

adOpenDynamic, adLockOptimistic, adCmdText); //执行SQL得到记录集

}

catch(_com_error e) //捕获可能的异常

{

AfxMessageBox(e.Description());

}

return m_pRecordset;

}

void ADO::CloseRecordset()

{

if(m_pRecordset->GetState() == adStateOpen) //判断当前的记录集状态

m_pRecordset->Close(); //关闭记录集

}

void ADO::CloseConn()

{

m_pConnection->Close(); //关闭数据库连接

::CoUninitialize(); //释放COM环境

}

CString ADO::getTimeToULong(){

SYSTEMTIME sm;

::GetLocalTime(&sm);

CTime tmSCan(sm);

CString szTime = tmSCan.Format("%Y-%m-%d %H:%M:%S");

return szTime;

}

UINT ADO::GetRecordCountt(_RecordsetPtr pRecordset)

{

int nCount = 0; //声明保存记录数的变量

try{

pRecordset->MoveFirst(); //将记录集指针移动到第一条记录

}

catch(...) //捕捉可能出现的错误

{

return 0; //产生错误时返回0

}

if(pRecordset->adoEOF) //判断记录集中是否没有记录

return 0; //无记录时返回0

while (!pRecordset->adoEOF) //当记录集指针没有指向最后时

{

pRecordset->MoveNext(); //将记录集指针移动到下一条记录

nCount = nCount + 1; //记录个数的变量加1

}

pRecordset->MoveFirst(); //将记录集指针移动到第一条记录

return nCount; //返回记录数

}

CTime ADO::CStringToTime(CString string){

int first=string.Find('-');

int second=string.Find('-',first+1);

int year=atoi(string.Left(4));

int month=atoi(string.Mid(first+1,second-first));

int day=atoi(string.Mid(second+1,string.GetLength()-second-1));

CTime temp(year,month,day,0,0,0);

return temp;

}

CTime ADO::CStringToTimeComplete(CString cstring){//cstring 2013-02-05 01:02:03

int first=cstring.Find('-');

int second=cstring.Find('-',first+1);

int year=atoi(cstring.Left(4));

int month=atoi(cstring.Mid(first+1,second-first));

int day=atoi(cstring.Mid(second+1,10-second-1));

first = cstring.Find(':', second);

second = cstring.Find(':', first + 1);

int hour = atoi(cstring.Mid(first - 2,2));

int minute = atoi(cstring.Mid(second - 2,2));

int secd = atoi(cstring.Mid(second + 1,2));

CTime temp(year,month,day,hour,minute,secd);

return temp;

}

CString ADO::getYMD(CString string){

if(string.Find(" ") != -1){

string = string.Mid(0, string.Find(" "));

}

int first=string.Find('-');

int second=string.Find('-',first+1);

int year=atoi(string.Left(4));

int month=atoi(string.Mid(first+1,second-first));

int day=atoi(string.Mid(second+1,string.GetLength()-second-1));

CString trace;

trace.Format("%d%d%d", year, month, day);

return trace;

}

CString ADO::getYMDHMS(CString date, CString time){

int first=date.Find('-');

int second=date.Find('-',first+1);

int year=atoi(date.Left(4));

int month=atoi(date.Mid(first+1,second-first));

int day=atoi(date.Mid(second+1,date.GetLength()-second-1));

CString trace = "";

CString temp = "";

trace.Format("%d-", year);

temp.Format("%d-", month);

if(month/10 == 0){temp.Format("0%d-", month);}

trace += temp;

temp.Format("%d ", day);

if(day/10 == 0){temp.Format("0%d ", day);}

trace += temp;

temp = time;

if(temp.GetLength() == 7){temp ="0" + time;}

trace += temp;

//TRACE("TRACE:" + trace);

return trace;

}

/*

ADO m_Ado;

m_Ado.OnInitADOConn();//连接数据库

CString SQL = "select * from tb_data"; //设置查询字符串

m_Ado.m_pRecordset = m_Ado.OpenRecordset(SQL);//打开记录集

while(!m_Ado.m_pRecordset->adoEOF)

{

CString strSql = (LPCSTR)(_bstr_t)m_Ado.m_pRecordset->GetCollect("nowtime");

m_Ado.m_pRecordset->MoveNext();//将记录集指针移动到下一条记录

}

m_Ado.CloseRecordset();

m_Ado.CloseConn();//断开数据库连接

*/

修改你的工程的StdAfx.h文件中导入动链接库//在stdAfx.h中

// _AFX_NO_AFXCMN_SUPPORT

//加入#import ""C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace\

rename("EOF","adoEOF")rename("BOF","adoBOF")\//导入ADO动态链接库

//`AFX_INSERT_LOCATION`

//如果把msado15.dll放在工程目录下就以下面我写的为准,放的位置要夹在//AFX_NO_AFXCMN_SUPPORT和//`AFX_INSERT_LOCATION`之间。// stdafx.h : include file for standard system include files,

// or project specific include files that are used frequently, but

// are changed infrequently

//

#if !defined(AFX_STDAFX_H__068DB9EC_AC8F_4663_850A_031896F0B1F2__INCLUDED_)

#define AFX_STDAFX_H__068DB9EC_AC8F_4663_850A_031896F0B1F2__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers

#include // MFC core and standard components

#include // MFC extensions

#include // MFC Automation classes

#include // MFC support for Internet Explorer 4 Common Controls

#ifndef _AFX_NO_AFXCMN_SUPPORT

#include // MFC support for Windows Common Controls

#endif // _AFX_NO_AFXCMN_SUPPORT

#include "SkinPPWTL.h"

#include "sizecbar.h"

#include "scbarg.h"

#include "CoolTabCtrl.h"

#import "msado15.dll" no_namespace\ //导入工程同目录下的ADO动态链接库

rename("EOF","adoEOF")rename("BOF","adoBOF")

//`AFX_INSERT_LOCATION`

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__068DB9EC_AC8F_4663_850A_031896F0B1F2__INCLUDED_)

使用ado类的使用

假设对table为employees操作,ado数据操作对所有不同类型的数据源是通用的

注明: 下面的三个变量类型CString m_ID,m_Name,m_CultureADO m_Ado;

m_Ado.OnInitADOConn();

CString sql = "select * from employees";

m_Ado.m_pRecordset = m_Ado.OpenRecordset(sql);

try

{

/*

//删除操作必须有一下两条组成

m_Ado.m_pRecordset->Move((long)pos,vtMissing);// vtMissing固定字符

m_Ado.m_pRecordset->Delete(adAffectCurrent);

*/

//以下是修改操作

m_Ado.m_pRecordset->Move((long)pos,vtMissing);//vtMissing为const,不能改变的字符,这里就不用修改

m_Ado.m_pRecordset->PutCollect("编号",(_bstr_t)m_ID);

m_Ado.m_pRecordset->PutCollect("姓名",(_bstr_t)m_Name);

m_Ado.m_pRecordset->PutCollect("学历",(_bstr_t)m_Culture);

/*

//以下是添加操作

m_Ado.m_pRecordset->AddNew(); //添加新行

m_Ado.m_pRecordset->PutCollect("编号",(_bstr_t)m_ID);//(_variant_t)(long);_variant_t var;var.intVal = 2;pRs->PutCollect("Layer", var);

m_Ado.m_pRecordset->PutCollect("姓名",(_bstr_t)m_Name);

m_Ado.m_pRecordset->PutCollect("学历",(_bstr_t)m_Culture);

//以下是取值操作

CString tmp = (LPCSTR)(_bstr_t)m_Ado.m_pRecordset->GetCollect("outdtmp");

1.adAffectCurrent Deletes only the current record 仅删除当前记录

2.adAffectGroup Deletes only records that satisfy the Filter setting (Filter must be set to a FilterGroupEnum value or an array of Bookmarks)

对满足当前 Filter 属性设置的记录取消挂起更新。使用该选项时,必须将Filter属性设置为合法的FilterGroupEnum常量之一或设置成一个书签数组

更多参考msdn

*/ m_Ado.CloseRecordset();

m_Ado.CloseConn();

}

catch(...)

{

MessageBox("操作失败");

return;

}

mysql+odbc+ado_MFC ado+mysql+odbc技术分享相关推荐

  1. mysql优化说出九条_技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢?

    原标题:技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢? 背景 2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了. 硬件配置:256G 内存,48 ...

  2. mysql slowlog中querytime分析_技术分享 | Slow Query Log 使用详解

    作者:宓祥康 爱可生交付服务部团队 DBA 擅长日志分析.问题排查等:主要负责处理 MySQL 与我司自研数据库自动化管理平台 DMP 的日常运维问题,对数据库及周边技术有浓厚的学习兴趣. 本文来源: ...

  3. mysql性能优化 洪斌_技术分享 | InnoDB Cluster 如何高效加载数据

    作者:洪斌 爱可生南区负责人兼技术服务总监,MySQL ACE,擅长数据库架构规划.故障诊断.性能优化分析,实践经验丰富,帮助各行业客户解决 MySQL 技术问题,为金融.运营商.互联网等行业客户提供 ...

  4. mysql数据库恢复数据_【技术分享】使用Innodb存储引擎的mysql数据库恢复

    作者:维一零 预估稿费:400RMB(不服你也来投稿啊!) 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 前言 某天,在测试一张新数据表的字段时,由于在phpmyadmin不断 ...

  5. mysql批量添加报错_技术分享 | MySQL 在批量插入时捕捉错误信息

    原创: 杨涛涛 背景 本篇文章来源于今天客户问的一个问题. 问题大概意思是:我正在从 Oracle 迁移到 MySQL,数据已经转换为单纯的 INSERT 语句.由于语句很多,每次导入的时候不知道怎么 ...

  6. mysql capi函数详解_技术分享|MySQLCAPI参数MYSQL_OPT_READ_TIMEOUT的一些行为分析

    作者:戴岳兵 MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数.在 MySQL 的官方文档中,该参数的描述是这样的: MYSQL_OPT_R ...

  7. mysql 走索引 很慢_技术分享 | MySQL优化:为什么SQL走索引还那么慢?

    作者:胡呈清 背景 2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了. 硬件配置:256G 内存,48 core 分析过程 接手这个问题时现场已经不在了,信息有限 ...

  8. mysql 如何设置延迟启动_技术分享 | MySQL 网络延时参数设置建议

    作者:毛思平 工作11年,从事数据库工作7年,主要在金融行业.主要是做oracle,mysql.现在在农行软开中心主要做数据库应用方面的研究. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授 ...

  9. ACMUG活动回顾 | MySQL创始人见面会技术分享会圆满结束

    9月2日,MySQL.MariaDB创始人Monty见面会&技术分享会在杭州圆满落幕.此次会议由ACMUG与沃趣科技携手,邀请数据库领域大神Monty与多位技术专家齐聚一堂,就未来数据库发展趋 ...

最新文章

  1. python在企业有哪些应用_python2和python3在企业中应用有哪些
  2. oracle存储换硬盘,Oracle 10g RAC 数据存储更换
  3. 常用js代码整理、收集
  4. android手机电话铃声设置,安卓手机铃声怎么设置
  5. python 编程效率_五个Python编程Tips,帮你提高编码效率
  6. TSYS2.0对动态碎片的一点理解
  7. 网博士自助建站系统_自助建站系统软件不一样的建站方式
  8. 韩语在线翻译图片识别_3个OCR文字识别工具,最后一个许多人都不知道!
  9. teamviewer远程控制工具
  10. ENSP模拟实验OSPF NSSA区域
  11. 【React】报错:Error: Element type is invalid: expected a string (for built-in components) or a class/fun
  12. 高等数学:第三章 微分中值定理与导数的应用(3)泰勒公式
  13. 2020线上夏令营感受
  14. 怎么解log方程_对数方程的解法
  15. 打开小米5开发者选项
  16. JAVA IO与NIO优劣浅析
  17. Nii图像的读取、操作与保存
  18. [Android] ListView 实现隔行变色(二)
  19. 给文件夹重命名python
  20. android系统联系人可以转到blackberry os 7.,采取2步验证后如何同步iCloud联系人到黑莓OS10手机...

热门文章

  1. Serverless 终结 Kubernetes?
  2. “Java跌落向下,Python奋斗向前”,程序员:看哭了...
  3. 云有约 | 在去O的道路上,AWS表示:经验可复制,惊喜并非只属于我们!
  4. 这是一则计算机视觉顶级会议CVPR与腾讯的爆闻,啥?
  5. 雾计算精华问答 | 雾计算是如何构成的?
  6. react中的state详解
  7. es6 Promise,生成器函数,async
  8. fdisk 分区_【linux】循序渐进学运维-基础篇-分区命令fdisk
  9. android 创建文件夹_Android 动画小记
  10. php里的utf-8编码,php – 修复损坏的UTF-8编码