您的位置:首页 > 编程语言 > C语言/C++

C语言下用MySQL对数据库操作

2017-09-18 13:34 260 查看
标签:工程

编译环境

需要头文件
#include <mysql/mysql.h>


命令行编译,使用下面的命令

gcc test.c -o test  -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient (-lz) (-lm)


参数在Linux环境下可以写到
Makefile
文件里

#Makefile 注意要写第6行,其他的视文件名而定。
OBJS = yhsw.o tea_c.o tea_util_c.o

CC = gcc

CFLAGS=-Wall $(shell mysql_config  --libs)  $(shell mysql_config  --cflags)
#CFLAGS+=-lm

phone_auth:$(OBJS)
$(CC) $(OBJS) -o phone_auth -lm  $(CFLAGS)

yhsw.o:yhsw.c yhsw.h tea_util_c.h
$(CC) $(CFLAGS) -c yhsw.c
tea_c.o:tea_c.c tea_util_c.h
$(CC) $(CFLAGS) -c tea_c.c
tea_util_c.o:tea_util_c.c tea_util_c.h
$(CC) $(CFLAGS) -c tea_util_c.c
clean:
rm *.o
rm phone_auth


windows下据说可以加这几行预编译

#if defined(_WIN32) || defined(_WIN64)//为了支持windows平台上的编译
#include <windows.h>
#endif


系统库里的结构体

在头文件下一些关于数据库的结构体已经隐含了,在实例化以后即可使用。

st_mysql/MYSQL

typedef struct st_mysql {
NET net; /* Communication parameters */
gptr connector_fd; /* ConnectorFd for SSL */
char *host,*user,*passwd,*unix_socket,
*server_version,*host_info,*info,*db;
unsigned intport,client_flag,server_capabilities;
unsigned intprotocol_version;
unsigned intfield_count;
unsigned intserver_status;
unsigned long thread_id; /* Id for connection in server */
my_ulonglong affected_rows;
my_ulonglong insert_id; /* id if insert on table with NEXTNR */
my_ulonglong extra_info; /* Used by mysqlshow */
unsigned long packet_length;
enum mysql_status status;
MYSQL_FIELD *fields;
MEM_ROOT field_alloc;
my_bool free_me; /* If free in mysql_close */
my_bool reconnect; /* set to 1 if automatic reconnect */
struct st_mysql_options options;
char scramble_buff[9];
struct charset_info_st *charset;
unsigned intserver_language;
} MYSQL;


st_mysql_res/MYSQL_RES

这个结构代表一个查询的(SELECT, SHOW, DESCRIBE, EXPLAIN)的返回结果。返回的数据称为“数据集”,通过它从数据库读取数据。

typedef struct st_mysql_res {
my_ulonglong row_count;
unsigned intfield_count, current_field;
MYSQL_FIELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;
MEM_ROOT field_alloc;
MYSQL_ROW row; /* If unbuffered read */
MYSQL_ROW current_row; /* buffer to current row */
unsigned long *lengths; /* column lengths of current row */
MYSQL *handle; /* for unbuffered reads */
my_bool eof; /* Used my mysql_fetch_row */
} MYSQL_RES;


常用函数

mysql_init

函数功能:获得或初始化一个MYSQL结构

函数原型:
MYSQL *mysql_init(MYSQL *mysql)


函数返回值:一个被始化的
MYSQL*
句柄

备注:在内存不足的情况下,返回NULL

mysql_close

函数功能:关闭一个服务器连接,并释放与连接相关的内存

函数原型:
void mysql_close(MYSQL *mysql)


函数传入值:MYSQL:类型的指针

函数返回值:无

mysql_connect

函数功能:连接一个MySQL服务器

函数原型:
MYSQL * mysql_connect


(MYSQL *mysql,const char *host,const char *user,const char *passwd);


函数传入值:

mysql
表示一个现存mysql结构的地址

host
表示MYSQL服务器的主机名或IP

user
表示登录的用户名

passwd
表示登录的密码

函数返回值:如果连接成功,一个
MYSQL *
连接句柄;如果连接失败,NULL

