通过C++实现对数据库的操作主要是通过mysql_query(MYSQL *mysql, const char *q)函数实现,函数的第一个参数是MySQL的对象,第二个参数是让数据库执行的指令。
要取出数据库中的数据,需要用到的函数是mysql_store_result(MYSQL *mysql),在使用这个函数之前,我们需要先执行"SELECT * FROM menu",这句话可以理解为选中你所需要的数据,如果你只想选中表单中的某一个字段,如SELECT dishName FROM menu,那么数据库就会显示表单menu中的dishName字段的数据(这里的menu是我自己创建的表单名,dishName是我取的字段名)
选中数据以后,我们就可以执行mysql_store_result函数来取出对应的数据了
//选中所有的数据
sqlstr = "SELECT * FROM book;";
if (0 == mysql_query(&sock, sqlstr.c_str())) {
cout << "show information successfully" << endl;
}
else {
cout << "fail to show information" << endl;
mysql_close(&sock);
}
//取出选中的数据,存到result中
MYSQL_RES *result = NULL;
result = mysql_store_result(&sock);
if (result != NULL) {
cout << "get information successfully" << endl;
}
else
{
cout << "fail to get information" << endl;
mysql_close(&sock);
}
最开始的时候,为了确认是否成功取出数据,我都会使用if语句测试一下。
接下来我们取出某行或者某列数据,只需要从上面的 result 中取即可。
1、取出行数据
取出行数据时主要用到的函数是mysql_fetch_row(MYSQL_RES *result)函数
mysql_fetch_row函数每执行一次,便取出一行的数据,如果需要取出所有的行数据,需要执行多次,因此在使用这个函数之前,我们需要先计算 行数和列数。
m_nRowCount = mysql_num_rows(result); //计算行数
m_nFieldCount = mysql_num_fields(m_res); //计算列数
计算行数和列数也有对应的API,在计算完行数和列数以后,我们通过for循环逐一打印出每一行的数据。
for (size_t i = 0; i < m_nRowCount; i++)
{
m_sqlrow = mysql_fetch_row(result); //执行一次便可获得一行的信息
//打印每一行的数据
for (size_t j = 0; j < m_nFieldCount; j++)
{
cout << m_sqlrow[j] << " ";
}
cout << "\n";
}
第一个for循环是取出每一行的数据,其排列方式是是按照对应列存储的,因此需要提前算出列数,其排列方式大致如下
然后是输出结果
2、取出列数据
取出列数据和取出行数据类似,主要涉及到的函数是
mysql_fetch_field_direct(MYSQL_RES *res, unsigned int fieldnr);
参数1: mysql_store_result函数的返回值 result
参数2:想要取出的第 i 列的数据
MYSQL_FIELD *m_sqlfield;
m_sqlfield = mysql_fetch_field_direct(result, 0);
cout<<m_sqlfield->name<<endl;
值得注意的是,之前取出行数据的时候,行数据存在 m_sqlrow中,m_sqlrow这里可以看作是一个数组,但是取出列数据的时候,m_sqlfield需要看作是结构体的对象,可调用的成员比较局限,上面打印的是第0列的字段名,关于其他的成员,可以参考声明
如果是在同一个作用域下取出行数据和列数据,那么mysql_store_result只需要执行一次
如果是在类的不同函数中取出行数据和列数据,那么每次取出行数据或者列数据之前都要执行mysql_store_result函数