c 连接mysql怎么增删改_C++ API方式连接mysql数据库实现增删改查

这里复制的

http://www.bitscn.com/pdb/mysql/201407/226252.html

一、环境配置

1,装好mysql,新建一个C++控制台工程(从最简单的弄起,这个会了,可以往任何c++工程移植),在vs2010中设置,工程--属性--VC++目录--包含目录,将mysql server\include的绝对路径添加进去,例如C:\Program Files\MySQL\MySQL Server 5.6\include。将mysql server\lib文件夹下的libmysql.lib和libmysql.dll拷贝到工程目录下。

(也可以将include文件整个拷贝到工程目录下,然后在VC++目录里面设置相对路径)

如果安装的是wamp这种集成开发包,找不到include和lib也没关系,随便找个mysql免安装版根目录下的include文件夹和libmysql.lib以及libmysql.dll拷贝到工程目录,然后设置VC++目录即可。

新建一个数据库test,建立一张表user,如图

1a0567e87296cb30aa601ba5548e00d3.png

注意有些字段需要改字符编码为utf8或者gbk,防止中文乱码。

2,为工程添加附加依赖项wsock32.lib和libmysql.lib,一种方式是工程--属性--链接器--输入--附加依赖项,另一种是在程序开头用#pragma comment(lib,"xxx.lib")

3,为程序添加头文件"mysql.h"和WinSock.h

二、示例代码

#include

#include //一定要包含这个,或者winsock2.h

#include "include/mysql.h" //引入mysql头文件(一种方式是在vc目录里面设置,一种是文件夹拷到工程目录,然后这样包含)

#include

//包含附加依赖项,也可以在工程--属性里面设置

#pragma comment(lib,"wsock32.lib")

#pragma comment(lib,"libmysql.lib")

MYSQL mysql; //mysql连接

MYSQL_FIELD *fd; //字段列数组

char field[32][32]; //存字段名二维数组

MYSQL_RES *res; //这个结构代表返回行的一个查询结果集

MYSQL_ROW column; //一个行数据的类型安全(type-safe)的表示,表示数据行的列

char query[150]; //查询语句

bool ConnectDatabase(); //函数声明

void FreeConnect();

bool QueryDatabase1(); //查询1

bool QueryDatabase2(); //查询2

bool InsertData();

bool ModifyData();

bool DeleteData();

int main(int argc,char **argv)

{

ConnectDatabase();

QueryDatabase1();

InsertData();

QueryDatabase2();

ModifyData();

QueryDatabase2();

DeleteData();

QueryDatabase2();

FreeConnect();

system("pause");

return 0;

}

//连接数据库

bool ConnectDatabase()

{

//初始化mysql

mysql_init(&mysql); //连接mysql,数据库

//返回false则连接失败,返回true则连接成功

if (!(mysql_real_connect(&mysql,"localhost", "root", "", "test",0,NULL,0))) //中间分别是主机,用户名,密码,数据库名,端口号(可以写默认0或者3306等),可以先写成参数再传进去

{

printf( "Error connecting to database:%s\n",mysql_error(&mysql));

return false;

}

else

{

printf("Connected...\n");

return true;

}

}

//释放资源

void FreeConnect()

{

//释放资源

mysql_free_result(res);

mysql_close(&mysql);

}

/***************************数据库操作***********************************/

//其实所有的数据库操作都是先写个sql语句,然后用mysql_query(&mysql,query)来完成,包括创建数据库或表,增删改查

//查询数据

bool QueryDatabase1()