备注:该函数不推荐,使用
mysql_real_connect()
代替

mysql_real_connect

函数功能:连接一个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 int client_flag);


函数传入值:

mysql
表示一个现存mysql结构的地址

host
表示MYSQL服务器的主机名或IP

user
表示登录的用户名

passwd
表示登录的密码

db
表示要连接的数据库

port
表示MySQL服务器的TCP/IP端口

unix_socket
表示连接类型

client_flag
表示MySQL运行ODBC数据库的标记

函数返回值:如果连接成功,一
个MYSQL*
连接句柄:如果连接失败,NULL

mysql_affected_rows

函数功能:返回最新的UPDATE,DELETE或INSERT查询影响的行数

函数原型:
int mysql_affected_rows(MYSQL* mysql)


函数传入值:
MYSQL*


函数返回值:执行成功则返回受影响的行的数。如果上一次查询失败的话,函数返回-1。

mysql_query

函数功能:对指定的连接执行查询

函数原型:
int mysql_query(MYSQL *mysql, const char *query);


函数传入值:
query
表示执行的SQL语句,最后不必加分号

函数返回值:如果查询成功,为零,出错为非零。

相关函数:
int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)


mysql_use_result

函数功能:为无缓冲的结果集获得结果标识符

函数原形:
MYSQL_RES *mysql_use_result(MYSQL *mysql);


函数传入值:
MYSQL*


函数返回值:
MYSQL_RES*
,如果发生一个错误发NULL

mysql_fetch_row

函数功能:检索一个结果集合的下一行

函数原形:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);


函数传入值:
MYSQL_RES*


函数返回值:下一行的
MYSQL_RES*
。如果没有更多的行可检索或如果出现一个错误,NULL

mysql_num_fields

函数功能:返回指定结果集中列的数量

函数原形:
unsigned int mysql_num_fields(MYSQL_RES *res);


函数传入值:
MYSQL_RES*


函数返回值:结果集合中字段数量的一个无符号整数

mysql_create_db

函数功能:创建一个数据库

函数原形:
int mysql_create_db(MYSQL *mysql,const char *db);


函数传入值:

MYSQL_RES*


db
要创建的数据库名

函数返回值:如果数据库成功地被创建,返回零,如果发生错误,为非零。

mysql_select_db

函数功能:选择一个数据库

函数原形:
int mysql_select_db(MYSQL *mysql,const char *db);


函数传入值:

MYSQL*


db
要创建的数据库名

函数返回值:如果数据库成功地被创建,返回零,如果发生错误,为非零。

EXAMPLE

这里的大部分代码参考了MySQL发行包里面的.c源文件。

下面这段代码实现了连接到本地MySQL服务器上9tmd_bbs_utf8数据库,从数据表tbb_user中根据输入的userid取得该用户的用户名并打印输出到终端。

#include <stdio.h>
#include <mysql.h>
#include <string.h>

int main() {
MYSQL *t_mysql;
MYSQL_RES *res;
MYSQL_FIELD *fd;
MYSQL_ROW row;
char select[] = "select * from ca_device where mac = '58:69:6C:32:F9:1C'";

printf("start init\n");
t_mysql = mysql_init(NULL);
if(t_mysql == NULL) {
printf("init failed\n");
return 1;
}

printf("start connect\n");
if(mysql_real_connect(t_mysql, "88.88.88.88", "username", "password", "dbname", 0, NULL, 0) == NULL) {
printf("connect failed\n");
return 1;
}

printf("start select\n");
if(mysql_real_query(t_mysql, select, strlen(select))) {
printf("insert failed\n");
return 1;
}

if(!(res = mysql_store_result(t_mysql))) {
printf("store failed\n");
return 1;
}

int col = mysql_num_fields(res), i;
printf("number of fields returned: %d\n", col);
int sum = 10;
while(row = mysql_fetch_row(res)) {
for(i = 0;i < col;i++)
printf("%s ", row[i]);
printf("\n");
if(sum-- == 0) break;
} // 开心地遍历出10条数据

mysql_close(t_mysql);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: