mysql导入source数据库sql的C++实现和封装

之前有好多人在为这件事情头疼不已:

想有一个不需要安装mysql客户端就可以导入数据库脚本,但找不到对应的api调用。所以得需要自己去实现导入数据库的实现方法:

common.h

#ifndef _COMMON_H
#define _COMMON_H
#ifdef WIN32

	#include <winsock2.h>

	typedef __int8					int8_t;
	typedef __int16					int16_t;
	typedef __int32					int32_t;
	typedef __int64					int64_t;

	typedef unsigned __int8			uint8_t;
	typedef unsigned __int16		uint16_t;
	typedef unsigned __int32		uint32_t;
	typedef unsigned __int64		uint64_t;

#define atoll(_String) 	_atoi64(_String)
#else
	#include <sys/types.h>
	#include <sys/socket.h>
	#include <stdint.h>
	#include<linux/string.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <list>
using namespace std;
enum SERVER_ACTION{
	SERVER_STARTNEW = 0,//开新服
};
#ifdef WIN32
#define  PATH_DELIMTER "\\"
#else
#define  PATH_DELIMTER "/"
#endif
#endif

dbmanager.h

#ifndef _DBMANAGER_H
#define _DBMANAGER_H
#include <string>
using namespace std;
#include "common.h"
#include <mysql.h>
//数据库配置信息
struct DBInfo
{
	string host;
	string user;
	string passwd;
	string db;
	uint16_t port;
};
class DBManager
{
public:
	DBManager();
	~DBManager();

	bool SelectDB(string dbName);
	bool ConnectDB(DBInfo &dbInfo);
	MYSQL_RES* ExeSql(const char * sql, int len);
	bool readFromSql(string fileName,vector<string>& sql);
	bool sourceSql(string fileName);
private:
	MYSQL *mysqlInit(DBInfo &info);
	void mysqlClose();
private:
	MYSQL *m_mysqlConn;
	DBInfo m_dbConfig;
};

extern DBManager g_DBManager;

#endif

dbmanager.cpp

#include "dbmanager.h"
#include <fstream>
DBManager g_DBManager;
DBManager::DBManager()
{
}
DBManager::~DBManager()
{
}
bool DBManager::ConnectDB(DBInfo &dbInfo)
{
	m_dbConfig = dbInfo;
	m_mysqlConn = mysqlInit(dbInfo);
	if (!m_mysqlConn)
	{
		return false;
	}
	return true;
}

MYSQL *DBManager::mysqlInit(DBInfo &info)
{
	MYSQL *mysql = mysql_init(NULL);
	if (!mysql)
		return NULL;

	if (!mysql_real_connect(mysql,
								info.host.c_str(),
								info.user.c_str(),
								info.passwd.c_str(),
								info.db.c_str(),
								info.port, NULL, 0))
	{
		int ret = mysql_errno(mysql); 

		mysql_close(mysql);
		return NULL;
	}

#if MYSQL_VERSION_ID >= 50013
	my_bool reconnect = 1;
	if (mysql_options(mysql, MYSQL_OPT_RECONNECT, &reconnect))
	{
		int ret = mysql_errno(mysql); 

		mysql_close(mysql);
		return NULL;
	}
#else
	mysql->reconnect = 1;
#endif

	return mysql;
} 

void DBManager::mysqlClose()
{
	if (m_mysqlConn)
	{
		mysql_close(m_mysqlConn);
		m_mysqlConn = NULL;
	}
}
/************************************************************************/
/* 执行SQL语句                                                          */
/************************************************************************/
MYSQL_RES* DBManager::ExeSql(const char * sql, int len)
{
	MYSQL_RES* res = NULL;
	int ret = mysql_real_query(m_mysqlConn, sql, len);
	if (ret == 0)
	{
		res = mysql_store_result(m_mysqlConn);
	}else{
		printf("mysql query %s return errorcode:%d\n",sql, mysql_errno(m_mysqlConn));
	}
	return res;
}
/************************************************************************/
/* 选择数据库                                                           */
/************************************************************************/
bool DBManager::SelectDB(string dbName)
{
	if(mysql_select_db(m_mysqlConn,dbName.c_str()))
		return false;
	else
		return true;
}
/************************************************************************/
/*fileName是sql文件的路径,  解析出fileName中的每一条sql语句,放入到sql容器中    */
/************************************************************************/
bool DBManager::readFromSql(string fileName,vector<string>& sql){
	ifstream in(fileName.c_str(), ios::in);//linux
	string signalSql,s;
	if(!in){
		return false;
	}
	while(getline(in,s)){
		int pos = s.find(";");
		signalSql += s;
		if(pos != s.npos){//找到了一条语句的结束位
			sql.push_back(signalSql);
			signalSql.clear();
		}
		s.clear();
	}
	in.close();
	return true;
}
/************************************************************************/
/* 导入数据库sql                                                        */
/************************************************************************/
bool DBManager::sourceSql(string fileName){
	vector<string> vecSql;
	bool ret = readFromSql(fileName,vecSql);
	if(ret == false){
		printf("导入gamedb.sql失败");
		return false;
	}
	for (vector<string>::iterator it = vecSql.begin(); it != vecSql.end(); it++)
	{
		ExeSql((*it).c_str(), (*it).length());
	}
	return true;
}

