MySQL学习笔记_11_Linux下C++/C连接MySQL数据库(一)



Linux 下 C++/C 连接 MySQL 数据库(一)

一、连接前准备

原材料:Ubuntu12.04LTS

(已经安装了MySQL5.5或者更高级版本,新立得软件包,gcc/g++或者CodeBlosks编译器)

安装了以上的软件包后,我们可以正常使用MySQL完成数据管理工作,但是很多时候我们需要通过编写程序访问MySQL。此时,在程序中需要加载MySQL驱动头文件,但是默认这些驱动包是没有安装的,因此我们需要在新立得中找到"libmysqld-dev"包并安装。

安装完成之后,在”/usr/include/mysql/”目录下会有很多相对应的头文件,如mysql.h等。

当写好程序,需要编译时:

1、如果选用的是使用gcc/g++在命令行下完成,则需要加上-lmysqlclient选项。如:

[plain] view plaincopyprint?

  1. g++ -lmysqlclient mysql_test.cc -o mysqltest
g++ -lmysqlclient mysql_test.cc -o mysqltest

2、如果选用的是CodeBlocks,则需在构建选项中,将连接库设为mysqlclient。

开始编译。

二、头文件及相关函数分析

这篇博客中所列的函数全部包含在头文件<mysql/mysql.h>下,因此,需要在程序编写开始处,加入一行:

[cpp] view plaincopyprint?

  1. #include <mysql/mysql.h>
#include <mysql/mysql.h>

1、用CAPI连接MySQL数据库有两个步骤:

1)初始化一个连接句柄

2)建立连接

所用到的函数如下:

[cpp] view plaincopyprint?

  1. MYSQL *mysql_init(MYSQL *connection);               // 初始化连接句柄
  2. //成功返回MySQL结构指针,失败返回NULL
  3. MYSQL *mysql_real_connect(MYSQL *connection,
  4. const char *server_host,
  5. const char *sql_user_name,
  6. const char *sql_password,
  7. const char *db_name,
  8. unsigned int port_number,
  9. const char *unix_socket_name,
  10. unsigned int flags);  //建立连接
  11. //成功返回MySQL结构指针,失败返回NULL
MYSQL *mysql_init(MYSQL *connection);				// 初始化连接句柄
//成功返回MySQL结构指针,失败返回NULL

MYSQL *mysql_real_connect(MYSQL *connection,
                          const char *server_host,
                          const char *sql_user_name,
                          const char *sql_password,
                          const char *db_name,
                          unsigned int port_number,
                          const char *unix_socket_name,
                          unsigned int flags); 	//建立连接
//成功返回MySQL结构指针,失败返回NULL

2、MySQL连接工作完成之后,需要对MySQL的连接进行释放

[cpp] view plaincopyprint?

  1. void mysql_close(MYSQL *connection); //关闭连接
  2. //参数connection被清空,指针变为无效
void mysql_close(MYSQL *connection); //关闭连接
//参数connection被清空,指针变为无效

3、mysql_options用于设置额外选项,并影响连接行为,但是它只能在mysql_init和mysql_real_connect之间调用

[cpp] view plaincopyprint?

  1. int mysql_options(MYSQL *connection, enum mysql_option option, const char *argument);               //设置连接选项
int mysql_options(MYSQL *connection, enum mysql_option option, const char *argument); 				//设置连接选项  

option的值为下列四个值之一:

[plain] view plaincopyprint?

  1. MYSQL_INIT_COMMAND       //连接到MySQL服务器时将执行的命令,再次连接时将自动再次执行。
  2. MYSQL_OPT_CONNECT_TIMEOUT    //连接超时前的等待秒数
  3. MYSQL_OPT_COMPRESS           //网络连接中使用压缩机制
  4. MYSQL_OPT_PROTOCOL       //要使用的协议类型,影视mysql.h中定义的mysql_protocol_type枚举值之一
