第一步:建立數據庫
假設有一個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;
}