我这里的source实现其实就是把sql脚本里的记录按行读取,如果遇到了一个分号,表示已经是一个语句了,把它放到一个sql语句的容器中,不知道还有没有别人有更好的方法,希望可以在这里交流,并留下你们的代码

时间: 2024-10-06 00:37:30

mysql导入source数据库sql的C++实现和封装的相关文章

mysql 导入sqlserver数据库

#mysql 导入sqlserver数据库 EXEC master.dbo.sp_addlinkedserver @server = N'sjkxb00', @srvproduct=N'MySQL', @provider=N'MSDASQL', @provstr=N'DRIVER={MySQL ODBC 5.3 Unicode Driver}; SERVER=localhost; _DATABASE=tigerdb; USER=root; PASSWORD=123456; OPTION=3' -

mysql导入导出数据库(转)

很多时候,我们的数据开发都会用到很多开发利器,比如powerdesigner, navicat等这些软件,虽然好用,但是要收费,在公司里面是禁止使用盗版软件的,怕罚款各方面的,所以我们也不敢直接在公司的机子上装破解版,这个时 候,如果我们要导入或者导出sql语句怎么办,虽然也有免费的软件如mysql-workbench的存在,但是不好用啊,操作复杂麻烦,要说好处吧,个 人觉得就是记住密码和ip地址用户名这些方便咯,当然实际上它还是很强大的. 好吧,言归正传,其实,最简单的方法,就是直接使用mys

MySql导入导出数据库(含远程导入导出)

一.导入导出本地数据库    导出: 1.先运行cmd,cd 到mysql安装目录中的bin文件夹 2.mysqldump -u root -p 数据库名 > 导出文件名.sql 其他情况下: 1.导出整个数据库     mysqldump -u 用户名 -p 数据库名 > 导出的文件名     mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql   2.导出一个表     mysqldump -u 用户名 -p 数据库名 表名> 导出的文

Mysql导入导出数据库11111

导出: 通过命令行  在MYSQL中的bin文件夹的目录下 输入:D:\phpStudy\MySQL\bin>mysqldump -uroot -p 数据库名 > 导出的文件名 导入: 需先进入mysql> 输入:mysql>use 数据库名称   mysql>source 导入的文件名; 转载:MySQL命令行导出数据库 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:\Program Files\MySQL\My

[转]mysql 导入导出数据库以及函数、存储过程的介绍

本篇文章是对mysql中的导入导出数据库命令以及函数.存储过程进行了详细的分析介绍,需要的朋友参考下: mysql常用导出数据命令:1.mysql导出整个数据库  mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql   mysqldump -hlocalhost -uroot hqgr> hqgr.sql    # (如果root用户没用密码可以不写-p,当然导出的sql文件你可以制定一个路径,未指定

mysql导入上百兆sql的处理

本人使用的是mysql5.6版本 一. SET GLOBAL max_allowed_packet = 500*1024*1024; //客户端/服务器之间通信的缓存区的最大大小;set global net_buffer_length=100000;  //TCP/IP和套接字通信缓冲区大小,创建长度达net_buffer_length的行SET GLOBAL  interactive_timeout=28800 000; //对后续起的交互链接有效:SET GLOBAL  wait_time

mysql 导入大数据sql文件

导出Sql文件 在导出时合理使用几个参数,可以大大加快导入的速度. -e 使用包括几个VALUES列表的多行INSERT语法; –max_allowed_packet=XXX 客户端/服务器之间通信的缓存区的最大大小; –net_buffer_length=XXX TCP/IP和套接字通信缓冲区大小,创建长度达net_buffer_length的行 注意:max_allowed_packet和net_buffer_length不能比目标数据库的配置数值大,否则可能出错. 例子: mysql>my

mysql导入sqlserver数据库表

原文:https://zhidao.baidu.com/question/1114325744502691499.html 在Navicat for MySQL 管理器中,创建目标数据库(注意:因为是点对点的数据导入,要求sql server 中要导出的数据库名称和要导入到Mysql 中的数据库的名字相同) 点击创建好的目标数据库website点的”表“一项,在右边会出现导入向导选项. 选择SQL Server数据库ODBC,“下一步”,数据链接属性-SQL SERVER ODBC 创建访问SQ

SQL监控:mysql及mssql数据库SQL执行过程监控审计

最近生活有很大的一个变动,所以博客也搁置了很长一段时间没写,好像写博客已经成了习惯,搁置一段时间就有那么点危机感,心里总觉得不自在.所以从今天起还是要继续拾起墨笔(键盘),继续好好维护这个博客,写出心里最真实的想法,写出平时接触到的一些人和事以及一些新的技术.当然写博客也不是单纯的为了记录,也想通过博客来结交更多的朋友,今天在公司图书馆看到一句话大致说的是“在今天这个年代,已经很难等到三顾茅庐,诸葛亮也需要博客.微博和影响力”,在一年前就曾想过写一篇关于怎样通过博客来提高个人影响力的文章,我会尽