MYSQL_INIT_COMMAND	     //连接到MySQL服务器时将执行的命令,再次连接时将自动再次执行。
MYSQL_OPT_CONNECT_TIMEOUT    //连接超时前的等待秒数
MYSQL_OPT_COMPRESS           //网络连接中使用压缩机制
MYSQL_OPT_PROTOCOL	     //要使用的协议类型,影视mysql.h中定义的mysql_protocol_type枚举值之一

4、以上的函数是在假设没有错误的情况下运行,如果数据库连接过程中出现了错误,我们就需要以下两个函数来处理错误信息:

[cpp] view plaincopyprint?

  1. unsigned int mysql_errno(MYSQL *connection);    //返回错误代码(0表示为出现错误)
  2. char *mysql_error(MYSQL *connection);           //返回错误信息,是以NULL作为终结的字符串
unsigned int mysql_errno(MYSQL *connection);	//返回错误代码(0表示为出现错误)
char *mysql_error(MYSQL *connection); 			//返回错误信息,是以NULL作为终结的字符串 

5、程序访问数据库不只是与数据库建立连接,更重要的是通过SQL语句的执行查询或改变数据库中数据。执行SQL语句可以通过下列函数实现。

[cpp] view plaincopyprint?

  1. int mysql_query(MYSQL *connection, const char *query);
int mysql_query(MYSQL *connection, const char *query);

SQL语句分为两类,返回数据的SQL和不返回数据的SQL(UPDATE、DELETE、INSERT)。

下面我们只介绍不返回数据的SQL

[cpp] view plaincopyprint?

  1. my_ulonglong mysql_affected_rows(MYSQL *connection);    //返回查询受影响的行
  2. //对一段SQL语句执行后可以通过调用此函数查看SQL语句执行后,数据库中数据状态改变的行数,以此判断SQL的执行成功与否。
my_ulonglong mysql_affected_rows(MYSQL *connection);	//返回查询受影响的行
//对一段SQL语句执行后可以通过调用此函数查看SQL语句执行后,数据库中数据状态改变的行数,以此判断SQL的执行成功与否。

三、实例

[cpp] view plaincopyprint?

  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstdlib>
  4. #include <mysql/mysql.h>
  5. using namespace std;
  6. void mysql_err_function(MYSQL * connection);
  7. int main()
  8. {
  9. //freopen("input.txt","r",stdin);
  10. MYSQL * connection;
  11. connection = mysql_init(NULL);
  12. if (!connection)
  13. {
  14. cout << "mysql_init failed!" << endl;
  15. exit(-1);
  16. }
  17. if (!mysql_real_connect(connection,"localhost","root","123456","test",0,NULL,0))
  18. {
  19. cout << "Connection To MySQL failed!" << endl;
  20. mysql_err_function(connection);
  21. }
  22. cout << "Connection To MySQL Server is Success..." << endl;
  23. string str;
  24. getline(cin,str);
  25. int res = 0;
  26. int affected_count = 0;
  27. while (str != "close" && str != "" && !res)
  28. {
  29. res = mysql_query(connection,str.c_str());
  30. affected_count += mysql_affected_rows(connection);
  31. if (res)
  32. {
  33. if (mysql_errno(connection))
  34. {
  35. cout << "Error " << mysql_errno(connection) << " : "
  36. << mysql_error(connection) << ‘\n‘ << endl;
  37. break;
  38. }
  39. }
  40. getline(cin,str);
  41. }
  42. cout << "Have affected " << affected_count << " rows!" << endl;
  43. mysql_close(connection);
  44. cout << "Connection To MySQL Server is closed..." << endl;
  45. return 0;
  46. }
  47. void mysql_err_function(MYSQL * connection)
  48. {
  49. if (mysql_errno(connection))
  50. {
  51. cout << "Error " << mysql_errno(connection) << " : "
  52. << mysql_error(connection) << endl;
  53. exit(-1);
  54. }
  55. }
时间: 2024-10-13 01:48:25

MySQL学习笔记_11_Linux下C++/C连接MySQL数据库(一)的相关文章

