提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
使用C++ 读取mysql数据库的一般执行过程和预备执行过程简单示例。本次示例中引用的是mysql的64位的数据库;其中依赖的文件可以在我的下载内容中找到
依赖文件链接地址:https://download.csdn.net/download/me_test/86506310
示例
普通语句执行
#include "mysql.h"
#pragma comment(lib,"libmysql.lib")
MYSQL mysql_connect;//数据库连接符
mysql_init(&mysql_connect);
if(!mysql_real_connect(&mysql_connect,"127.0.0.1","test","test","test_db",3306, NULL, 0))
const char* s_error = mysql_error(&mysql_connect);
//插入语句(删除、更新语句执行方式类似)
const char* insert_sql = "insert test_table(f_id,f_name)values(1,"test");
if (mysql_query(&mysql_connect,insert_sql ))
const char* s_error = mysql_error(&mysql_connect);
//查询语句
MYSQL_ROW mysql_row;//数据库每行结果
MYSQL_RES* mysql_result = NULL;
const char* select_sql = "select f_id from test_tale";
if (!mysql_query(&mysql_connect,sql))
{
mysql_result = mysql_store_result(&mysql_connect);
if (mysql_result)
{
while((mysql_row = mysql_fetch_row(mysql_result))
{
printf("%d\n",atoi(mysql_row[0]));
}
}
mysql_free_result(mysql_result);
}
else{
const char* s_error = mysql_error(&mysql_connect);
}
prepare语句执行
如果插入的语句中并不是简单的int或者string类型;而是比较长的字符串或者blob类型。那么就需要使用prepare语句插入blob。
使用这种方式需要注意:由于此方式里面绑定数据使用的都是指针,并没有进行深拷贝,绑定的数据必须要保证在语句执行完毕之前有效。否则的话数据一旦离开有效区间就会被释放,导致执行错误。
#include "mysql.h"
#pragma comment(lib,"libmysql.lib")
MYSQL mysql_connect;//数据库连接符
mysql_init(&mysql_connect);
if(!mysql_real_connect(&mysql_connect,"127.0.0.1","test","test","test_db",3306, NULL, 0))
const char* s_error = mysql_error(&mysql_connect);
MYSQL_STMT* stmt = nullptr;
stmt = mysql_stmt_init(&database::getSingletonPtr()->get_connection());
if(!stmt)const char* s_error = mysql_error(&mysql_connect);
MYSQL_BIND bind[3];
memset(bind,0,sizeof(bind));
//准备插入的语句
const char* insert_sql = "insert into test_tb2(f_id,f_name,f_data)values(?,?,?)";
//插入int类型数据准备
int n_id = 100;
bind[0].buffer_type = MYSQL_TYPE_LONG;
bind[0].buffer = (char*)&n_id ;
bind[0].is_null = 0;
bind[0].length = 0;
//插入string类型准备
char* str_data = "test data";
unsigned int u_length = strlen(str_data);
bind[1].buffer_type = MYSQL_TYPE_STRING;
bind[1].buffer = (char*)str_data;
bind[1].is_null = 0;
bind[1].length = &s_length;
//插入blob类型
std::vector<int> vec_value;
for(auto i = 0; i < 1000; i++)
vec_value.push_back(i);
unsigned int b_length = vec_value.size()*sizeof(int);
bind[2].buffer_type = MYSQL_TYPE_BLOB;
bind[2].buffer = (char*)&vec_value[0];
bind[2].is_null = 0;
bind[2].length = &b_length;
//准备语句
if (mysql_stmt_prepare(stmt, insert_sql , strlen(insert_sql))
{
const char* s_error = mysql_stmt_error(stmt);
printf("marker error : %s\n", s_error);
return;
}
//绑定数据
if (mysql_stmt_bind_param(stmt, bind)) {
const char* s_error = mysql_stmt_error(stmt);
printf("marker error : %s\n", s_error);
return;
}
//执行语句
if (mysql_stmt_execute(stmt)) {
const char* s_error = mysql_stmt_error(stmt);
printf("marker error : %s\n", s_error);
return;
}
//关闭状态
if (mysql_stmt_close(stmt))
{
const char* s_error = mysql_stmt_error(stmt);
printf("marker error : %s\n", s_error);
return;
}