mysql+odbc+ado_MFC ado+mysql+odbc技术分享

第一步:建立数据库

假设有一个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)è完成

8b8064b81a525a78c3bc53591270d2e2.png

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

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

bee3295e22367124ec0e070a6a9eb6aa.png

4.

配置ado cpp文件

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

9cb70c2fa52fe5e3b11c73f5cc76ed86.png

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数据操作对所有不同类型的数据源是通用的

d32e0e7fccb79e4eb3faf3113b4858b4.png

注明: 下面的三个变量类型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;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 5.7 window x64_window环境配置Mysql 5.7.21 windowx64.zip免安装版教程详解

1.从官网下载mysql-5.7.21-windowx64.zip mysql下载页面2.解压到合适的位置(E:mysql) 这名字是我改过的3.配置环境变量,将E:mysqlbin 添加到PATH中4.在mysql目录下(E:mysql) 创建 my.ini文件,内容如下:[mysql]# 设置mysql客户端默认字符集def…

mysql设置查询结果最大值_查找MySQL查询结果字段的最大值

将它连接到仅有最大计数的第二个查询。每天最内部查询(对于给定用户)每天计数的一组行数。从那以后,下一个外部执行从该集合中选择MAX()来查找并获得一个代表最高日数的记录...因为它总是返回一行,并且加入到原始的numRequest表中它将是一个笛卡尔&#…

MySQL建表两个单引号报错_极客起源 - geekori.com - 问题详情 - mysql建表报错,查手册看不懂,求解?...

创建带索引的数据库表需要为表名和属性添加反单引号,并且你当前的primary key的位置需要调整一下:create table abc(id int unsigned auto_increment,usename char(20) not null default ,gender char(1) not null default ,weight tinyint unsigned not…

js 用下标获取map值_javascript怎么获取map的值?

Map对象保存键/值对,是键/值对的集合。任何值(对象或者原始值) 都可以作为一个键或一个值。Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应。JavaScript获取map值示例:map对象如下:var mapObject {id1001:…

python attention机制_从零开始学Python自然语言处理(26)—— 强大的Attention机制...

前文传送门:在上一次面试失利后,我回来仔细研究了一下Attention机制,研究完我不禁感悟,这机制真的厉害啊!因为我之前面试被问到的Encoder - Decoder框架中有个瓶颈是编码的结果以固定长度的中间向量表示,这…

[机器人-2]:开源MIT Min cheetah机械狗设计(二):机械结构设计

目录 1、四肢朝向的选择 2、电机布局形式的选择 3、电机的选型及测试(非常重要) 4、结构优化 5、尺寸效应 6、其他 1、四肢朝向的选择 机械狗的结构设计,第一个摆在我们面前的就说四肢的朝向问题,如下图,我们是…

python传文件给java_用java pyhont通过HTTP协议传输文件流

// 代码网上抄的 忘记链接了 抱歉哈packageupload;importjava.io.BufferedReader;importjava.io.DataOutputStream;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;im…

mysql挪到小数点位置_mysql数据库迁移到另一个硬盘上

archliun系统mysql数据库1、对新硬盘分区与格式化1)# fdisk /dev/sdb2) # mkfs.ext4 /dev/sdb12、停止MYSQL服务systemctl stop mysqld3、对数据库文件拷贝# cp -Rp data /mnt/data/4、删除原data文件# rm -rf /data5、禁止开机自启MYSQL服务# systemctl disable mysqld6、对自…

mysql用户权限表join_MyBatis映射利用mysql left join 解决N+1查询问题

1.权限是几乎每个系统都需要的2.一般在用户请求某个url的时候,都需要验证用户是否拥有该url的访问权限3.最简单的权限系统需要 用户表,角色表,用户角色表,权限表,角色权限表# Host: 127.0.0.1 (Version: 5.6.22)# Date…

python 爬取贝壳网小区名称_如何使用 python 爬取全国小区名称

前言笔者在做一个 NLPNLPNLP 项目时,需要识别小区名,因此想要查询网上是否有相关的数据集。经过一番搜索后一无所获…从而决定自己来爬取这份数据。由于爬取网站的内容信息之后可能会发生变更,因此此处给出具体的爬虫思路,便于应对…

mysql hint 简书_MySQL

为满足不同数据库设计要求,减少数据冗余而指定设计规范,可称为数据库范式数据库范式呈递次规范,即高阶范式必然满足低阶范式越高的数据库范式意味着越严格的设计要求,同时数据冗余越小第一范式(1NF):数据库表的每一列都…

python获取手机通知栏消息_Python编写简单的通知栏脚本启动工具

随着自己编写的脚本与安装的工具越来越多,电脑的桌面和文件夹也越来越乱了。就在前几天因为一个不小心,我把自己的一个项目给删了,所以决定将电脑整理一下。不过这一整理我很多脚本和工具的位置我就忘记了,所以决定写个小工具来快速启动一些常用的脚本或工具这里选择Python是因…

java 圆 继承_java 类的继承(转)

这个星期主要是学习了Java中类的继承问题.继承就是由已有的类创建新类,通过子类继承父类的方法,实现一些功能.下面就是老师布置作业的其中一个:定义父类圆,通过继承,获得子类球、圆锥、圆柱,子类具有计算体积的功能。1)新建文件夹Test1&#…