MySQL学习笔记_12_Linux下C++/C连接MySQL数据库(二) --返回数据的SQL

 Linux下C++/C连接MySQL数据库(二) --返回数据的SQL 引: 返回数据的SQL是指通过查询语句从数据库中取出满足条件的数据记录 从MySQL数据库值哦功能检索数据有4个步骤: 1)发出查询 2)检索数据 3)处理数据 4)整理所需要的数据 用mysql_query()发出查询,检索数据可以使用mysql_store_result()或mysql_use_result(),取决与怎样检索数据,接着是调用mysql_fetch_row()来处理数据,最后,还必须调用mysql_

MySQL学习笔记_13_Linux下C++/C连接MySQL数据库(三) --处理返回数据

 Linux下C++/C连接MySQL数据库(三) --处理返回数据 一.通过返回结果集中的字段数 [cpp] view plaincopyprint? unsigned int mysql_field_count(MYSQL * connection); //将MYSQL_ROW的值作为一个存储了一行数据的数组... unsigned int mysql_field_count(MYSQL * connection); //将MYSQL_ROW的值作为一个存储了一行数据的数组... 示例:

PHP学习笔记——PHP脚本和JAVA连接mysql数据库

环境 开发包:appserv-win32-2.5.10 服务器:Apache2.2 数据库:phpMyAdmin 语言:php5,java 平台:windows 10 java驱动:mysql-connector-java-5.1.37 需求 编写一个PHP脚本语言,连接到phpMyAdmin数据库的test库 编写一个java web服务端,连接到phpMyAdmin数据库的test库 代码 php连接方式 mysql.php <?php /**************************

MySQL学习笔记之八:使用Xtrabackup进行MySQL热备

xtrabackup是由percona提供的mysql数据库备份工具,是一款开源的能够对innodb和xtradb数据库进行热备的工具. xtrabackup对InnoDB支持热备,完全备份和增量备份:对MyISAM引擎支持温备,完全备份 一.特点: ①备份过程快速.可靠: ②备份过程不会打断正在执行的事务: ③能够基于压缩等功能节约磁盘空间和流量: ④自动实现备份检验: ④还原速度快: 二.安装: 其最新版的软件可从 http://www.percona.com/software/percon

(MYSQL学习笔记2)多表连接查询

3种连接方式的区别: INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录. 3个表连接查询,语句如下: SELECT a.YHID,a.TDID,b.YHMC,b.YHZH,c.TDMC FROM (km_tdcy a LEFT JOIN km_xtyh b ON a.YHID=b

MySQL学习笔记—自定义函数

MySQL学习笔记-自定义函数 注释语法: MySQL服务器支持3种注释风格: 从'#'字符从行尾. 从'– '序列到行尾.请注意'– '(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如空格.tab.换行符等等).该语法与标准SQL注释语法稍有不同. 从/序列到后面的/序列.结束序列不一定在同一行中,因此该语法允许注释跨越多行. 下面的例子显示了3种风格的注释: mysql> SELECT 1+1; # This comment continues to the end of li

MySQL学习笔记-安装和基本操作

MySQL学习笔记-安装和基本操作   1.安装MySQL 1 # yum -y install mysql mysql-server mysql-devel 添加/etc/my.conf配置: 1 vi /etc/my.conf2 [mysqld]3 default-character-set=utf84 character_set_server=utf85 [client]6 default-character-set=utf8 2.启动和停止MySQL服务: # service mysql

python下用mysqldb连接使用数据库

第一步:连接 import MySQLdb #首先需要引入mysqldb即Python 连接 MySQL 的模块. conn=MySQLdb.connect(host="localhost",user="root",passwd="")#此处等价于缺省值时即conn=MySQLdb.connect() cur = conn.cursor() #创建游标,用于发送sql指令 这样就可以用游标cur发送sql指令给mysql了. 第二步:操作 1.创

MySQL学习笔记-子查询和连接

MySQL学习笔记-子查询和连接 使客户端进入gbk编码方式显示: mysql> SET NAMES gbk; 1.子查询 子查询的定义: 子查询(Subquery)是指出现在其他SQL语句内的SELECT子句. 例如:  SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中SELECT * FROM t1 称为Outer Query / Outer Statement (外部查询) SELECT col2 FROM t2 , 被称为Su