1. 简介:

使用C/C++连接MySQL数据库执行增删改查操作,基本就是围绕以下两个文件展开:

  • mysql.h(此头文件一般在MySQL的include文件夹内,如 D:\MySQL\mysql-5.7.23-winx64\include)
  • MySQL官方 C API

C/C++连接数据库执行查询操作时需要将sql查询语句嵌入到mysql_query语句中,具体见API中的mysql_query()函数

2. 数据库安装

本文代码是以MySQL官方实例数据库employees为对象进行的查询,如果想直接运行下述代码,需要安装employees数据库,当然也可以使用下述代码对其他数据库进行查询,只需要修改代码中的部分sql语句。下面介绍一下employees数据库的安装:

employees下载:(一下两种方法都可以,任选其一,两方法得到的文件相同test_db-master.zip)

employees安装:

3. 完整代码

/*
C/C++连接MySQL数据库时,需要包含一个*.h的mysql头文件和一个mysql的lib文件
1、初始化;2、连接数据库;3、执行sql查询语句;4、获取查询值;5、关闭
*/
#include <stdio.h>
#include <WinSock.h>
#include <mysql.h>
#include <Windows.h>
#pragma comment(lib,"wsock32.lib")
#pragma comment(lib,"libmysql.lib") MYSQL mysql;
MYSQL_FIELD *fd; //字段列数组
char field[][]; //存字段名二维数组
MYSQL_RES *res; //行的一个查询结果集
MYSQL_ROW column; //数据行的列
char query[]; //查询语句 //函数声明
bool ConnectDatabase();
void FreeConnect();
bool QueryDatabase();
bool InsertData();
bool ModifyData();
bool DeleteData(); int main(int argc, char **argv){
ConnectDatabase();
QueryDatabase();
InsertData();
QueryDatabase();
ModifyData();
QueryDatabase();
//DeleteData();
//QueryDatabase();
FreeConnect();
system("pause");
return ;
} //连接数据库
bool ConnectDatabase(){
//Gets or initializes a MYSQL structure
mysql_init(&mysql); // Connects to a MySQL server
const char host[] = "localhost";
const char user[] = "root";
const char passwd[] = "root";
const char db[] = "employees";
unsigned int port = ;
const char *unix_socket = NULL;
unsigned long client_flag = ; /*A MYSQL* connection handler if the connection was successful,
NULL if the connection was unsuccessful. For a successful connection,
the return value is the same as the value of the first parameter.*/
if (mysql_real_connect(&mysql, host, user, passwd, db, port, unix_socket, client_flag)){
printf("The connection was successful.\n");
return true;
}
else{
/*const char *mysql_error(MYSQL *mysql)
Returns the error message for the most recently invoked MySQL function
A null-terminated character string that describes the error.
An empty string if no error occurred.*/
printf("Error connecting to database:%s\n", mysql_error(&mysql));
return false;
}
} //释放资源
/*void mysql_free_result(MYSQL_RES *result)
Frees the memory allocated for a result set by mysql_store_result(),
mysql_use_result(), mysql_list_dbs(), and so forth.When you are done
with a result set, you must free the memory it uses by calling mysql_free_result().
Do not attempt to access a result set after freeing it.*/ /*void mysql_close(MYSQL *mysql)
Closes a previously opened connection.mysql_close() also deallocates
the connection handler pointed to by mysql if the handler was allocated
automatically by mysql_init() or mysql_connect().*/
void FreeConnect(){
mysql_free_result(res);
mysql_close(&mysql);
} //查询数据
bool QueryDatabase(){
//将数据格式化输出到字符串
sprintf_s(query, "select * from departments");
//设置编码格式
mysql_query(&mysql, "set names gbk"); /*int mysql_query(MYSQL *mysql, const char *stmt_str)
Executes an SQL query specified as a null-terminated string
Executes the SQL statement pointed to by the null-terminated string stmt_str.
Normally, the string must consist of a single SQL statement without
a terminating semicolon (;). If multiple-statement execution has been enabled,
the string can contain several statements separated by semicolons.
Return Values:Zero for success. Nonzero if an error occurred.*/
if (mysql_query(&mysql, query)){
printf("Query failed (%s)\n", mysql_error(&mysql));
return false;
}
else{
printf("query success\n");
} /*MYSQL_RES *mysql_store_result(MYSQL *mysql)
Retrieves a complete result set to the client
mysql_store_result() reads the entire result of a query to the client,
allocates a MYSQL_RES structure, and places the result into this structure.
mysql_store_result() returns a null pointer if the statement did not return
a result set(for example, if it was an INSERT statement). mysql_store_result()
also returns a null pointer if reading of the result set failed.
You can check whether an error occurred by checking whether mysql_error()
returns a nonempty string. Return Values:A MYSQL_RES result structure with
the results.NULL(0) if an error occurred.*/
res = mysql_store_result(&mysql);
if (!res){
printf("Couldn't get result from %s\n", mysql_error(&mysql));
return false;
} /*my_ulonglong mysql_affected_rows(MYSQL *mysql)
It returns the number of rows changed, deleted,
or inserted by the last statement if it was an UPDATE, DELETE, or INSERT.
For SELECT statements, returns the number of rows in the result set.*/
printf("number of dataline returned: %d\n", mysql_affected_rows(&mysql)); /*MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
Returns the definition of one column of a result set as a MYSQL_FIELD structure.
Call this function repeatedly to retrieve information about all columns in the result set.*/ // 获取列数
int j = mysql_num_fields(res); //存储字段信息
char *str_field[]; //获取字段名
for (int i = ; i < j; i++){
str_field[i] = mysql_fetch_field(res)->name;
} //打印字段
for (int i = ; i < j; i++)
printf("%10s\t", str_field[i]);
printf("\n"); //打印查询结果
//MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
//Fetches the next row from the result set
while (column = mysql_fetch_row(res)){
printf("%10s\t%10s\n", column[], column[]);
}
return true;
} //插入数据
bool InsertData(){
sprintf_s(query, "insert into departments values ('xxxx', 'xxxxx');");
if (mysql_query(&mysql, query)) {
printf("Query failed (%s)\n", mysql_error(&mysql));
return false;
}
else{
printf("Insert success\n");
return true;
}
} //修改数据
bool ModifyData(){
sprintf_s(query, "update departments set dept_name='yyyyy' where dept_no='xxxx'");
if (mysql_query(&mysql, query)) {
printf("Query failed (%s)\n", mysql_error(&mysql));
return false;
}
else{
printf("Insert success\n");
return true;
}
} //删除数据
bool DeleteData()
{
sprintf_s(query, "delete from departments where dept_no='xxxx';");
if (mysql_query(&mysql, query)) {
printf("Query failed (%s)\n", mysql_error(&mysql));
return false;
}
else{
printf("Insert success\n");
return true;
}
}

