MySQL C/C++编程

说是C++下的MySQL编程,其实用的还是MySQL自带的C API,因为在我学习的一份游戏的C++源代码中,就是直接使用的C API,还有一份是基于C++封装的MySQ++ API包,这个我还不了解,以后有时间研究一下。


在对MySQL的操作中,主要需要熟悉几个API,这里我总结了一下我遇到的常用的API以及对应的数据结构,最后举一个例子表明这些API的使用。


常用MySQL API

MYSQL* mysql_init(MYSQL* mysql)//连接句柄,必须初始化之后才能使用

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) //连接数据库,

int mysql_query(MYSQL* mysql, const char* query) //查询函数,成功返回零,否则返回错误类型非零值。

const char* mysql_error(MYSQL* mysql) //返回最近一次调用失败的错误消息(返回的是字符串消息)

unsigned int mysql_errno(MYSQL* mysql) //返回最近一次调用失败的错误代号(返回的是数字代号)

MySQL_RES* mysql_store_result(MYSQL* mysql) //将数据库中查询(mysql_query)得到的结果(集合)存放在MySQL_RES结构中

unsigned int mysql_num_fields(MYSQL_RES* res) //返回结果集中的列的数目

MYSQL_ROW* mysql_fetch_row(MYSQL_RES* res) //返回结果集(MYSQL_RES)的当前行的结果

unsigned int mysql_num_rows(MYSQL_RES* res) //返回结果集中的行的数目

unsigned long* mysql_fetch_lengths(MYSQL_RES* res) //返回结果集中各列的长度(可用于字符串拷贝,代替strlen函数)

void mysql_close(MYSQL* mysql) //数据库使用完毕之后应该进行关闭




相关数据结构

MYSQL: 代表一个数据库连接的句柄


MYSQL_RES:代表查询结果集,数据结构如下
typedef struct st_mysql_res {
  my_ulonglong row_count;                               // 结果集的行数
  unsigned int field_count, current_field;            // 结果集的列数,当前列
  MYSQL_FIELD *fields;                                    // 结果集的列信息
  MYSQL_DATA *data;                                      // 结果集的数据
  MYSQL_ROWS *data_cursor;                        // 结果集的光标
  MEM_ROOT field_alloc;                                   // 内存结构
  MYSQL_ROW row;                                         // 非缓冲的时候用到
  MYSQL_ROW current_row;                           //mysql_store_result时会用到。当前行
  unsigned long *lengths;                                //每列的长度
  MYSQL *handle;                                           // mysql_use_result会用。
  my_bool eof;                                                 //是否为行尾
} MYSQL_RES;


MYSQL_FIELD:包含各字段(列)的信息
typedef struct st_mysql_field {
  char *name;/* Name of column */
  char *table;                                            /* Table of column if column was a field */
  char *def;                                               /* Default value (set by mysql_list_fields) */
  enum enum_field_types type;                /* Type of field. Se mysql_com.h for types */
  unsigned int length;                               /* Width of column */
  unsigned int max_length;                       /* Max width of selected set */
  unsigned int flags;                                  /* Div flags */
  unsigned int decimals;                            /* Number of decimals in field */
} MYSQL_FIELD;  

MYSQL_ROW:通俗的讲就是查询结果集(MYSQL_RES)的一行数据
typedef char **MYSQL_ROW;/* 返回的每一行的值,全部用字符串来表示*/


示例

#include <iostream>
#include <string>
using namespace std;


int main()
{
	MySQL *mysql;
	mysql = mysql_init(mysql);

	if(!mysql_real_connect(mysql, "localhost", "root", "", "test", 0, NULL, 0))/*针对的是本地数据库且无密码的情况*/
	{
		cout << "Failed to connect to database. ERROR: "<<mysql_error(mysql) <<endl;
		exit(1);
	}

	const char* query = "SELECT * FROM road"
	if(!mysql_query(mysql, query))
	{
		cout << "Failed to query data "<<endl;
		exit(1);
	}

	MYSQL_RES res;
	MYSQL_ROW row;
	int numField = 0;
	unsigned long *len = NULL;
	char data[MAX_ROW][MAX_DATASIZE];

	if(res = mysql_store_result(mysql))
	{
		numField = mysql_num_fields(res);

		int j = 0;

		while(row = mysql_fetch_row(res))/*最好加上范围判断,防止溢出,此处省略*/
		{
			
			len = mysql_fetch_lengths(res);
                        for (int i = 0; i < numField; i++)
                {
                        bcopy(row[i], &data[j][i*32], len[i]); /*len[i]在数据拷贝中很方便*/
                }
                j++;
        }
     }
     return 0;
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值