利用mysql设计图书管理系统(2)--c关于mysql的函数简介

mysql_get_client_info()
查看客户端版本信息的函数,返回值为字符串
案例:
printf(“MySQL client version: %s\n”,mysql_get_client_info());
运行结果:MySQL client version: 8.0.19

MYSQL *conn;//声明一个连接mysql结构体的句柄
句柄可以理解为之前的进程,简单的来讲就是访问一个访问mysql任务的指针
当然也可以这样申明
MYSQL coon;
只不过之后都要用&coon;

conn = mysql_init(NULL);//数据库初始化函数,返回一个链接句柄
if (conn == NULL) //如果生成失败 ,返回一个空的句柄
{
printf(“Error %u: %s\n”, mysql_errno(conn), mysql_error(conn));
exit(1);
}

mysql_errno(conn)
返回值为unsigned int代表返回错误类型的函数,这点在一些接口里面出现的比较多,有利于我们debug
1005:创建表失败
1006:创建数据库失败
1007:数据库已存在,创建数据库失败
1008:数据库不存在,删除数据库失败
1009:不能删除数据库文件导致删除数据库失败
1010:不能删除数据目录导致删除数据库失败
1011:删除数据库文件失败
1012:不能读取系统表中的记录
1016: 无法打开文件

mysql_error(conn)
返回错误的信息内容,为字符串类型
以上两个函数可以在运行的时候经常使用,每次使用一次都可以用这两个函数来进行debug,只不过返回值和错误类型不在上述之中,都可以在网上查到。

mysql_real_connect(conn, “localhost”, “username”, “passwd”, NULL,iport, NULL, 0)
这个函数建立一个到mysql数据库的链接,需要提供的参数有链接句柄,主机名,用户,密码,数据库命(没有就先是空,端口,unix套接字没有就为null,客户端标志)
localhost,username,passwd,iport都可以在mysql里面查询

mysql_query(conn, s)
s里面是我们事先要写好的mysql执行语句,唯一区别就是不需要;
比如mysql_query(coon,“create dataabase test”);
mysql_query(conn,“use test”);
该函数执行sql语句,建立一个新的数据库
深入理解mysql_query函数的作用,该函数可以接入两个参数,第一个参数就是我们要操作的数据库名字句柄,第二个参数可以理解为直接输出在consnole上的命令,可以直接把 mysql命令放在里面并且不用分号

mysql_real_query(conn, query, len)
int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)
如果查询成功,零。如果发生一个错误,非零。
类似于之前的mysql执行命令函数,不过多了一个执行命令的长度

mysql_close(conn);
关闭这个mysql句柄,api的好习惯

MYSQL_RES *result;
因为数据库里面数据表的内容特殊,所以不能用一般的类型变量,就要使用MYSQL自带的结构体MYSQL_RES来保留输出结果,这个可以保存之前mysql_query执行之后的语言。

mysql_query(conn,“use test”);
result = mysql_store_result(conn);
先执行第一个语句,执行了mysql命令之后,这个时候就可以用mysql_store_result来返回执行的结果,为MYSQL_RES结构体,传入的参数就是句柄

MYSQL_ROW row;
同理这个就是 mysql里面结果的行的个数,因为mysql里面以行为主,返回的数据也是以行的方式显示打印

int num_fields
num_fields=mysql_num_fields(result);取结果中列的个数,参数为结果集
然后就可以利用这两个行列来打印所有查询的信息

result = mysql_store_result(conn);
row = mysql_fetch_row(result);
参数为之前执行完mysql命令后的结果集,他会自动的往结果的下一行跳转,如果没有可以检测的了或者是为空就返回0表示没有可以检测的了,而该函数搭配之前的行数可以做到对于每一行的打印
while ((row = mysql_fetch_row(result)))换行
{
for(i = 0; i < num_fields; i++)
{
printf("%s “, row[i] ? row[i] : “NULL”);一行里面打印每一列
}
printf(”\n");
}

mysql_free_result(result);
mysql 结果集跟句柄一样都可以得到释放

MYSQL_FIELD *field;
field = mysql_fetch_field(result)
printf("%s ", field->name);
函数参数为结果集,而这个函数返回值就是一个列表名字的结构体,他会自动取往下读取列表的名字直到没有返回0,这样就可以把数据表的索引打印出来了,看起来更美观2333(之前的函数无法打印索引)

因为mysql也可以保存读取图片,所以下面这些就是关于mysql处理图片的函数
create table images(data mediumblob);
Mysql自带了一种存储图片的格式为mediumblob,所以在需要存储图片等文件时候可以利用,使用这个格式比使用字符串更好

首先是把图片保存到mysql中
FILE *fp;定义一个文件类型的指针

fp = fopen(“image.png”, “rb”);
//如果不加明确路径则默认为是当前的目录,rb是读取二进制文件,图片是二进制文件

char data[10241000]
size = fread(data, 1, 1024
1000, fp);
从给定的一个文件指针读取数据到data所指向的字符串组中,1为读取的每个元素的大小,(1字节)10241000是元素的个数,可以通过图片的像素大小来反映,然后就把这个图片的内容保存到data这个字符串里面(data大小一定要提前定义好,可以稍微大一点点)
Size(成功读取的元素个数,为整形int)=fread(data(一个和图片像素大小一致的char数组,用来存放图片的数据为字符串格式),1(默认就是1,为每个元素所占的字节),x
y(图片的像素大小),fp(图片的文件指针))返回成功读取的元素的个数,data为字符串组

二进制数据可以包含一些特殊的字符,这些在sql语句中可能会引起一些问题。所以必须进行转义,理论上来说,每个字符可能是特殊字符。所以chunk数组大小是data数组大小的两倍,该函数会在chunk数组加上结尾符。

unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length)
第一个参数为数据库的句柄,第二个参数为转义后数据储存的字符组,大小为像素的2倍加一,因为特殊字符的大小为一般字符大小的2倍,并且最后还有一个NULL字节标志结束,然后from就是之前从文件指针中读取的字符串保留到的第一个和像素一样大的字符组中,最后一个长度就是之前成功读取的元素个数

int snprintf(char* dest_str,size_t size,const char* format,…);
成功返回写入的长度,失败则返回负数

char *stat = “INSERT INTO images(data) VALUES( ‘%s’)”;
len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk);
这列的作用就是把这段格式化的话保存在query字符组里并且大小要够大,中间的size为需要格式化保存的大小,而state,chunk就是把这段话最后标准格式的话输出在终端上

下面为从mysql里面读取图片
FILE *fp;
fp = fopen(“image.png”, “wb”);
写入的时候就要创建一个新的图片格式文件并且使用wb
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
stream为指向fiLe的一个指针,为一个输出的对象,而nmemb为每一个元素的大小,默认为1字节,size为写入的元素的总个数,也就是像素,ptr是指向需要读取的内容的指针

解决中文乱码问题
在连接到数据库后加上这么一句
linux环境
mysql_query(connection, “SET NAMES UTF8”);
windows环境
mysql_query(connection, “SET NAMES GB2312”);
这样就可以让数据库里面中文的显示正常

好了可能有点多。。。下次结合我的源码再。。来了解一下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值