您的位置:首页 > 数据库 > MySQL

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);

  }

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息