C++连接mySql数据库

1. 到mysql的windows安装目录下找到include文件夹(C:\Program File\MySQL\MySQL Server 5.5\include),把此文件夹复制到工程文件下
2. 把MySql安装目录下lib文件夹内的libmysql.lib和libmysql.dll两个文件复制到工程文件下

3. 在工程项目中添加

// winsock头文件在mysql.h之前
#include <winsock.h>
#include "include/mysql.h" 

#pragma comment(lib, "libmysql")

4. 示例1

BOOL InitDB()
{
	mysql_init(&myCont);	//初始化mysql句柄
	if (mysql_real_connect(&myCont, host, user, pswd, DBname, port, NULL, 0))	//连接数据库
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}

	return TRUE;
}

VOID CloseDB()
{
	mysql_commit(&myCont);
	mysql_close(&myCont);
}

BOOL SelectDB()
{
	InitDB();


	MYSQL_RES* result;    //保存查询结果的记录集
	int nZhangHaoID;
	CString strSQL;
	CString strZhanghao = "GRP001";
	CString strPwd = "0";
	strSQL.Format("Select nZhangHaoID FROM user WHERE strZhangHao = '%s' AND strPWD = '%s'", strZhanghao, strPwd);

	int nFlag = mysql_query(&myCont, strSQL);
	if (nFlag == 0)
	{
		result = mysql_store_result(&myCont);//获取查询结果集
		if (NULL == result)
		{
			CloseDB();
			return FALSE;
		}
		else
		{
		    int nCnt = (int)mysql_num_rows(result);	//获取查询结果集的条数
			if (nCnt > 0)
			{
				MYSQL_ROW row;
				unsigned int num_fields;
				unsigned int i;
				num_fields = mysql_num_fields(result);	//获取记录集中查询的字段数
				while ((row = mysql_fetch_row(result)))	//获取记录集中的一行数据
				{
					unsigned long *lengths;
					lengths = mysql_fetch_lengths(result);	//当前行每列的结果值长度(字符串长度)
					for(i = 0; i < num_fields; i++)
					{
						//查询结果在此输出
						CFile file;
						file.Open("d:\\ac2.jpg", CFile::modeCreate | CFile::modeWrite);
						file.Write((char*)(row[i]), lengths[i]);
						file.Close();
					}
				}
			}
		}
		mysql_free_result(result); //释放结果集
	}

	CloseDB();
	return TRUE;
}

BOOL InsertRow()
{
	InitDB();

	CFile file;
	file.Open("C:\\6.jpg", CFile::modeRead);
	int nFileLen = (int)file.GetLength();
	char* pData;
	pData = new char[nFileLen];
	file.Read(pData, nFileLen);
	file.Close();


	CString strStart, strEnd;																	
	//插入语句      INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

	int		nZhangHaoID = 1;
	CString strZhangHao = "GRP001";
	CString strUserName = "aaaneme";
	CString strTaskNO = "123";
	CString strUploadTime = COleDateTime::GetCurrentTime().Format("%Y-%m-%d %H:%M:%S");

	int		nDownloadCnt = 0;
	int		nDataType = 0;
	CString pre0 = "";
	CString pre1 = "";
	CString pre2 = "";

	strStart.Format("Insert into ht225tw VALUES (NULL, %d, '%s', '%s', '%s', '%s', %d, %d, '",
		nZhangHaoID,strZhangHao,strUserName,strTaskNO,strUploadTime,nDownloadCnt,nDataType);

	strEnd.Format("','%s','%s','%s')", pre0, pre1, pre2);

	int	nSqlStartLgth = strStart.GetLength();
	int nSqlEndLgth = strEnd.GetLength();
	int nDataLgth = nFileLen;
	int nAllLgth = nSqlStartLgth + nDataLgth + nSqlEndLgth;
	char *sql = new char[nAllLgth + 20 * 1024];

	memcpy(sql, strStart, nSqlStartLgth);
	int nLen = mysql_real_escape_string(&myCont, sql + nSqlStartLgth, pData, nDataLgth);	//二进制转换
	memcpy(sql + nSqlStartLgth + nLen, strEnd, nSqlEndLgth);

	int nFlag;
	for(int i= 0; i< 10; i++)
	{
		nFlag = mysql_real_query(&myCont, sql, nAllLgth + nLen - nDataLgth);		//执行SQL语句
	}

	CloseDB();		//关闭数据库

	if (pData != NULL)
	{
		delete [] pData;
	}
	if (sql != NULL)
	{
		delete [] sql;
	}
	if (nFlag != 0)
	{
		return FALSE;
	}
	else
	{
		return TRUE;
	}
}

