方法二:https://zhangzc.blog.csdn.net/article/details/124158038
1、使用到的主要函数说明:
(1)、mysql_real_query()
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
对于包含二进制数据的查询,必须使用mysql_real_query()而不是mysql_query(),这是因为,二进制数据可能会包含‘\0’字符。
此外,mysql_real_query()比mysql_query()快,这是因为它不会在查询字符串上调用strlen()。
如果查询成功,返回0。
如果出现错误,返回非0值。
(2)、mysql_store_result()
MYSQL_RES *mysql_store_result(MYSQL *mysql)
对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。
对于其他查询,不需要调用mysql_store_result()或mysql_use_result(),但是如果在任何情况下均调用了mysql_store_result(),它也不会导致任何伤害或性能降低。
通过检查mysql_store_result()是否返回0,可检测查询是否没有结果集(以后会更多)。
mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。
如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。
如果读取结果集失败,mysql_store_result()还会返回Null指针。
通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。
可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。
一旦完成了对结果集的 *** 作,必须调用mysql_free_result()。
具有多个结果的MYSQL_RES结果集合。
如果出现错误,返回NULL。
(3)、mysql_num_fields()
unsigned int mysql_num_fields(MYSQL_RES *result)
返回结果集中的字段数。
(4)、mysql_fetch_fields()
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
对于结果集,返回所有MYSQL_FIELD结构的数组。
每个结构提供了结果集中1列的字段信息。
2、实例:
(1)、要查询的数据表结构:
(2)源码:
// mySqlTest.cpp : 此文件包含 "main" 函数。
程序执行将在此处开始并结束。
//
#include
#include
#include
#include
#include
using namespace std;
int main()
{
//1.初始化环境
MYSQL* mySql = mysql_init(NULL);
if (mySql == NULL)
{
printf("数据库环境初始化失败!\n");
return -1;
}
//2.连接数据库
mySql = mysql_real_connect(mySql, "localhost", "root", "root", "zzc", 3306, NULL, 0);
if (mySql == NULL)
{
printf("数据库连接失败!\n");
return -1;
}
//mysql_set_character_set(mySql, "gbk");
//执行查询
char sql[] = "select id, name, time, photo from student where id = 1003";
if (0 != mysql_real_query(mySql, sql, strlen(sql)))
{
printf(" %s\n", mysql_error(mySql));
}
//获取结果集
MYSQL_RES * result = NULL;
result = mysql_store_result(mySql);
if (NULL == result)
{
printf(" %s\n", mysql_error(mySql));
}
//循环获取每一行数据数据
MYSQL_ROW m_row = nullptr;
//获取字段总数
int fieldCount = mysql_num_fields(result);
//获取一行数据的字段信息
MYSQL_FIELD *fields = mysql_fetch_fields(result);
while (m_row = mysql_fetch_row(result))
{
for (int i = 0;i < fieldCount; ++i)
{
if (fields[i].type == MYSQL_TYPE_BLOB)
{
unsigned long length = mysql_fetch_lengths(result)[i];
char* buffer = new char[length + 1];
memset(buffer, 0x00, sizeof(buffer));
memcpy(buffer, m_row[i], length);
stringstream pic_name;
pic_name << "D:\test.jpg";
ofstream outfile(pic_name.str(), ios::binary);
outfile.write(buffer, length);
if (buffer) delete[] buffer;
}
else if (fields[i].type == MYSQL_TYPE_VAR_STRING)
{
char* val = m_row[i];
unsigned long length = mysql_fetch_lengths(result)[i];
if (val)
{
cout << string(val, length) << "\t";
}
}
else if (fields[i].type == MYSQL_TYPE_DATETIME)
{
char* val = m_row[i];
unsigned long length = mysql_fetch_lengths(result)[i];
if (val)
{
cout << string(val, length) << "\t";
}
}
else if (fields[i].type == MYSQL_TYPE_LONG)
{
int val = atoi(m_row[i]);
cout << val << "\t";
}
}
cout << endl;
}
//释放资源-结果集
if (result)
{
mysql_free_result(result), result = nullptr;
}
//释放资源-数据库
if (mySql)
{
mysql_close(mySql);
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)