{

sprintf(query, "select * from user"); //执行查询语句,这里是查询所有,user是表名,不用加引号,用strcpy也可以

mysql_query(&mysql,"set names gbk"); //设置编码格式(SET NAMES GBK也行),否则cmd下中文乱码

//返回0 查询成功,返回1查询失败

if(mysql_query(&mysql, query)) //执行SQL语句

{

printf("Query failed (%s)\n",mysql_error(&mysql));

return false;

}

else

{

printf("query success\n");

}

//获取结果集

if (!(res=mysql_store_result(&mysql))) //获得sql语句结束后返回的结果集

{

printf("Couldn't get result from %s\n", mysql_error(&mysql));

return false;

}

//打印数据行数

printf("number of dataline returned: %d\n",mysql_affected_rows(&mysql));

//获取字段的信息

char *str_field[32]; //定义一个字符串数组存储字段信息

for(int i=0;i<4;i++) //在已知字段数量的情况下获取字段名

{

str_field[i]=mysql_fetch_field(res)->name;

}

for(int i=0;i<4;i++) //打印字段

printf("%10s\t",str_field[i]);

printf("\n");

//打印获取的数据

while (column = mysql_fetch_row(res)) //在已知字段数量情况下,获取并打印下一行

{

printf("%10s\t%10s\t%10s\t%10s\n", column[0], column[1], column[2],column[3]); //column是列数组

}

return true;

}

bool QueryDatabase2()

