vs2010操作本地access数据库和远程操作Mysql数据的应用实例
2013-11-03 17:14
1171 查看
1.通过Ado本地操作access数据库
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
或者 #import ".\msado15.dll" no_namespace rename("EOF", "adoEOF")
具体本地连接和操作本地access数据库
封装案例如下
class DBCONNECT
{
public:
_bstr_t m_DBName;
_bstr_t m_tableName;
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
public :
HRESULT hr;
//Initial Object
DBCONNECT(char* DBName,char* tableName)
{
m_DBName = DBName;
m_tableName = tableName;
}
//Destory Object
~DBCONNECT()
{
if(NULL != m_pConnection && m_pConnection->State == adStateOpen) m_pConnection->Close();
if(NULL != m_pRecordset && m_pRecordset->State == adStateOpen) m_pRecordset->Close();
m_pRecordset=0;
m_pConnection=0;
CoUninitialize();
}
int connDBAndTable()
{
char tmpDataSource[256] = {0};//Jet OLEDB :Database Password = admin //
sprintf(tmpDataSource,"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=false;Jet OLEDB:Database Password=admin",(char*)m_DBName);
CoInitialize(NULL);
try
{
m_pConnection.CreateInstance(__uuidof(Connection)); //(__uuidof(Connection));//("ADODB.Connection");
hr = m_pConnection->Open(tmpDataSource,"","",adModeUnknown);
}
catch(_com_error e)
{
CMsgBox::ShowMsgBox(NULL,"数据库连接失败,确认数据库是否存在或者是否在当前路径下!",MB_OK,MB_ERROR);
return -1;
}
try
{
memset(tmpDataSource,0,sizeof(tmpDataSource));
sprintf(tmpDataSource,"select * from %s",(char*)m_tableName);
m_pRecordset.CreateInstance(__uuidof(Recordset));
hr = m_pRecordset->Open(tmpDataSource,m_pConnection.GetInterfacePtr(), adOpenKeyset,adLockOptimistic, adCmdText);
}
catch(_com_error e)
{
CMsgBox::ShowMsgBox(NULL,(char*)e.ErrorMessage(),MB_OK,MB_ERROR);
return -1;
}
return 0;
}
//////////////////////////////////////////////////
//Function Used To Excute SQL Statements
// char* m_sql: SELECT Sql Statements
/////////////////////////////////////////////////
BOOL ExcuteSQL(char* m_sql){
int rows = 0;
_variant_t rowsAffect;
try{
m_pConnection->Execute(m_sql,&rowsAffect,adCmdText);
rows = rowsAffect.intVal;
}catch(_com_error* e)
{
CMsgBox::ShowMsgBox(NULL,(char*)e->ErrorMessage(),MB_OK,MB_ERROR);
}
return rows>0?TRUE:FALSE;
}
///////////////////////////////////////////////
//Function Used To Fetch Data Recordset
// char* m_sql: SELECT Sql Statements
///////////////////////////////////////////////
_RecordsetPtr FetchData(char* m_sql){
_RecordsetPtr tmpRecordset ;
m_pRecordset.CreateInstance("ADODB.Recordset");
try
{
tmpRecordset = m_pConnection->Execute(m_sql,NULL,adCmdText);
}
catch(_com_error* e)
{
CMsgBox::ShowMsgBox(NULL,(char*)e->ErrorMessage(),MB_OK,MB_ERROR);
}
return tmpRecordset;
}
///////////////////////////////////////////////
//Function Used To Fetch Data Recordset
// char* m_sql: SELECT Sql Statements
// int& rowAffect: Return Count Of Rows In Recordset
//////////////////////////////////////////////
_RecordsetPtr FetchData(char* m_sql,int& rowsAffect){
m_pRecordset.CreateInstance("ADODB.Recordset");
try{
_RecordsetPtr tmpRecordset = m_pConnection->Execute(m_sql,NULL,adCmdText);
rowsAffect = tmpRecordset->GetRecordCount();
if (rowsAffect < 0){
tmpRecordset->MoveFirst();
rowsAffect = 0;
while (! tmpRecordset->adoEOF) {
rowsAffect++;
tmpRecordset->MoveNext();
}
}
}catch(_com_error* e)
{
CMsgBox::ShowMsgBox(NULL,(char*)e->ErrorMessage(),MB_OK,MB_ERROR);
}
return m_pRecordset;
}
};
2.通过Ado和ODBC远程操作Mysql数据库的发法
2.1 通过ADO连接MySql数据库,首先得安装MyODBC服务器程序。MyODBC版本要和MySql的版本对应上,否则会连接不上数据库。我用的版本分别是mysql-5.1.48-win32.msi和mysql-connector-odbc-5.1.5-win32.msi。
安装好后,点击开始菜单->设置->控制面板->管理工具->数据源(ODBC)->用户DSN->添加->选择MySQL ODBC 5.1 Driver。如下图:
设置好DNS ,Mysql所在服务器Ip,Mysql用户名,密码,选择数据库 ,另外有时候出现乱码现象,所以还需要设置字符编码的
2.2 封装好的应用类
//#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
#import ".\msado15.dll" no_namespace rename("EOF", "adoEOF")
#include "../common/msgbox/MsgBox.h"
#if !defined(AFX_ADOCONN_H__AC448F02_AF26_45E4_9B2D_D7ECB8FFCFB9__INCLUDED_)
#define AFX_ADOCONN_H__AC448F02_AF26_45E4_9B2D_D7ECB8FFCFB9__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class ADOConn
{
// 定义变量
public:
//添加一个指向Connection对象的指针:
_ConnectionPtr m_pConnection;
//添加一个指向Recordset对象的指针:
_RecordsetPtr m_pRecordset;
_bstr_t m_DNSDataResorce;
_bstr_t m_serverIp;
_bstr_t m_userName;
_bstr_t m_passWord;
_bstr_t m_DBName;
_bstr_t m_tableName;
// 定义方法
public:
ADOConn(char* DNSDataResorce,char* serverIp,char* userName,char* passWord,char* DBName,char* tableName)
{
m_DNSDataResorce = DNSDataResorce;
m_serverIp = serverIp;
m_userName = userName;
m_passWord = passWord;
m_DBName = DBName;
m_tableName = tableName;
}
int connectDB()
{
// 初始化OLE/COM库环境
::CoInitialize(NULL);
char tmpConnStr[1024] = {0};
try
{
// 创建Connection对象
sprintf(tmpConnStr,"DSN=%s;Server=%s;Database=%s",(char*)m_DNSDataResorce,(char*)m_serverIp,(char*)m_DBName);
m_pConnection.CreateInstance("ADODB.Connection");
//m_pConnection->Open("DSN=ADOmysql;Server= localhost;Database=testmysql","root","123456",adModeUnknown);
m_pConnection->Open(tmpConnStr,m_userName,m_passWord,adModeUnknown);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
CMsgBox::ShowMsgBox(NULL,(char*)e.ErrorMessage(),MB_OK,MB_ERROR);
return -1;
}
try
{
memset(tmpConnStr,0,sizeof(tmpConnStr));
sprintf(tmpConnStr,"select * from %s",(char*)m_tableName);
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->Open(tmpConnStr,m_pConnection.GetInterfacePtr(), adOpenKeyset,adLockOptimistic, adCmdText);
}
catch(_com_error e)
{
CMsgBox::ShowMsgBox(NULL,(char*)e.ErrorMessage(),MB_OK,MB_ERROR);
return -1;
}
return 0;
}
virtual ~ADOConn()
{
// 关闭记录集和连接
if(NULL != m_pRecordset && m_pRecordset->State == adStateOpen) m_pRecordset->Close();
if(NULL != m_pConnection && m_pConnection->State == adStateOpen) m_pConnection->Close();
m_pRecordset=0;
m_pConnection=0;
// 释放环境
::CoUninitialize();
}
// 执行查询
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL)
{
try
{
// 连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
connectDB();
// 创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
CMsgBox::ShowMsgBox(NULL,(char*)e.ErrorMessage(),MB_OK,MB_ERROR);
}
// 返回记录集
return m_pRecordset;
}
// 执行SQL语句,Insert Update _variant_t
BOOL ExecuteSQL(_bstr_t bstrSQL)
{
try
{
// 是否已经连接数据库
if(m_pConnection == NULL)
connectDB();
// Connection对象的Execute方法:(_bstr_t CommandText,
// VARIANT * RecordsAffected, long Options )
// 其中CommandText是命令字串,通常是SQL命令。
// 参数RecordsAffected是操作完成后所影响的行数,
// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存储过程;adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
CMsgBox::ShowMsgBox(NULL,(char*)e.ErrorMessage(),MB_OK,MB_ERROR);
return false;
}
}
};
#endif // !defined(AFX_ADOCONN_H__AC448F02_AF26_45E4_9B2D_D7ECB8FFCFB9__INCLUDED_)
另外ADO的常用操作如下
if(!tmpConnDb.m_pRecordset->BOF)
// tmpConnDb.m_pRecordset->MoveFirst();
//_variant_t var;
//while(!tmpConnDb.m_pRecordset->adoEOF)
//{
// var = tmpConnDb.m_pRecordset->GetCollect("RecordID");
// tmpConnDb.m_pRecordset->put_Collect((_variant_t)"RecordValue",(_variant_t)"192.1.2.212");
// tmpConnDb.m_pRecordset->MoveNext();
//}
//tmpConnDb.m_pRecordset->AddNew();
//tmpConnDb.m_pRecordset->MoveFirst();
//tmpConnDb.m_pRecordset->Move(LONG(2));
//tmpConnDb.m_pRecordset->Fields->GetItem
// (_variant_t("RecordID"))->Value=_bstr_t("E103");
//tmpConnDb.m_pRecordset->Fields->GetItem
// (_variant_t("RecordValue"))->Value=_bstr_t("192.1.2.210");
//tmpConnDb.m_pRecordset->Fields->GetItem
// (_variant_t("Remark"))->Value=_bstr_t("测试添加数据所用E03");
//tmpConnDb.m_pRecordset->MoveFirst();//
//tmpConnDb.m_pRecordset->Delete(adAffectCurrent);
//tmpConnDb.m_pRecordset->MoveLast();
//tmpConnDb.m_pConnection->Execute("update parameterTab set Remark='sql更新语句remark' where RecordID='hsy'",NULL,adCmdText);
//tmpConnDb.m_pRecordset->Update();
//tmpConnDb.m_pConnection->Execute("delete * from parameterTab",NULL,adCmdText);
//int recordCount = tmpConnDb.m_pRecordset->GetRecordCount();
//recordCount = tmpConnDb.m_pRecordset->GetRecordCount();
//recordCount = tmpConnDb.m_pRecordset->GetRecordCount();
//recordCount = tmpConnDb.m_pRecordset->GetRecordCount();
3.通过Mysql自带接口远程访问Mysql数据库,自己封装类如下:
pragma once
#include "mysql.h"
#include "winsock.h"
#include "../baseStruct.h"
class MysqlApiRWDB
{
public:
MysqlApiRWDB(char*,char*,char*,char*,int port=3306);
int initAndConnectDB();
int executeSQL(char* sql);
MYSQL_RES* getRecordSet();
int getRecordRows();
int getFieldsNum();
char* getFieldName(int i);
MYSQL_ROW getRecordRow();
char* getRocoredCoulumValue(int i);
~MysqlApiRWDB();
private:
MYSQL m_mysql;
MYSQL_RES* m_res;
MYSQL_ROW m_row;
MYSQL_FIELD* m_field;
char m_mysqlServerIp[MAXIPLEN];
char m_mysqlUserName[MYSQLPARAMERERMAX];
char m_mysqlPassword[MYSQLPARAMERERMAX];
char m_mysqlDBname[MYSQLPARAMERERMAX];
int m_mysqlServerPort;
};
#include "mysqlApiRWDB.h"
/*
class MysqlApiRWDB
{
public:
MysqlApiRWDB();
int initAndConnectDB();
int executeSQL(char* sql);
MYSQL_RES* getRecordSet();
int getRecordRows();
int getFieldsNum();
MYSQL_FIELD* getFieldName(int i);
MYSQL_ROW getRecordRow();
char* getRocoredCoulum();
~MysqlApiRWDB();
private:
MYSQL m_mysql;
MYSQL_RES* m_res;
MYSQL_ROW m_row;
MYSQL_FIELD* m_field;
char m_mysqlServerIp[MAXIPLEN];
char m_mysqlUserName[MYSQLPARAMERERMAX];
char m_mysqlPassword[MYSQLPARAMERERMAX];
char m_mysqlDBname[MYSQLPARAMERERMAX];
int m_mysqlServerPort;
};
*/
MysqlApiRWDB::MysqlApiRWDB(char* mysqlServerIp,char* mysqlUserName,char* mysqlPassword,char* mysqlDBname,int mysqlServerPort)
{
memset(m_mysqlServerIp,0,MAXIPLEN);
memset(m_mysqlUserName,0,MYSQLPARAMERERMAX);
memset(m_mysqlPassword,0,MYSQLPARAMERERMAX);
memset(m_mysqlDBname,0,MYSQLPARAMERERMAX);
strcpy(m_mysqlServerIp,mysqlServerIp);
strcpy(m_mysqlUserName,mysqlUserName);
strcpy(m_mysqlPassword,mysqlPassword);
strcpy(m_mysqlDBname,mysqlDBname);
m_mysqlServerPort = mysqlServerPort;
}
int MysqlApiRWDB::initAndConnectDB()
{
if(mysql_library_init(0, NULL, NULL)!=0)
{
return -1;
}
if(!mysql_init(&m_mysql))
{
return -1;
}
if (0 != mysql_options(&m_mysql, MYSQL_SET_CHARSET_NAME, "gb2312"))
{
return -1;
}
if(!mysql_real_connect(&m_mysql,m_mysqlServerIp,m_mysqlUserName,m_mysqlPassword,m_mysqlDBname,m_mysqlServerPort, NULL, 0))
{
return -1;
}
return 0;
}
int MysqlApiRWDB::executeSQL(char* sql)
{
if (0 != mysql_query(&m_mysql,sql))
{
return -1;
}
return 0;
}
MYSQL_RES* MysqlApiRWDB::getRecordSet()
{
//一次性取得数据集
m_res = mysql_store_result(&m_mysql);
return m_res;
}
int MysqlApiRWDB::getRecordRows()
{
return (int)mysql_num_rows(m_res);
}
int MysqlApiRWDB::getFieldsNum()
{
return mysql_num_fields(m_res);
}
char* MysqlApiRWDB::getFieldName(int i)
{
unsigned int fieldcount = mysql_num_fields(m_res);
if(i>(int)fieldcount)
return NULL;
m_field = mysql_fetch_field_direct(m_res, i);
return m_field->name;
}
MYSQL_ROW MysqlApiRWDB::getRecordRow()
{
m_row = mysql_fetch_row(m_res);
return m_row;
}
char* MysqlApiRWDB::getRocoredCoulumValue(int i)
{
if(i>getFieldsNum())
return "";
return m_row[i];
}
MysqlApiRWDB::~MysqlApiRWDB()
{
//mysql_free_result(m_res);
mysql_close(&m_mysql);
mysql_server_end();
}
实际操作举例:
MysqlApiRWDB tmpMysqlApiConn(m_mysqlDBConfig.mysqlServerIp,m_mysqlDBConfig.mysqlUserName,m_mysqlDBConfig.mysqlPassword,m_mysqlDBConfig.dataBaseName,m_mysqlDBConfig.mysqlServerPort);
if(tmpMysqlApiConn.initAndConnectDB()<0)
{
CMsgBox::ShowMsgBox(GetHWND(),"初始化连接远程Mysql数据库失败!",MB_OK,MB_ERROR);
return ;
}
tmpMysqlApiConn.executeSQL("select * from serviceDef order by serviceCode");
tmpMysqlApiConn.getRecordSet();
int recordSize = tmpMysqlApiConn.getRecordRows();
for(int i=0;i<recordSize;i++)
{
tmpMysqlApiConn.getRecordRow();
TUnionServerCode tmpServerCode;
memset(&tmpServerCode,0,sizeof(TUnionServerCode));
if(tmpMysqlApiConn.getRocoredCoulumValue(0))
_tcscpy(tmpServerCode.serviceCode,tmpMysqlApiConn.getRocoredCoulumValue(0));
if(tmpMysqlApiConn.getRocoredCoulumValue(1))
_tcscpy(tmpServerCode.serviceName,tmpMysqlApiConn.getRocoredCoulumValue(1));
if(tmpMysqlApiConn.getRocoredCoulumValue(2))
_tcscpy(tmpServerCode.reqFieldList,tmpMysqlApiConn.getRocoredCoulumValue(2));
if(tmpMysqlApiConn.getRocoredCoulumValue(3))
_tcscpy(tmpServerCode.resFieldList,tmpMysqlApiConn.getRocoredCoulumValue(3));
if(tmpMysqlApiConn.getRocoredCoulumValue(4))
_tcscpy(tmpServerCode.remark,tmpMysqlApiConn.getRocoredCoulumValue(4));
m_vecAllServerCode.push_back(tmpServerCode);
}
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
或者 #import ".\msado15.dll" no_namespace rename("EOF", "adoEOF")
具体本地连接和操作本地access数据库
封装案例如下
class DBCONNECT
{
public:
_bstr_t m_DBName;
_bstr_t m_tableName;
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
public :
HRESULT hr;
//Initial Object
DBCONNECT(char* DBName,char* tableName)
{
m_DBName = DBName;
m_tableName = tableName;
}
//Destory Object
~DBCONNECT()
{
if(NULL != m_pConnection && m_pConnection->State == adStateOpen) m_pConnection->Close();
if(NULL != m_pRecordset && m_pRecordset->State == adStateOpen) m_pRecordset->Close();
m_pRecordset=0;
m_pConnection=0;
CoUninitialize();
}
int connDBAndTable()
{
char tmpDataSource[256] = {0};//Jet OLEDB :Database Password = admin //
sprintf(tmpDataSource,"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=false;Jet OLEDB:Database Password=admin",(char*)m_DBName);
CoInitialize(NULL);
try
{
m_pConnection.CreateInstance(__uuidof(Connection)); //(__uuidof(Connection));//("ADODB.Connection");
hr = m_pConnection->Open(tmpDataSource,"","",adModeUnknown);
}
catch(_com_error e)
{
CMsgBox::ShowMsgBox(NULL,"数据库连接失败,确认数据库是否存在或者是否在当前路径下!",MB_OK,MB_ERROR);
return -1;
}
try
{
memset(tmpDataSource,0,sizeof(tmpDataSource));
sprintf(tmpDataSource,"select * from %s",(char*)m_tableName);
m_pRecordset.CreateInstance(__uuidof(Recordset));
hr = m_pRecordset->Open(tmpDataSource,m_pConnection.GetInterfacePtr(), adOpenKeyset,adLockOptimistic, adCmdText);
}
catch(_com_error e)
{
CMsgBox::ShowMsgBox(NULL,(char*)e.ErrorMessage(),MB_OK,MB_ERROR);
return -1;
}
return 0;
}
//////////////////////////////////////////////////
//Function Used To Excute SQL Statements
// char* m_sql: SELECT Sql Statements
/////////////////////////////////////////////////
BOOL ExcuteSQL(char* m_sql){
int rows = 0;
_variant_t rowsAffect;
try{
m_pConnection->Execute(m_sql,&rowsAffect,adCmdText);
rows = rowsAffect.intVal;
}catch(_com_error* e)
{
CMsgBox::ShowMsgBox(NULL,(char*)e->ErrorMessage(),MB_OK,MB_ERROR);
}
return rows>0?TRUE:FALSE;
}
///////////////////////////////////////////////
//Function Used To Fetch Data Recordset
// char* m_sql: SELECT Sql Statements
///////////////////////////////////////////////
_RecordsetPtr FetchData(char* m_sql){
_RecordsetPtr tmpRecordset ;
m_pRecordset.CreateInstance("ADODB.Recordset");
try
{
tmpRecordset = m_pConnection->Execute(m_sql,NULL,adCmdText);
}
catch(_com_error* e)
{
CMsgBox::ShowMsgBox(NULL,(char*)e->ErrorMessage(),MB_OK,MB_ERROR);
}
return tmpRecordset;
}
///////////////////////////////////////////////
//Function Used To Fetch Data Recordset
// char* m_sql: SELECT Sql Statements
// int& rowAffect: Return Count Of Rows In Recordset
//////////////////////////////////////////////
_RecordsetPtr FetchData(char* m_sql,int& rowsAffect){
m_pRecordset.CreateInstance("ADODB.Recordset");
try{
_RecordsetPtr tmpRecordset = m_pConnection->Execute(m_sql,NULL,adCmdText);
rowsAffect = tmpRecordset->GetRecordCount();
if (rowsAffect < 0){
tmpRecordset->MoveFirst();
rowsAffect = 0;
while (! tmpRecordset->adoEOF) {
rowsAffect++;
tmpRecordset->MoveNext();
}
}
}catch(_com_error* e)
{
CMsgBox::ShowMsgBox(NULL,(char*)e->ErrorMessage(),MB_OK,MB_ERROR);
}
return m_pRecordset;
}
};
2.通过Ado和ODBC远程操作Mysql数据库的发法
2.1 通过ADO连接MySql数据库,首先得安装MyODBC服务器程序。MyODBC版本要和MySql的版本对应上,否则会连接不上数据库。我用的版本分别是mysql-5.1.48-win32.msi和mysql-connector-odbc-5.1.5-win32.msi。
安装好后,点击开始菜单->设置->控制面板->管理工具->数据源(ODBC)->用户DSN->添加->选择MySQL ODBC 5.1 Driver。如下图:
设置好DNS ,Mysql所在服务器Ip,Mysql用户名,密码,选择数据库 ,另外有时候出现乱码现象,所以还需要设置字符编码的
2.2 封装好的应用类
//#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
#import ".\msado15.dll" no_namespace rename("EOF", "adoEOF")
#include "../common/msgbox/MsgBox.h"
#if !defined(AFX_ADOCONN_H__AC448F02_AF26_45E4_9B2D_D7ECB8FFCFB9__INCLUDED_)
#define AFX_ADOCONN_H__AC448F02_AF26_45E4_9B2D_D7ECB8FFCFB9__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class ADOConn
{
// 定义变量
public:
//添加一个指向Connection对象的指针:
_ConnectionPtr m_pConnection;
//添加一个指向Recordset对象的指针:
_RecordsetPtr m_pRecordset;
_bstr_t m_DNSDataResorce;
_bstr_t m_serverIp;
_bstr_t m_userName;
_bstr_t m_passWord;
_bstr_t m_DBName;
_bstr_t m_tableName;
// 定义方法
public:
ADOConn(char* DNSDataResorce,char* serverIp,char* userName,char* passWord,char* DBName,char* tableName)
{
m_DNSDataResorce = DNSDataResorce;
m_serverIp = serverIp;
m_userName = userName;
m_passWord = passWord;
m_DBName = DBName;
m_tableName = tableName;
}
int connectDB()
{
// 初始化OLE/COM库环境
::CoInitialize(NULL);
char tmpConnStr[1024] = {0};
try
{
// 创建Connection对象
sprintf(tmpConnStr,"DSN=%s;Server=%s;Database=%s",(char*)m_DNSDataResorce,(char*)m_serverIp,(char*)m_DBName);
m_pConnection.CreateInstance("ADODB.Connection");
//m_pConnection->Open("DSN=ADOmysql;Server= localhost;Database=testmysql","root","123456",adModeUnknown);
m_pConnection->Open(tmpConnStr,m_userName,m_passWord,adModeUnknown);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
CMsgBox::ShowMsgBox(NULL,(char*)e.ErrorMessage(),MB_OK,MB_ERROR);
return -1;
}
try
{
memset(tmpConnStr,0,sizeof(tmpConnStr));
sprintf(tmpConnStr,"select * from %s",(char*)m_tableName);
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->Open(tmpConnStr,m_pConnection.GetInterfacePtr(), adOpenKeyset,adLockOptimistic, adCmdText);
}
catch(_com_error e)
{
CMsgBox::ShowMsgBox(NULL,(char*)e.ErrorMessage(),MB_OK,MB_ERROR);
return -1;
}
return 0;
}
virtual ~ADOConn()
{
// 关闭记录集和连接
if(NULL != m_pRecordset && m_pRecordset->State == adStateOpen) m_pRecordset->Close();
if(NULL != m_pConnection && m_pConnection->State == adStateOpen) m_pConnection->Close();
m_pRecordset=0;
m_pConnection=0;
// 释放环境
::CoUninitialize();
}
// 执行查询
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL)
{
try
{
// 连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
connectDB();
// 创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
CMsgBox::ShowMsgBox(NULL,(char*)e.ErrorMessage(),MB_OK,MB_ERROR);
}
// 返回记录集
return m_pRecordset;
}
// 执行SQL语句,Insert Update _variant_t
BOOL ExecuteSQL(_bstr_t bstrSQL)
{
try
{
// 是否已经连接数据库
if(m_pConnection == NULL)
connectDB();
// Connection对象的Execute方法:(_bstr_t CommandText,
// VARIANT * RecordsAffected, long Options )
// 其中CommandText是命令字串,通常是SQL命令。
// 参数RecordsAffected是操作完成后所影响的行数,
// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存储过程;adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
CMsgBox::ShowMsgBox(NULL,(char*)e.ErrorMessage(),MB_OK,MB_ERROR);
return false;
}
}
};
#endif // !defined(AFX_ADOCONN_H__AC448F02_AF26_45E4_9B2D_D7ECB8FFCFB9__INCLUDED_)
另外ADO的常用操作如下
if(!tmpConnDb.m_pRecordset->BOF)
// tmpConnDb.m_pRecordset->MoveFirst();
//_variant_t var;
//while(!tmpConnDb.m_pRecordset->adoEOF)
//{
// var = tmpConnDb.m_pRecordset->GetCollect("RecordID");
// tmpConnDb.m_pRecordset->put_Collect((_variant_t)"RecordValue",(_variant_t)"192.1.2.212");
// tmpConnDb.m_pRecordset->MoveNext();
//}
//tmpConnDb.m_pRecordset->AddNew();
//tmpConnDb.m_pRecordset->MoveFirst();
//tmpConnDb.m_pRecordset->Move(LONG(2));
//tmpConnDb.m_pRecordset->Fields->GetItem
// (_variant_t("RecordID"))->Value=_bstr_t("E103");
//tmpConnDb.m_pRecordset->Fields->GetItem
// (_variant_t("RecordValue"))->Value=_bstr_t("192.1.2.210");
//tmpConnDb.m_pRecordset->Fields->GetItem
// (_variant_t("Remark"))->Value=_bstr_t("测试添加数据所用E03");
//tmpConnDb.m_pRecordset->MoveFirst();//
//tmpConnDb.m_pRecordset->Delete(adAffectCurrent);
//tmpConnDb.m_pRecordset->MoveLast();
//tmpConnDb.m_pConnection->Execute("update parameterTab set Remark='sql更新语句remark' where RecordID='hsy'",NULL,adCmdText);
//tmpConnDb.m_pRecordset->Update();
//tmpConnDb.m_pConnection->Execute("delete * from parameterTab",NULL,adCmdText);
//int recordCount = tmpConnDb.m_pRecordset->GetRecordCount();
//recordCount = tmpConnDb.m_pRecordset->GetRecordCount();
//recordCount = tmpConnDb.m_pRecordset->GetRecordCount();
//recordCount = tmpConnDb.m_pRecordset->GetRecordCount();
3.通过Mysql自带接口远程访问Mysql数据库,自己封装类如下:
pragma once
#include "mysql.h"
#include "winsock.h"
#include "../baseStruct.h"
class MysqlApiRWDB
{
public:
MysqlApiRWDB(char*,char*,char*,char*,int port=3306);
int initAndConnectDB();
int executeSQL(char* sql);
MYSQL_RES* getRecordSet();
int getRecordRows();
int getFieldsNum();
char* getFieldName(int i);
MYSQL_ROW getRecordRow();
char* getRocoredCoulumValue(int i);
~MysqlApiRWDB();
private:
MYSQL m_mysql;
MYSQL_RES* m_res;
MYSQL_ROW m_row;
MYSQL_FIELD* m_field;
char m_mysqlServerIp[MAXIPLEN];
char m_mysqlUserName[MYSQLPARAMERERMAX];
char m_mysqlPassword[MYSQLPARAMERERMAX];
char m_mysqlDBname[MYSQLPARAMERERMAX];
int m_mysqlServerPort;
};
#include "mysqlApiRWDB.h"
/*
class MysqlApiRWDB
{
public:
MysqlApiRWDB();
int initAndConnectDB();
int executeSQL(char* sql);
MYSQL_RES* getRecordSet();
int getRecordRows();
int getFieldsNum();
MYSQL_FIELD* getFieldName(int i);
MYSQL_ROW getRecordRow();
char* getRocoredCoulum();
~MysqlApiRWDB();
private:
MYSQL m_mysql;
MYSQL_RES* m_res;
MYSQL_ROW m_row;
MYSQL_FIELD* m_field;
char m_mysqlServerIp[MAXIPLEN];
char m_mysqlUserName[MYSQLPARAMERERMAX];
char m_mysqlPassword[MYSQLPARAMERERMAX];
char m_mysqlDBname[MYSQLPARAMERERMAX];
int m_mysqlServerPort;
};
*/
MysqlApiRWDB::MysqlApiRWDB(char* mysqlServerIp,char* mysqlUserName,char* mysqlPassword,char* mysqlDBname,int mysqlServerPort)
{
memset(m_mysqlServerIp,0,MAXIPLEN);
memset(m_mysqlUserName,0,MYSQLPARAMERERMAX);
memset(m_mysqlPassword,0,MYSQLPARAMERERMAX);
memset(m_mysqlDBname,0,MYSQLPARAMERERMAX);
strcpy(m_mysqlServerIp,mysqlServerIp);
strcpy(m_mysqlUserName,mysqlUserName);
strcpy(m_mysqlPassword,mysqlPassword);
strcpy(m_mysqlDBname,mysqlDBname);
m_mysqlServerPort = mysqlServerPort;
}
int MysqlApiRWDB::initAndConnectDB()
{
if(mysql_library_init(0, NULL, NULL)!=0)
{
return -1;
}
if(!mysql_init(&m_mysql))
{
return -1;
}
if (0 != mysql_options(&m_mysql, MYSQL_SET_CHARSET_NAME, "gb2312"))
{
return -1;
}
if(!mysql_real_connect(&m_mysql,m_mysqlServerIp,m_mysqlUserName,m_mysqlPassword,m_mysqlDBname,m_mysqlServerPort, NULL, 0))
{
return -1;
}
return 0;
}
int MysqlApiRWDB::executeSQL(char* sql)
{
if (0 != mysql_query(&m_mysql,sql))
{
return -1;
}
return 0;
}
MYSQL_RES* MysqlApiRWDB::getRecordSet()
{
//一次性取得数据集
m_res = mysql_store_result(&m_mysql);
return m_res;
}
int MysqlApiRWDB::getRecordRows()
{
return (int)mysql_num_rows(m_res);
}
int MysqlApiRWDB::getFieldsNum()
{
return mysql_num_fields(m_res);
}
char* MysqlApiRWDB::getFieldName(int i)
{
unsigned int fieldcount = mysql_num_fields(m_res);
if(i>(int)fieldcount)
return NULL;
m_field = mysql_fetch_field_direct(m_res, i);
return m_field->name;
}
MYSQL_ROW MysqlApiRWDB::getRecordRow()
{
m_row = mysql_fetch_row(m_res);
return m_row;
}
char* MysqlApiRWDB::getRocoredCoulumValue(int i)
{
if(i>getFieldsNum())
return "";
return m_row[i];
}
MysqlApiRWDB::~MysqlApiRWDB()
{
//mysql_free_result(m_res);
mysql_close(&m_mysql);
mysql_server_end();
}
实际操作举例:
MysqlApiRWDB tmpMysqlApiConn(m_mysqlDBConfig.mysqlServerIp,m_mysqlDBConfig.mysqlUserName,m_mysqlDBConfig.mysqlPassword,m_mysqlDBConfig.dataBaseName,m_mysqlDBConfig.mysqlServerPort);
if(tmpMysqlApiConn.initAndConnectDB()<0)
{
CMsgBox::ShowMsgBox(GetHWND(),"初始化连接远程Mysql数据库失败!",MB_OK,MB_ERROR);
return ;
}
tmpMysqlApiConn.executeSQL("select * from serviceDef order by serviceCode");
tmpMysqlApiConn.getRecordSet();
int recordSize = tmpMysqlApiConn.getRecordRows();
for(int i=0;i<recordSize;i++)
{
tmpMysqlApiConn.getRecordRow();
TUnionServerCode tmpServerCode;
memset(&tmpServerCode,0,sizeof(TUnionServerCode));
if(tmpMysqlApiConn.getRocoredCoulumValue(0))
_tcscpy(tmpServerCode.serviceCode,tmpMysqlApiConn.getRocoredCoulumValue(0));
if(tmpMysqlApiConn.getRocoredCoulumValue(1))
_tcscpy(tmpServerCode.serviceName,tmpMysqlApiConn.getRocoredCoulumValue(1));
if(tmpMysqlApiConn.getRocoredCoulumValue(2))
_tcscpy(tmpServerCode.reqFieldList,tmpMysqlApiConn.getRocoredCoulumValue(2));
if(tmpMysqlApiConn.getRocoredCoulumValue(3))
_tcscpy(tmpServerCode.resFieldList,tmpMysqlApiConn.getRocoredCoulumValue(3));
if(tmpMysqlApiConn.getRocoredCoulumValue(4))
_tcscpy(tmpServerCode.remark,tmpMysqlApiConn.getRocoredCoulumValue(4));
m_vecAllServerCode.push_back(tmpServerCode);
}
相关文章推荐
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复
- MySQL 优化
- MySQL 数据类型
- Facebook's New Real-time Messaging System: HBase to Store 135+ Billion Messages a Month
- MySQL复制