C/C++连接MySQL数据库执行查询的更多相关文章

  1. MFC连接Mysql数据库执行查询和插入

    配置环境: include:mysql.h文件 lib:libmysql.lib文件 dll::libmysql.dll文件 连接代码: MYSQL m_sqlCon; MYSQL_RES *m_re ...

  2. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  3. Java使用JDBC连接MySQL数据库

    1.引用 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写 ...

  4. MATLAB连接MySQL数据库

    今天开始看<MATLAB数据分析与挖掘实战>,学习了下用MATLAB连接MySQL数据库,环境win7,32bit,MySQL5.7.12,MATLAB2013B 首先,从这里下载驱动的压 ...

  5. JDBC连接MySQL数据库及示例

      JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一 ...

  6. Java连接MySQL数据库及简单操作代码

    1.Java连接MySQL数据库 Java连接MySql需要下载JDBC驱动MySQL-connector-java-5.0.5.zip(举例,现有新版本).然后将其解压缩到任一目录.我是解压到D盘, ...

  7. 一个非常标准的连接Mysql数据库的示例代码

    一.About Mysql 1.Mysql 优点 体积小.速度快.开放源码.免费 一般中小型网站的开发都选择 MySQL ,最流行的关系型数据库 LAMP / LNMP Linux作为操作系统 Apa ...

  8. java用JDBC连接MySQL数据库的详细知识点

    想实现java用JDBC连接MySQL数据库.需要有几个准备工作: 1.下载Connector/J的库文件,下载Connector/J的官网地址:http://www.mysql.com/downlo ...

  9. Eclipse中利用JSP把mysql-connector-java-8.0.13.jar放到WebContent\WEB-INF\lib中连接MySQL数据库时Connection conn = DriverManager.getConnection(url,username,password)报错的解决办法

    开发环境: 1.系统:windows 7/8/10均可 2.jdk:1.8.0_144 3.服务器:apache-tomcat-9.0.8 4.IDE:eclipse+jsp 0.网页代码如下: &l ...

随机推荐

  1. Java--------------Mysql中时间按要求查询

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  2. 黑客攻防技术宝典Web实战篇:避开客户端控件习题

    猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 通过客户端传送的数据如何阻止破坏性攻击? 可以使用保存在服务器上的密钥对数据进行加密或散列 ...

  3. LuoguP2055 [ZJOI2009]假期的宿舍【二分图最大匹配】By cellur925

    题目传送门 这道题开始感觉不出是二分图最大匹配的qwq.但是今天学了匈牙利算法,想来做几个题qwq.做这个题的时候想了很久它哪里是二分图,脑子里是“两列,每列有很多点的那种图 qwq.” 然后看了题解 ...

  4. Luogu P1754球迷购票问题【dp/卡特兰数】By cellur925

    题目传送门 虽然是水dp,但我感到还是有些无从下手== f[i][j]表示还剩i个50元没考虑,j个100元没考虑的方案数,可有转移f[i][j]=f[i-1][j]+f[i][j-1] 但其实它也可 ...

  5. C#中,用HashTable,DataTable等复制和克隆浅谈

    如有雷同,不胜荣欣,若转载,请注明 在C#中,用HashTable,DataTable等复制和克隆浅谈,下面直接看例子 HashTable ht = null; ht = new HashTable( ...

  6. Zeppelin的入门使用系列之创建新的Notebook

    前期博客 hadoop-2.6.0.tar.gz + spark-1.6.1-bin-hadoop2.6.tgz + zeppelin-0.5.6-incubating-bin-all.tgz(mas ...

  7. Java正确URL解码方式:URLDecoder.decode

    //解码,为了解决中文乱码 String str = URLDecoder.decode(request.getParameter("orderJson"),"UTF-8 ...

  8. the little schemer 笔记(8)

    第八章 lambda the ultimate 还记得我们第五章末的rember和insertL吗 我们用equal?替换了eq? 你能用你eq?或者equal?写一个函数rember-f吗 还不能, ...

  9. C++ 操作符重载 (operator)

    重载不能改变操作符的优先级 如果一个内建操作符是一元的,那么所有对它的重载仍是一元的.如果是二元的重载后也是二元的 下面看一个有代表性的例子:: 头文件Complex.h: #includeusing ...

  10. Travelling HDU - 3001

    Travelling HDU - 3001 方法:3进制状态压缩dp(更好的方法是预处理出每个状态数字对应的y数组,然后用刷表,时间复杂度可以少一个n) #include<cstdio> ...