{

mysql_query(&mysql,"set names gbk");

//返回0 查询成功,返回1查询失败

if(mysql_query(&mysql, "select * from user")) //执行SQL语句

{

printf("Query failed (%s)\n",mysql_error(&mysql));

return false;

}

else

{

printf("query success\n");

}

res=mysql_store_result(&mysql);

//打印数据行数

printf("number of dataline returned: %d\n",mysql_affected_rows(&mysql));

for(int i=0;fd=mysql_fetch_field(res);i++) //获取字段名

strcpy(field[i],fd->name);

int j=mysql_num_fields(res); // 获取列数

for(int i=0;i

printf("%10s\t",field[i]);

printf("\n");

while(column=mysql_fetch_row(res))

{

for(int i=0;i

printf("%10s\t",column[i]);

printf("\n");

}

return true;

}

//插入数据

bool InsertData()

{

sprintf(query, "insert into user values (NULL, 'Lilei', 'wyt2588zs','lilei23@sina.cn');"); //可以想办法实现手动在控制台手动输入指令

if(mysql_query(&mysql, query)) //执行SQL语句

{

printf("Query failed (%s)\n",mysql_error(&mysql));

return false;

}

else

{

printf("Insert success\n");

return true;

}

}

//修改数据

bool ModifyData()

{

sprintf(query, "update user set email='lilei325@163.com' where name='Lilei'");

if(mysql_query(&mysql, query)) //执行SQL语句

{

printf("Query failed (%s)\n",mysql_error(&mysql));

return false;

}

else

{

printf("Insert success\n");

return true;

}

}

//删除数据

bool DeleteData()

{

/*sprintf(query, "delete from user where id=6");*/

char query[100];

printf("please input the sql:\n");

gets(query); //这里手动输入sql语句

if(mysql_query(&mysql, query)) //执行SQL语句

{

printf("Query failed (%s)\n",mysql_error(&mysql));

return false;

}

else

{

printf("Insert success\n");

return true;

}

}

运行结果:

90d069e5d3379ab0038685ce73878960.png

1dc58b0c14d69b738de673e8468bdd5a.png

三、mysql API接口汇总

mysql_affected_rows() 返回被最新的UPDATE, DELETE或INSERT查询影响的行数。

mysql_close() 关闭一个服务器连接。

mysql_connect() 连接一个MySQL服务器。该函数不推荐;使用mysql_real_connect()代替。

mysql_change_user() 改变在一个打开的连接上的用户和数据库。

mysql_create_db() 创建一个数据库。该函数不推荐;而使用SQL命令CREATE DATABASE。

mysql_data_seek() 在一个查询结果集合中搜寻一任意行。

mysql_debug() 用给定字符串做一个DBUG_PUSH。

mysql_drop_db() 抛弃一个数据库。该函数不推荐;而使用SQL命令DROP DATABASE。

mysql_dump_debug_info() 让服务器将调试信息写入日志文件。

mysql_eof() 确定是否已经读到一个结果集合的最后一行。这功能被反对; mysql_errno()或mysql_error()可以相反被使用。

mysql_errno() 返回最近被调用的MySQL函数的出错编号。

mysql_error() 返回最近被调用的MySQL函数的出错消息。

mysql_escape_string() 用在SQL语句中的字符串的转义特殊字符。

mysql_fetch_field() 返回下一个表字段的类型。

mysql_fetch_field_direct () 返回一个表字段的类型,给出一个字段编号。

mysql_fetch_fields() 返回一个所有字段结构的数组。

mysql_fetch_lengths() 返回当前行中所有列的长度。

mysql_fetch_row() 从结果集合中取得下一行。

mysql_field_seek() 把列光标放在一个指定的列上。

mysql_field_count() 返回最近查询的结果列的数量。

mysql_field_tell() 返回用于最后一个mysql_fetch_field()的字段光标的位置。

mysql_free_result() 释放一个结果集合使用的内存。

mysql_get_client_info() 返回客户版本信息。

mysql_get_host_info() 返回一个描述连接的字符串。

mysql_get_proto_info() 返回连接使用的协议版本。

mysql_get_server_info() 返回服务器版本号。

mysql_info() 返回关于最近执行得查询的信息。

mysql_init() 获得或初始化一个MYSQL结构。

mysql_insert_id() 返回有前一个查询为一个AUTO_INCREMENT列生成的ID。

mysql_kill() 杀死一个给定的线程。

mysql_list_dbs() 返回匹配一个简单的正则表达式的数据库名。

mysql_list_fields() 返回匹配一个简单的正则表达式的列名。

mysql_list_processes() 返回当前服务器线程的一张表。

mysql_list_tables() 返回匹配一个简单的正则表达式的表名。

mysql_num_fields() 返回一个结果集合重的列的数量。

mysql_num_rows() 返回一个结果集合中的行的数量。

mysql_options() 设置对mysql_connect()的连接选项。

mysql_ping() 检查对服务器的连接是否正在工作,必要时重新连接。

mysql_query() 执行指定为一个空结尾的字符串的SQL查询。

mysql_real_connect() 连接一个MySQL服务器。

mysql_real_query() 执行指定为带计数的字符串的SQL查询。

mysql_reload() 告诉服务器重装授权表。

mysql_row_seek() 搜索在结果集合中的行,使用从mysql_row_tell()返回的值。

mysql_row_tell() 返回行光标位置。

mysql_select_db() 连接一个数据库。

mysql_shutdown() 关掉数据库服务器。

mysql_stat() 返回作为字符串的服务器状态。

mysql_store_result() 检索一个完整的结果集合给客户。

mysql_thread_id() 返回当前线程的ID。

mysql_use_result() 初始化一个一行一行地结果集合的检索。

我自己用c语言写的

#include

#include

int main(int argc, char *srgv[])

{

MYSQL *conn_ptr;

MYSQL_RES *res; //这个结构代表返回行的一个查询结果集

MYSQL_ROW column; //一个行数据的类型安全(type-safe)的表示,表示数据行的列

conn_ptr = mysql_init(NULL);

if (NULL == conn_ptr)

{

printf("mysql_init failed\n");

}

if (!(mysql_real_connect(conn_ptr, "localhost", "root", "root", "a", 0, NULL, 0)))

{

printf("Error connecting to database:%s\n", mysql_error(conn_ptr));

//return 0;

}

else

{

printf("Connected...\n");

//return 1;

}

mysql_query(conn_ptr, "set names gbk");

if (mysql_query(conn_ptr, "select * from t2")) //执行SQL语句

{

printf("Query failed (%s)\n", mysql_error(conn_ptr));

}

else

{

printf("query success\n");

}

//获取结果集

if (!(res = mysql_store_result(conn_ptr))) //获得sql语句结束后返回的结果集

{

printf("Couldn't get result from %s\n", mysql_error(conn_ptr));

//return false;

}

//打印数据行数

printf("number of dataline returned: %d\n", mysql_affected_rows(conn_ptr));

printf("\tid\tname\t\n"); //column是列数组

//打印获取的数据

while (column = mysql_fetch_row(res)) //在已知字段数量情况下,获取并打印下一行

{

printf("%10s\t%10s\t\n", column[0], column[1]); //column是列数组

}

_getch();

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云如何实现海量短视频的极速分发?答案在这里!

摘要&#xff1a;短视频行业目前比较火热&#xff0c;但是如何快速的实现海量短视频的极速分发&#xff0c;对于短视频业务提供方来讲是一个比较棘手的问题。阿里云技术专家将带领大家从视频的上传、采集、存储和CDN分发等方面为我们介绍阿里云的整体方案&#xff0c;并且重点讲…

GitHub项目管理维护实用教程

GitHub项目维护教程 1&#xff09;注册GitHub账户并登陆&#xff1b; 2&#xff09;在Windows cmd&#xff08;或Ubuntu中的terminal&#xff09;中cd到自己的工作目录&#xff0c;将仓库clone下来&#xff1a; 命令&#xff1a; 1 git clone https://github.com/... #项目地址…

图文详解cacti的安装和使用

简介&#xff1a; 1.cacti介绍2.安装服务端3.安装客户端4.添加监控的设备cacti的介绍Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具Cacti是通过 snmpget来获取数据&#xff0c;使用 RRDtool绘画图形&#xff0c;而且你完全可以不需要了解RRDtool复杂…

记一次 .NET 某金融企业 WPF 程序卡死分析

一&#xff1a;背景 1. 讲故事前段时间遇到了一个难度比较高的 dump&#xff0c;经过几个小时的探索&#xff0c;终于给找出来了&#xff0c;在这里做一下整理&#xff0c;希望对大家有所帮助&#xff0c;对自己也是一个总结&#xff0c;好了&#xff0c;老规矩&#xff0c;上 …

如何将图片放到mysql_怎么将图片添加到mysql中

将图片添加到mysql中的方法&#xff1a;首先将数据库存储图片的字段类型设置为blob二进制大对象类型&#xff1b;然后将图片流转化为二进制&#xff1b;最后将图片插入数据库即可。正常的图片储存要么放进本地磁盘&#xff0c;要么就存进数据库。存入本地很简单&#xff0c;现在…

Java线程与Linux内核线程的映射关系

http://blog.sina.com.cn/s/blog_605f5b4f010198b5.html Linux从内核2.6開始使用NPTL &#xff08;Native POSIX Thread Library&#xff09;支持&#xff0c;但这时线程本质上还轻量级进程。Java里的线程是由JVM来管理的。它怎样相应到操作系统的线程是由JVM的实现来确定的。L…

YoursLC 有源 低代码 项目介绍

YoursLC 是我们独立研发的一款低代码产品&#xff0c;YoursLC-yours你们的、LC是低代码low-code的缩写&#xff0c;中文名称&#xff1a;有源低代码&#xff0c; 是一套双输出的低代码产品&#xff1a;既能完整输出功能又能100%输出源码。满足用户高效率、低成本和个性化的需求…

stm32电机控制定时器1_STM32通过PWM控制电机速度

做STM32智能小车的实验中会用到定时器PWM输出&#xff0c;来改变直流电机的转速。分享本文了解如何通过PWM实现对电机速度的控制。PWM控制电机速度的基本原理PWM(Pulse Width Modulation)&#xff0c;也就是脉冲宽度调制。PWM中有一个比较重要的概念&#xff0c;占空比&#xf…

走向无后端的系统开发实践:CRUD自动化与强约定的REST接口

2019独角兽企业重金招聘Python工程师标准>>> ttp://mp.weixin.qq.com/s?__bizMzAwMDU1MTE1OQ&idx1&mid2653548079&sn2377b625db58b2ea93c3ef2d87e4c395 转载于:https://my.oschina.net/yunjie/blog/806130

mysql char varchar 性能_Mysql小细节:varchar与char在性能上的特点

varchar与char的一个主要区别是存储方式的不同varchar 是变长存储占用的存储空间 存储内容实际大小 长度记录位char 是定长存储占用的存储空间 字段声明的宽度存储方式对性能是有影响的例如分别使用 varchar(10) 与 varchar(255) 定义一个字段&#xff0c;实际存储的字符串为…

Dubbo源码解析之Zookeeper连接

2019独角兽企业重金招聘Python工程师标准>>> 注&#xff1a;Dubbo的版本是2.5.7。 图1 RegistryProtocol的export时序图 注册中心有Zookeeper、Redis、Dubbo&#xff0c;分别对应ZookeeperRegistry、RedisRegistry、MulticastRegistry。 连接Dubbo的客户端有俩种&am…

SHELL 脚本小技巧

脚本很简单&#xff0c;直接上功能介绍及脚本&#xff0c;可以做模板使用&#xff1a; 记录日志,记录脚本开始执行时间、结束时间usage 函数&#xff0c;脚本需接参数执行&#xff0c;避免误执行&#xff0c;告诉用户&#xff0c;这个脚本的使用方法加锁&#xff0c;创建锁文件…

WinForm(十)项目框架结构

看到下面的项目结构&#xff0c;是否曾经相识&#xff1f;不要笑&#xff0c;这也是一种项目结构&#xff0c;极简主义。项目结构没有对错&#xff0c;合适就好&#xff0c;但也要有几个要求&#xff0c;至少要做到结构明确&#xff0c;清晰&#xff0c;当然上图的结构清晰&…

mysql索引有哪些了解_Mysql索引(简单了解)

Mysql的存储引擎&#xff0c;可以针对不同的表使用不同的存储引擎MyISAM&#xff1a;插入&#xff0c;查血速度快&#xff0c;但是不支持事物&#xff0c;所以适用于数据仓库&#xff0c;Web等InnoDB&#xff1a;支持事物&#xff0c;所以适合于事物型数据库Memory&#xff1a;…

使用Spring发送带附件的电子邮件(站内和站外传送)

1.使用Spring发送带附件的电子邮件 <?xml version"1.0" encoding"UTF-8"?> <beansxmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:p"http://www.spr…

vmware 克隆后Linux没有eth网卡只有lo

想试着在虚拟机上搭下主从&#xff0c;&#xff0c;&#xff0c;结果&#xff0c;克隆出来的虚拟机没有网卡。。。只有lo 于是跟着别人的来添加一个网卡 第一步&#xff1a;打开克隆的虚拟机 第二步&#xff1a; 第三步 第四步&#xff1a; 最后&#xff1a; 之后执行reboot重启…

聊一聊 C++ 中的 namespace

一&#xff1a;背景 相信大家在分析 dump 时&#xff0c;经常会看到 WKS 和 SRV 这样的字眼&#xff0c;如下代码所示&#xff1a;00007ffa778a07b8 coreclr!WKS::gc_heap::segment_standby_list 0x0000000000000000 00007ffa778a3870 coreclr!WKS::qpf 0x989680 00007ffa778…

会议会展活动从业技能之会销流程的16个环节

会议营销是透过相对大型活动来实现销售。会议营销是细节营销&#xff0c;一般操作流程有会前、会中、会后三个阶段共计16个环节&#xff0c;每个环节都做到位了&#xff0c;衔接好了&#xff0c;会议营销的最终效果就会得到保证。一般而言&#xff0c;会议营销分为会前营销、会…

haproxy详细介绍

Haproxy是既可以工作在7层也能工作在4层的反代工具.Haproxy的功能:路由HTTP请求到后端服务器,基于cookie作会话绑定.能够将多个请求反代至后端主机完成负载均衡的效果.主服务器失败时能自动切换到备服务器上.接受特殊的端口连接完成服务监控拒绝新连接时不会关闭已经连接的请求…

《ASP.NET Core 6框架揭秘》实例演示[17]:利用IHttpClientFactory工厂来创建HttpClient

在一个采用依赖注入框架的应用中&#xff0c;我们一般不太推荐利用手工创建的HttpClient对象来进行HTTP调用&#xff0c;使用的HttpClient对象最好利用注入的IHttpClientFactory工厂来创建。前者引起的问题&#xff0c;以及后者带来的好处&#xff0c;将通过如下这几个演示程序…