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.pswp.cn/news/529413.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529413.shtml
英文地址,請注明出處:http://en.pswp.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. 創建存儲過…