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. MFC类别概述

    MFC 类别主要可分为下列数大群组: ■ General Purpose classes - 提供字符串类别.数据处理类别(如数组与串行),异 常情况处理类别.文件类别...等等. ■ Windows ...

  2. Codeforces702A - Maximum Increase【尺取】

    题意: 求一个连续的最长子序列长度: 思路: 没看仔细还wa1了-以为LIS- 然后写了尺取吧...= =太不仔细了.不过收获是LIS特么写挫了然后看了学长的blog<-点我- 题目的挫code ...

  3. hdoj1003【DP】

    这道题目的DP,写到现在才明白... 每次加或者不加的条件就是这个前面这个子序列合是不是大于等于0,如果不是加了就会让这个位置的值没有意义,如果大于0,他还是在往递增的方向继续前进. 以及这个条件的继 ...

  4. sql server编写通用脚本自动检查两个不同服务器的新旧数据库的表结构差异

    问题:工作过程中,不管是什么项目,伴随着项目不断升级版本,对应的项目数据库业务版本也不断升级,数据库出现新增表.修改表.删除表.新增字段.修改字段.删除字段等变化,如果人工检查,数据库表和字段比较多的 ...

  5. bzoj 4161 Shlw loves matrixI【常系数线性齐次递推】

    并不会递推,不过板子挺好背的,只要是类似的递推都能用,但是注意c数组不能使负数 如果除了递推还有常数项的话,就用f[i]-f[i-1]的方式消掉常数项(然后多一个f[i-1]的项) #include& ...

  6. curl:出现SSL错误提示

    在上一篇博文中,升级ruby版本中,提示如下错误: 1) Error fetching https://mirrors.aliyun.com/rubygems/: [root@web ~]# gem ...

  7. the little schemer 笔记(10)

    第十章 What Is  the Value of All of This? entry条目 是由list表组成的 pair 对,pair 对的第一个list表是集合 set.另外,两个list表的长 ...

  8. UVa第十章数学概念与方法

    Bryce1010模板 10.1数论初步 1.欧几里得算法和唯一分解定理 2.Eratosthenes筛法 补充素数筛选 const int MAXN=1e6+10; ll prime[MAXN]; ...

  9. 1-18String类简介

    字符串(String)的不可变性 String类在java.lang包下面,是Object类的直接子类,通过API或者源码可以看到,String类是final修饰的,这说明String类不能被继承. ...

  10. npm install error: MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”

    When I tried to run angular 4 material2 demo on my windows server 2012, got a error message: node-pr ...