MySQL C API 使用(基本函数)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingfengleerge/article/details/85261316

                                                  基础入门

一:基础函数

A: mysql_init()——分配或初始化与mysql_real_connect()相适应的MYSQL对象。

MYSQL* mysql_init(MYSQL* mysql);

补充:如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,应当在程序中调用mysql_close() 来关闭连接,以释放对象。

B: mysql_options()——用于设置额外的连接选项并影响连接的行为,可多次调用此函数来设置多个选项。

int mysql_options(MYSQL* mysql,enum mysql_option,const void* arg);

补充:在mysql_init()之后与mysql_real_connect()之前调用mysql_options()。

C: mysql_real_connect()——连接到MySQL server

MYSQL* mysql_real_connect(MYSQL* mysql,const char* host,const char* user,
                    const char* passwd,const char* db,unsigned int port,
                    const char* unix_socket,unsigned long client_flag)

说明:在你能够执行需要有效MySQL连接句柄结构的任何其它API函数之前,mysql_real_connect() 必须成功完成。

参数:“host”——必须是主机名或IP地址。如果host是NULL或字符串“localhost”,连接将被视为与本地主机连接。

           “unix_socket”——通常指定为NULL

           “client_flag”——通常为0,但是,也能将其设置为具有特定功能的标志组合。(详情参考:点这里

D: mysql_query()——执行以null结尾的字符串指定的sql查询语句

int mysql_query(MYSQL* mysql,const char* stmt_str)

补充:mysql_query() 不能用于执行包含二进制数据的sql查询语句,此时,你必须使用mysql_real_query()。

如果执行成功将返回0,如果执行错误,将返回非0值。

E: mysql_store_result()——向客户端检索完整的结果集

MYSQL_RES* mysql_store_result(MYSQL* mysql)

说明:在调用mysql_query()或者mysql_real_query() 之后,你必须调用mysql_store_result()或者mysql_use_result() 对于那些成功检索了数据的每个查询(select,show,describe,explain,check table等)。
mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。

调用mysql_num_rows()可以找出结果集中的行数。可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。

在对结果集处理完成之后,也必须调用mysql_free_result()函数释放内存。

F: mysql_use_result()——启动逐行结果集检索

MYSQL_RES* mysql_use_result(MYSQL* mysql)

说明:mysql_use_result() 不像mysql_store_result() 那样将结果集实际读取到客户端。它必须通过对mysql_fetch_row() 的调用,对每一行分别进行检索。这将直接从服务器读取结果,而不会将其保存到临时表或本地缓冲区内,与mysql_store_result() 相比,速度更快而且使用的内存更少。使用mysql_use_result() 时,必须执行mysql_fetch_row() ,直至返回NULL值。

G: mysql_fetch_row()——从结果集中获取下一行

MYSQL_ROW mysql_fetch_row(MYSQL_RES* result)

返回值:下一行的MYSQL_ROW结构。(如果没有更多的行可检索或者发生错误时,则返回NULL)

H: mysql_free_result()——释放结果集使用的内存

void mysql_free_result(MYSQL_RES* result)

说明:当你完成了对结果集的处理之后,你必须释放其使用的内存(通过调用mysql_free_result() 函数)。也不要尝试在释放内存之后,去获取结果集。

I: mysql_error()——返回最近调用MySQL函数发生的错误信息

const char* mysql_error(MYSQL* mysql)

返回值:描述错误信息的以null结尾的字符串,如果未发生错误,则返回空字符串。

M: mysql_close()——关闭一个server连接

void mysql_close(MYSQL* mysql)

说明:关闭前面已经打开的连接。如果句柄是由mysql_init() 或mysql_connect() 自定分配的,mysql_close() 还将解除分配由mysql指向的连接句柄。 

二:使用范例

注:在windows系统上的Vistual Studio开发环境下需要包含头文件#include <mysql.h>,并添加必要的库文件。在项目属性页界面也需要添加必要的包含目录和库目录。

#include <iostream>
#include <string>

//MySQL库(第三方库)
#include <mysql.h>

#pragma comment(lib,"libmysql.lib")

//全局变量声明
MYSQL mysql;
MYSQL_RES* res;
MYSQL_ROW row;
unsigned int num_fields;

//连接数据库
bool ConnectDatabase()
{
    //初始化数据库
    mysql_init(&mysql);
    
    //连接到MySQL server    
    if((mysql_real_connect(&mysql,"127.0.0.1","root",
        "Admin123456","test_sql",3306,NULL,0)))
    {
        printf("Error connecting to database:%s\n",mysql_error(&mysql));
        return false;
    }
    else
    {
        printf("connected...\n");
        return true;
    }
}

//查询数据
void QueryData(std::string& query_sql_string)
{
    const char* query_buffer=query_sql_string.c_str();

    if(mysql_query(&mysql,query_buffer)
    {
        printf("Query failed(%s)\n",mysql_error(&mysql));
    }
    else
    {
        printf("Query success\n");
        
        res=mysql_store_result(&mysql);
        num_fields=mysql_num_fields(res);
        while((row=mysql_fetch_row(res))!=NULL)
        {
            if(row[6]!=NULL)
            {
                std::string temp_string =ResultConvertToJson(row);
                ConvertUTF8ToGBK(temp_string);
                std::cout<<temp_string<<std::endl;
            }
        }
        mysql_free_result(res);    //释放内存
    }
}

int main()
{
    ConnectDatabase();
    std::string query_string = "select * from test_sql.adsbtable where TargetIdentification regexp \"CCA\" and WriteTime between \"2018-12-19 11:34:46.545\" and \"2018-12-19 11:45:49.545\" and substring(PositionInWGS_84Coordinates, 11) between 101.105301 and 107.387639 and substring(PositionInWGS_84Coordinates,1,9) between 28.105045 and 33.500975";
    QueryData(query_string);
    mysql_close(&mysql);
    return 0;
}

   

三:说明

对于C++程序员来说,MySQL官方提供的C API(https://dev.mysql.com/doc/refman/8.0/en/c-api.html)已经能满足大多数应用场景。

如果为了追求效率和C++特性,可以选择基于此 C API进行再封装的第三方库MySQL++(https://tangentsoft.com/mysqlpp/home

猜你喜欢

转载自blog.csdn.net/qingfengleerge/article/details/85261316
今日推荐