示例2

/*
 * 2013-2-18
 */

#include <mmysql.h>

static MYSQL m_Mysql;
static MYSQL_RES m_Res;
	
int SelectDB(char *db)
{
	if (mysql_select_db(&m_Mysql, db) != 0) {
		return mysql_errno(&m_Mysql);
	}

	return 0;
}

int Connect(const char *ip, const char *user, const char *passwd, const char *db, unsigned int port)
{
	mysql_init(&m_Mysql);
	if (!mysql_real_connect(&m_Mysql, ip, user, passwd, db, port, NULL, CLIENT_MULTI_STATEMENTS)) {

		return mysql_errno(&m_Mysql);
	}

	return 0;
}

void Disconnect(void)
{
	if (m_Res != NULL) {
		mysql_free_result(m_Res);
		m_Res = NULL;
	}
	mysql_close(&m_Mysql);
}
	
int SimpleQuery(const char *pCmd)
{
	//update , delete , insert and so on
	mysql_query(&m_Mysql, "SET NAMES utf8;");
	if(mysql_query(&m_Mysql, pCmd) != 0)
	{	
		return mysql_errno(&m_Mysql);;
	}
	mysql_free_result(mysql_store_result(&m_Mysql));
	return 0;
}
	
int Query(const char *pCmd)
{
	mysql_query(&m_Mysql, "SET NAMES utf8\n");
	if(mysql_query(&m_Mysql, pCmd) != 0)
	{
		return mysql_errno(&m_Mysql);
	}
	m_Res = mysql_store_result(&m_Mysql);

	return 0;
}

//Number Rows
unsigned long long GetRowCount(void)
{
	if(m_Res) {
		return mysql_num_rows(m_Res);
	}
	return 0;
}

//Number Feilds
unsigned int GetFeildCount(void)
{
	if(m_Res) {
		return mysql_num_fields(m_Res);
	}
	return 0;
}
	
int NextRecord(void)
{
	m_Row = mysql_fetch_row(m_Res);
	return m_Row != NULL;
}
	
char * GetRecordByIndex(unsigned int iIndex)
{
	if(iIndex < GetFeildCount()) {
		return m_Row[iIndex];
	}
	return NULL;
}
	
void StopQuery(void)
{
	mysql_free_result(m_Res);
	m_Res = NULL;
}
	
long long GetAffectedRows(void)
{
	return (long long)mysql_affected_rows(&m_Mysql);
}
int Begin(void)
{
	return mysql_autocommit(&m_Mysql, 0);
}

int Commit(void)
{
    int retval = 0;
    retval = mysql_commit(&m_Mysql);
    if (0 != retval) {
	PRINT_MYSQL_ERROR_INFO(&m_Mysql);
        return retval;
    }
    return mysql_autocommit(&m_Mysql, 1);
}

int Rollback(void)
{
    int retval = 0;
    retval = mysql_rollback(&m_Mysql);
    if (0 != retval) {
        return retval;
    }
    return mysql_autocommit(&m_Mysql, 1);
}
示例3

/*
** C语言连接mysql
*/
#include <winsock.h>
#include <mysql.h>
#include <iostream>
#include <list>
using namespace std;

#pragma comment(lib, "libmysql.lib")
// 定义全局变量
MYSQL mysql;

struct RecvStruct
{
	char stuID[50];
	char stuName[50];
	char stuAge[50];
};

// 建立连接
BOOL ConnDB(const char *host, const char *user, const char *passwd, const char *dbName)		
{
	// 初始化MYSQL结构
	mysql_init(&mysql);
	// 连接数据库
	if(mysql_real_connect(&mysql, host, user, passwd, dbName, 0, NULL, 0) != NULL)
	{
		// 成功建立连接
		return TRUE;
	}
	else
	{
		// 建立连接失败
		return FALSE;
	}
}
// 取出数据
list<RecvStruct> GetAllRecv()
{
	// 用于保存结果
	std::list<RecvStruct> recList;
	// 查询语句
	std::string strsql = "select * from stu";
	// 执行查询
	if(mysql_real_query(&mysql, strsql.data(), strsql.length()) == 0)
	{
		// 取得查询结果
		MYSQL_RES *pRes = NULL;
		pRes = mysql_store_result(&mysql);
		if(pRes != NULL)
		{
			// 取得结果
			MYSQL_ROW row;
			while(row = mysql_fetch_row(pRes))
			{
				// 保存信息
				RecvStruct rs;
				if(row[0] != NULL)
				{
					strcpy(rs.stuName, row[0]);
				}
				if(row[1] != NULL)
				{
					strcpy(rs.stuID, row[1]);
				}
				if(row[2] != NULL)
				{
					strcpy(rs.stuAge, row[2]);
				}
				// 加入list
				recList.push_back(rs);
			}
		}
	}
	return recList;
}
// 关闭数据库
void MysqlClose()
{
	// 关闭数据库,释放资源
}

