开发成长之路(17)-- 数据库操作
轻量级SQL可视化工具:sqlite3
为什么先讲sqlite3?因为对于新手来说,sqlite3用来入门再方便不过了。
MySQL、Oracle等数据库那么庞大,小白真的能纯粹的用这些数据库来学习SQL语言?我看不见得。
需要sqlite3的图形化软件可以右侧找我,也可以私信我,网上找的基本都是命令行模式的。
SQL语言概览
入门数据库操作,基本功一定要打扎实了。
咱也不喜欢做搬运工,这个也比较基础一些,大家可以自行学习:
经典SQL语句大全(绝对的经典)
当然,光这样看语句的话,也会有点干巴巴的,所以最好配一些题目,两篇一起看会比较好一些:
MySQL题集
MySQL见闻录 - 入门之旅
在网上翻来覆去找不到一套适合新手自学的书,于是买了课,急急忙忙上完了课,又发现全还给老师了。
这一系列文放在这里,从下载软件开始,记录一条MySQL入门之旅。 新手也可以跟着这条路走,一条道走到黑。
有任何疑问,参考三篇上课笔记,或者私信我。
1、Linux下的MySQL环境搭建
使用命令(安装mysql):
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
sudo apt-get install emma
- 1
- 2
- 3
- 4
这要安不上,度娘在边上。
2、头文件
//Linux下
//mysqltest.cpp 代码如下:
#include <stdio.h>
//确保在/usr/include/mysql下有mysql.h文件
#include "mysql/mysql.h"
//windows下
#include <WinSock2.h> // 进行网络编程需要winsock2.h
#include <mysql.h>
#pragma comment(lib, “libmysql.lib”)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
后面的示例代码是一份windows下的,不过建议大家熟悉之后改成Linux版本的,毕竟咱这学C++的嘛,跟Linux感情还是好一点。
3、初见庐山真面目
/*连接句柄 整个MYSQL开发的核心*/
MYSQL * mysql;
/*初始化*/
MYSQL *mysql_init(MYSQL *mysql);
/*设置连接选项*/
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg);
/*打开连接*/
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);
/*执行SQL语句*/
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length);
/*如果SQL语句是C风格字符串,可以直接用下面的函数*/
int mysql_query(MYSQL *mysql, const char *query);
/*SQL语句一般只能是一条语句,如果你想在一个函数调用中执行多个SQL语句,需要以;隔开,并且设置在打开连接时设置属性*/
CLIENT_MULTI_STATEMENTS
/*或者对已经打开的连接进行以下函数调用设置,其中mysql为MYSQL的指针*/
mysql_set_server_option(mysql,MYSQL_OPTION_MULTI_STATEMENTS_ON);
/*如果执行的是一个有返回结果的语句,可以用下列函数获取结果*/
MYSQL_RES *mysql_use_result(MYSQL *mysql);
MYSQL_RES *mysql_store_result(MYSQL *mysql);
/*其中前一个函数只是初始化MYSQL_RES结构体,并不真正从服务器获取结果,后一个函数直接将全部数据读取到客户端*/
/*MYSQL_RES结构体可以通过以下函数获得数据*/
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
/*该函数返回的MYSQL_ROW类型实际为 char** 类型,通过下标操作可以取得每一列的值*/
/*可以通过以下函数获得结果集的列数*/
unsigned int mysql_field_count(MYSQL *mysql);
unsigned int mysql_num_fields(MYSQL_RES *result);
/*获得结果集的行数*/
my_ulonglong mysql_num_rows(MYSQL_RES *result);
/*使用完结果集后一定要记得释放*/
void mysql_free_result(MYSQL_RES *result);
/*如果执行的SQL语句是无返回结果的,比如DELETE INSERT等,可以使用以下函数获取影响行数*/
my_ulonglong mysql_affected_rows(MYSQL *mysql);
/*最后使用完连接后需要释放*/
void mysql_close(MYSQL *mysql);
/*错误处理*/
/*MYSQL的函数基本都遵循C语言的编程习惯,当返回值为整数时,0代表成功,非0代表失败,当返回指针时,NULL代表失败*/
/*如果函数执行失败,你可以通过下列函数获得信息*/
unsigned int mysql_errno(MYSQL *mysql);//错误代号
const char *mysql_error(MYSQL *mysql);//英文错误信息
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
4、拨开迷雾,看下一层迷雾
①调用mysql_real_connect函数连接Mysql数据库。
mysql_real_connect函数的原型如下:
MYSQL * STDCALL 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);
- 1
参数释义:
mysql:前面定义的MYSQL变量;
host:MYSQL服务器的地址;
user:登录用户名;
passwd:登录密码;
db:要连接的数据库;
port:MYSQL服务器的TCP服务端口;
unix_socket:unix连接方式,为NULL时表示不使用socket或管道机制;
clientflag:Mysql运行为ODBC数据库的标记,一般取0。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
连接失败时该函数返回0。
②调用mysql_real_query函数进行数据库查询。
mysql_real_query函数的原型如下:
int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);
- 1
参数释义:
mysql:前面定义的MYSQL变量;
q:SQL查询语句;
length:查询语句的长度。
- 1
- 2
- 3
查询成功则该函数返回0。
③通过调用mysql_store_result或mysql_use_result函数返回的MYSQL_RES变量获取查询结果数据。
两个函数的原型分别为:
MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);
MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql);
- 1
- 2
- 3
这两个函数分别代表了获取查询结果的两种方式。
第一种,调用mysql_store_result函数将从Mysql服务器查询的所有数据都存储到客户端,然后读取;
第二种,调用mysql_use_result初始化检索,以便于后面一行一行的读取结果集,而它本身并没有从服务器读取任何数据,这种方式较之第一种速度更快且所需内存更少,但它会绑定服务器,阻止其他线程更新任何表,而且必须重复执行mysql_fetch_row读取数据,直至返回NULL,否则未读取的行会在下一次查询时作为结果的一部分返回。
故经常我们使用mysql_store_result。
④调用mysql_fetch_row函数读取结果集数据。
上述两种方式最后都是重复调用mysql_fetch_row函数读取数据。mysql_fetch_row函数的原型如下:
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
- 1
参数释义:
result就是mysql_store_result或mysql_use_result的返回值。
- 1
该函数返回MYSQL_ROW型的变量,即字符串数组,假设为row,则row[i]为第i个字段的值。当到结果集尾部时,此函数返回NULL。
⑤结果集用完后,调用mysql_free_result函数释放结果集,以防内存泄露。
mysql_free_result函数的原型如下:
void STDCALL mysql_free_result(MYSQL_RES *result);
- 1
⑥不再查询Mysql数据库时,调用mysql_close函数关闭数据库连接。
void STDCALL mysql_close(MYSQL *sock);
- 1
详见:
MySQL见闻录 - 入门之旅
击穿盲点
设置了一些扫盲的。
《深入浅出SQL》问答录
具体详见:《深入浅出SQL》问答录
打开我的收藏夹 – MySQL篇
全面分析 MySQL并发控制
详见:
全面分析 MySQL并发控制
这些东西,我自己回头还得重温一遍呐,好,写进计划里、
文章来源: lion-wu.blog.csdn.net,作者:看,未来,版权归原作者所有,如需转载,请联系作者。
原文链接:lion-wu.blog.csdn.net/article/details/116995257
- 点赞
- 收藏
- 关注作者
评论(0)