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. 在工程项目中添加
4. 示例1
示例2
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() 初始化一个一行一行地结果集合的检索
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() 初始化一个一行一行地结果集合的检索
相关文章推荐
- C++ static、const和static const 以及它们的初始化
- 异常处理(try catch throw)详解(C++)
- C++左值与右值
- LeetCode-Max Points on a Line
- C语言结构体分配内存问题
- c++模板类 .
- C++学习网址
- 【C++】1003. Emergency (25)*
- C++设计模式11-组合模式----靠着大树好乘凉
- C++并行应用开发包
- 初接触c语言,请大家帮忙看看问题出在哪了!
- 我推荐的一些C\C++书籍
- C语言文件操作
- [C++] socket - 6 [API互斥事件对象实现线程同步]
- [C++] socket - 5 [API事件对象实现线程同步]
- [C++] socket - 4 [线程同步 简单例子]
- [C++] socket - 3 [线程简单例子 代码]
- 单词统计
- C++按文件夹读写图片
- 一些C\C++书籍