java爬虫 京东_Java爬虫实现京东物流查询

网上没有免费的接口,只能自己写一套了,参考代码如下public static JSONObject getLastInfo(String no){JSONObject jsonObjectnew JSONObject();jsonObject.put("no", no);Connection connectionJsoup.connect("http://www.jdwl.com/orde…

java list stream avg_Java 8 Stream API中的多个聚合函数

要在没有自定义收集器的情况下执行此操作(不再对结果进行流式传输),您可以这样做.它有点脏,因为它首先收集到Map< String,List< TimePeriodCalc>>然后流式传输该列表并获得平均加倍.由于你需要两个平均值,它们被收集到一个Holder或一对,在这种情况下我使用的是Abst…

java 发送邮件昵称_利用JavaMail发送QQ邮件

一、RFC882文档简单说明RFC882文档规定了如何编写一封简单的邮件(纯文本邮件)&#xff0c;一封简单的邮件包含邮件头和邮件体两个部分&#xff0c;邮件头和邮件体之间使用空行分隔。邮件头包含的内容有&#xff1a;from字段   --用于指明发件人to字段    --用于指明收件…

java没有timer类_Java中的Java.util.Timer类 - Break易站

scheduleAtFixedRate(TimerTask task, long delay, long period): java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)在指定的延迟语法后开始&#xff0c;为重复的固定速率执行调度指定的任务&#xff1a;public void scheduleAtFixedRate(TimerT…

java select下拉标签_java中下拉框select和单选按钮的回显操作

前提&#xff1a;1.下拉框select请选择部门selected"selected">${department.department}2.单选按钮radio的回显checked"checked">checked"checked">补充知识&#xff1a;java使用apache commons-fileupload组件实现文件上传(控制文件上…

java 访问控制权限_Java访问控制权限有哪些?区别是什么?

原标题&#xff1a;Java访问控制权限有哪些&#xff1f;区别是什么?Java中的类和方法等都是有访问控制权限的&#xff0c;用来控制方法、类、属性等的生效范围&#xff0c;Java有四种访问控制权限&#xff0c;其中比较常用的就是public和private&#xff0c;今天华清远见Java学…

java 操作cursor数据库_Java连接各种数据库以及调用存储过程

准备工作&#xff1a;1. 创建表drop table T_TEST_PROCEDURE cascade constraints;/**//*Table: T_TEST_PROCEDURE*//**/createtable T_TEST_PROCEDURE (IDNUMBER(19) not null,NAMEVARCHAR2(40),AGE NUMBER(3),constraintPK_T_TEST_PROCEDURE primary key (ID));2. 创建存储过…