您的位置:首页 > 编程语言 > C语言/C++

C++连接mySql数据库

2014-03-18 15:47 204 查看
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() 初始化一个一行一行地结果集合的检索
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: