首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL见闻录 - 入门之旅(六)(C++操作MySQL)

MySQL见闻录 - 入门之旅(六)(C++操作MySQL)

作者头像
看、未来
发布2020-08-25 17:11:36
1.6K0
发布2020-08-25 17:11:36
举报

在网上翻来覆去找不到一套适合新手自学的书,于是买了课,急急忙忙上完了课,又发现全还给老师了。 这一系列文放在这里,从下载软件开始,记录一条MySQL入门之旅。 新手也可以跟着这条路走,一条道走到黑。 粉丝可见,愿者上钩。 有任何疑问,参考三篇上课笔记,或者私信我。

1、我的上课笔记

MySQL数据库从入门到实战应用(学习笔记一)

MySQL数据库从入门到实战应用(学习笔记二)

MySQL数据库从入门到实战应用(学习笔记三)

C++语言使用MySQL

我也是个新手,所以这个整理的可能会比较杂,蛮看,等入门之后在拿个小项目练一下就熟悉了。

2、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

这要安不上,度娘在边上。

3、头文件

//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”)

后面的示例代码是一份windows下的,不过建议大家熟悉之后改成Linux版本的,毕竟咱这学C++的嘛,跟Linux感情还是好一点。

4、初见庐山真面目

/*连接句柄 整个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);//英文错误信息

5、拨开迷雾,看下一层迷雾

①调用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);

参数释义:

mysql:前面定义的MYSQL变量; host:MYSQL服务器的地址; user:登录用户名; passwd:登录密码; db:要连接的数据库; port:MYSQL服务器的TCP服务端口; unix_socket:unix连接方式,为NULL时表示不使用socket或管道机制; clientflag:Mysql运行为ODBC数据库的标记,一般取0。

连接失败时该函数返回0。

②调用mysql_real_query函数进行数据库查询。

mysql_real_query函数的原型如下:

int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);

参数释义:

mysql:前面定义的MYSQL变量; q:SQL查询语句; length:查询语句的长度。

查询成功则该函数返回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);

这两个函数分别代表了获取查询结果的两种方式。

第一种,调用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);

参数释义:

result就是mysql_store_result或mysql_use_result的返回值。

该函数返回MYSQL_ROW型的变量,即字符串数组,假设为row,则row[i]为第i个字段的值。当到结果集尾部时,此函数返回NULL。

⑤结果集用完后,调用mysql_free_result函数释放结果集,以防内存泄露。

mysql_free_result函数的原型如下:

void STDCALL mysql_free_result(MYSQL_RES *result);
⑥不再查询Mysql数据库时,调用mysql_close函数关闭数据库连接。
void STDCALL mysql_close(MYSQL *sock);

6、看个实例融会贯通一下

就是个实例,也不是我写的,我也是刚入门。

    #include <WinSock2.h>
    #include <mysql.h>
 	#include <iostream>
 	
    #pragma comment(lib, “libmysql.lib”)
    using namespace std;

  int main(){

    MYSQL mysql;
 
    MYSQL_RES *res;
 
    MYSQL_ROW row;
 
    // 初始化MYSQL变量
 
    mysql_init(&mysql);
 
    // 连接Mysql服务器,本例使用本机作为服务器。访问的数据库名称为“msyql”,参数中的user为你的登录用户名,***为登录密码,需要根据你的实际用户进行设置
 
    if (!mysql_real_connect(&mysql, “127.0.0.1”, “user”, “123”, “mysql”, 3306, 0, 0)){
 
    	cout << “mysql_real_connect failure!” << endl;
 
    	return 0;
    }
 
    // 查询mysql数据库中的user表
 
    if (mysql_real_query(&mysql, “select * from user”, (unsigned long)strlen(“select * from user”)))
 
    {
 
    	cout << “mysql_real_query failure!” << endl;
 
    	return 0;
    }
 
    // 存储结果集
 
    res = mysql_store_result(&mysql);
 
    if (NULL == res)
 
    {
 
    	cout << “mysql_store_result failure!” << endl;
	 
	    return 0;
    }
 
    // 重复读取行,并输出第一个字段的值,直到row为NULL
 
    while (row = mysql_fetch_row(res))
    {
    	cout << row[0] << endl;
    }
 
    // 释放结果集
 
    mysql_free_result(res);
 
    // 关闭Mysql连接
 
    mysql_close(&mysql);
 
    return 0; 
}

本篇也是本次入门之旅的最后一篇,之后更要多加练习

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、我的上课笔记
  • C++语言使用MySQL
    • 2、Linux下的MySQL环境搭建
      • 3、头文件
        • 4、初见庐山真面目
          • 5、拨开迷雾,看下一层迷雾
            • ①调用mysql_real_connect函数连接Mysql数据库。
            • ②调用mysql_real_query函数进行数据库查询。
            • ③通过调用mysql_store_result或mysql_use_result函数返回的MYSQL_RES变量获取查询结果数据。
            • ④调用mysql_fetch_row函数读取结果集数据。
            • ⑤结果集用完后,调用mysql_free_result函数释放结果集,以防内存泄露。
            • ⑥不再查询Mysql数据库时,调用mysql_close函数关闭数据库连接。
          • 6、看个实例融会贯通一下
          相关产品与服务
          云数据库 SQL Server
          腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档