int main()
{
	// 连接数据库
	if(ConnDB("127.0.0.1", "root", "123456", "test"))
	{
		// 成功
		std::list<RecvStruct> recvList = GetAllRecv();
		// 显示记录
		for(list<RecvStruct>::iterator it = recvList.begin();it != recvList.end();it++)
		{
			cout << it->stuName << "\t" << it->stuID << "\t" << it->stuAge << endl;
		}

		MysqlClose();
	}
	int i;
	cin >> i;
	return 0;
}

5. libmysql.dll中部分接口函数及 说明
mysql_affected_rows() 返回被最新的UPDATE, DELETE或INSERT查询影响的行数。  
mysql_close() 关闭一个服务器连接。  
mysql_connect() 连接一个MySQL服务器。该函数不推荐;使用mysql_real_connect()代替。  
mysql_change_user() 改变在一个打开的连接上的用户和数据库。  
mysql_create_db() 创建一个数据库。该函数不推荐;而使用SQL命令CREATE DATABASE。  
mysql_data_seek() 在一个查询结果集合中搜寻一任意行。  
mysql_debug() 用给定字符串做一个DBUG_PUSH。  
mysql_drop_db() 抛弃一个数据库。该函数不推荐;而使用SQL命令DROP DATABASE。  
mysql_dump_debug_info() 让服务器将调试信息写入日志文件。  
mysql_eof() 确定是否已经读到一个结果集合的最后一行。这功能被反对; mysql_errno()或mysql_error()可以相反被使用。  
mysql_errno() 返回最近被调用的MySQL函数的出错编号。  
mysql_error() 返回最近被调用的MySQL函数的出错消息。  
mysql_escape_string() 用在SQL语句中的字符串的转义特殊字符。  
mysql_fetch_field() 返回下一个表字段的类型。  
mysql_fetch_field_direct () 返回一个表字段的类型,给出一个字段编号。  
mysql_fetch_fields() 返回一个所有字段结构的数组。  
mysql_fetch_lengths() 返回当前行中所有列的长度。  
mysql_fetch_row() 从结果集合中取得下一行。  
mysql_field_seek() 把列光标放在一个指定的列上。  
mysql_field_count() 返回最近查询的结果列的数量。  
mysql_field_tell() 返回用于最后一个mysql_fetch_field()的字段光标的位置。  
mysql_free_result() 释放一个结果集合使用的内存。  
mysql_get_client_info() 返回客户版本信息。  
mysql_get_host_info() 返回一个描述连接的字符串。  
mysql_get_proto_info() 返回连接使用的协议版本。  
mysql_get_server_info() 返回服务器版本号。  
mysql_info() 返回关于最近执行得查询的信息。  
mysql_init() 获得或初始化一个MYSQL结构。  
mysql_insert_id() 返回有前一个查询为一个AUTO_INCREMENT列生成的ID。  
mysql_kill() 杀死一个给定的线程。  
mysql_list_dbs() 返回匹配一个简单的正则表达式的数据库名。  
mysql_list_fields() 返回匹配一个简单的正则表达式的列名。  
mysql_list_processes() 返回当前服务器线程的一张表。  
mysql_list_tables() 返回匹配一个简单的正则表达式的表名。  
mysql_num_fields() 返回一个结果集合重的列的数量。  
mysql_num_rows() 返回一个结果集合中的行的数量。  
mysql_options() 设置对mysql_connect()的连接选项。  
mysql_ping() 检查对服务器的连接是否正在工作,必要时重新连接。  
mysql_query() 执行指定为一个空结尾的字符串的SQL查询。  
mysql_real_connect() 连接一个MySQL服务器。  
mysql_real_query() 执行指定为带计数的字符串的SQL查询。  
mysql_reload() 告诉服务器重装授权表。  
mysql_row_seek() 搜索在结果集合中的行,使用从mysql_row_tell()返回的值。  
mysql_row_tell() 返回行光标位置。  
mysql_select_db() 连接一个数据库。  
mysql_shutdown() 关掉数据库服务器。  
mysql_stat() 返回作为字符串的服务器状态。  
mysql_store_result() 检索一个完整的结果集合给客户。  
mysql_thread_id() 返回当前线程的ID。  
mysql_use_result() 初始化一个一行一行地结果集合的检索

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值