c mysql的类型对应_C/C++ MYSQL

C++ 连接MYSQL

首先是配置环境在配置环境之前先看几个类型:

在Viual Studio 2015的项目属性中添加包含目录和库目录如图所示:(如果使用win32 ,则需要下载对应的32bit的MYSQL的C++动态链接库和包含文件)

配置库文件:(32位的需要将平台设置为win32)

如上图在链接器的附加依赖项中添加libmysql.lib,同时要将与libmysql.lib的同一文件下的libmysql.dll拷贝到项目可执行文件所在的目录中。

配置好环境后就是连接数据库,连接操作数据库的步骤如代码所示:

#include #include

wchar_t* Utf8_2_Unicode(char* row_i)

{

int len = MultiByteToWideChar(CP_UTF8, 0, row_i, strlen(row_i), NULL, 0);

wchar_t *wszStr = new wchar_t[len + 1];

MultiByteToWideChar(CP_UTF8, 0, row_i, strlen(row_i), wszStr, len);

wszStr[len] = '\0';

return wszStr;

}

int main(int argc,char* argv[])

{

const char* host = "127.0.0.1";

const char* user = "root";

const char* pass = "1234";

const char* db = "sct";

MYSQL sock;

int res;

mysql_init(&sock);

MYSQL_RES *result;

if (mysql_real_connect(&sock,host,user,pass,db,3306,NULL,CLIENT_FOUND_ROWS))

{

printf("connect success!\n");

mysql_query(&sock,"set names gbk");

res = mysql_query(&sock,"select * from student");

if (res )

{

printf("error");

}

else

{

result = mysql_store_result(&sock);

int column = mysql_num_fields(result);

int col = mysql_num_rows(result);

for(int i=0; i < col ; i++)

{

MYSQL_ROW row = mysql_fetch_row(result);

for(int j=0;j < column;j++)

{

std::cout << row[j] << std::endl;

}

}

printf("OK");

}

mysql_close(&sock);

}

return 0;

}

共分为一下几个步骤:

1. 使用MYSQL *mysql_init(MYSQL *mysql)初始化MYSQL 连接句柄mysql_con

返回值:成功MYSQL连接句柄,失败返回NULL

参数说明:

mysql : MYSQL类型的句柄

PS: 必须与void mysql_close(MYSQL* sock) 成对使用

2. 使用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 clientflag);

返回值:

如果连接成功返回MYSQL* 句柄且与第一个参数相同,否则返回NULL

参数说明:

mysql : MYSQL类型的指针,表示mysql的句柄

host : 数据库服务器主机

user :用户名

passwd : 密码

port : 端口号一般为3306

unix_socket : 使用unix连接方式,当为空是表示不使用socket或管道机制

clientflag : 值通常为0,但是,也能将其设置为下述标志的组合,以允许特定功能:

3. 使用int mysql_query(MYSQL *mysql, const char*stmt_str) 执行SQL语句,并将结果保存到mysql句柄中

返回值:执行成功返回0,执行失败返回非0值

参数说明:

mysql : MYSQL* 类型的数据库连接句柄

stmt_str : 结构化查询语句(SQL语句)

PS: 不用用于查询语句中含有二进制的数据,如果包含二进制的数据可以使用mysql_real_query()进行代替

异常类型:

4. 使用MYSQL_RES * mysql_store_result(MYSQL *mysql);将mysql中的结果取出,并保存到MYSQL_RES* 结构体中

返回值 : MYSQL_RES类型的指针,表明执行SQL语句后的结果

参数:

mysql : MYSQL* 类型的数据库连接句柄

异常类型:

5. 使用unsigned int STDCALL mysql_num_fields(MYSQL_RES *res);或者unsigned int STDCALL mysql_field_count(MYSQL *mysql);

读取操作结果后的字段(域)的个数

返回值:字段的个数

参数为上一步获取的MYSQL_RES或者执行mysql_query之后的数据库连接句柄mysql

6. 使用my_ulonglong mysql_num_rows(MYSQL_RES *res);获取结果集中的记录条数

参数说明:

res : 通过mysql_store_result()获取的结果集

7. 使用 MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);读取结果集中的一条记录,同时结果集的当前记录指针会后移一条

参数说明:

res : 通过mysql_store_result()获取的结果集

8. 最后就是对MYSQL_ROW的操作,然后使用void mysql_close(MYSQL *mysql);将mysql释放。

以下是上面用到的数据结构:

MYSQL句柄:

typedef struct st_mysql

{

NET net; /* Communication parameters */

unsigned char *connector_fd; /* ConnectorFd for SSL */

char *host,*user,*passwd,*unix_socket,*server_version,*host_info;

char *info, *db;

struct charset_info_st *charset;

MYSQL_FIELD *fields;

MEM_ROOT field_alloc;

my_ulonglong affected_rows;

my_ulonglong insert_id; /* id if insert on table with NEXTNR */

my_ulonglong extra_info; /* Not used */

unsigned long thread_id; /* Id for connection in server */

unsigned long packet_length;

unsigned int port;

unsigned long client_flag,server_capabilities;

unsigned int protocol_version;

unsigned int field_count;

unsigned int server_status;

unsigned int server_language;

unsigned int warning_count;

struct st_mysql_options options;

enum mysql_status status;

my_bool free_me; /* If free in mysql_close */

my_bool reconnect; /* set to 1 if automatic reconnect */

/* session-wide random string */

char scramble[SCRAMBLE_LENGTH+1];

my_bool unused1;

void *unused2, *unused3, *unused4, *unused5;

LIST *stmts; /* list of all statements */

const struct st_mysql_methods *methods;

void *thd;

/*Points to boolean flag in MYSQL_RES or MYSQL_STMT. We set this flagfrom mysql_stmt_close if close had to cancel result set of this object.*/

my_bool *unbuffered_fetch_owner;

/* needed for embedded server - no net buffer to store the 'info' */

char *info_buffer;

void *extension;

} MYSQL;

MYSQL操作结果:

typedef struct st_mysql_res {

my_ulonglong row_count;

MYSQL_FIELD *fields;

MYSQL_DATA *data;

MYSQL_ROWS *data_cursor;

unsigned long *lengths; /* column lengths of current row */

MYSQL *handle; /* for unbuffered reads */

const struct st_mysql_methods *methods;

MYSQL_ROW row; /* If unbuffered read */

MYSQL_ROW current_row; /* buffer to current row */

MEM_ROOT field_alloc;

unsigned int field_count, current_field;

my_bool eof; /* Used by mysql_fetch_row */

/* mysql_stmt_close() had to cancel this result */

my_bool unbuffered_fetch_cancelled;

void *extension;

} MYSQL_RES;

所有记录的信息,使用链表保存

typedef char **MYSQL_ROW; /* return data as array of strings */

typedef struct st_mysql_rows {

struct st_mysql_rows *next; /* list of rows */

MYSQL_ROW data;

unsigned long length;

} MYSQL_ROWS;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值