C++ 连接数据库的入口和获取列数、数据

这里不具体放出完整的程序,分享两个核心函数:

由于这里用到的函数是编译器自己的库所没有的,需要自己下载mysql.h库或者本地有数据库,可以去bin找到,放进去。

     前提,我自己的测试数据库是WampServe自带的mysql,曾经试过连接新浪云的,发现很坑,它里面的要放代码进去它空间才能连,不能在本机连,连接的输入形参全是它规定的常量!

第一个是连接数据库的:

      行内带有详细注释,皆本人的见解,有理解错的,求帮指出。

      再作简单介绍,之所有带有int返回类型,是因为一旦连接数据库失败就return 0 结束程序。

形参所输入的分别是 数据库地址、端口,本机的端口一般是3306、数据库名、用户名、密码,调用就能用了。

 1 int DateBase::init(const char* host, int port, const char* database, const char* user, const char* password){
 2     this->mysql_res = NULL;//再次先赋空,原因是init这函数可以在任意函数内使用,为了避免在它之前,有缓存读入导致出错,统一用init前,res为NULL
 3     my_bool opt_reconnect=1;//全局的“是”,用于是否开启一些功能
 4 
 5     mysql_init(&(this->conn));//初始化,这个是连库必须的函数,传入conn,把缓存存进去    
 6 
 7     mysql_options(&(this->conn), MYSQL_SET_CHARSET_NAME,(char *)"gbk");
 8     //库函数,mysql_options设置gbk字符码,,utf8会导致从库中取数据显示出乱码,
 9     //此函数的功能很大,第二个参数就是选择功能,这里是选择设置字符码,设置字符码还可以用query命令,只不过它更麻烦。
10         
11     mysql_options(&(this->conn), MYSQL_OPT_RECONNECT,(char *)&opt_reconnect);
12     //设置当mysql异常断开连接, 看第二个参数,reconne,就是重连。可自动重连,怎样测掉了呢?
13     //下面的real connect函数,连了之后,如果发现有丢失,就会联系它
14 
15     if(!mysql_real_connect(&(this->conn), host, user, password, database, port, NULL, CLIENT_MULTI_STATEMENTS|CLIENT_FOUND_ROWS)) {
16         //这个是连接函数,核心之一,可选参数很多,这里最后的是,允许进行其他操作,连接失败输出所有信息
17         cout<<host<<user<<password<<database<<port<<endl;
18         return 0;
19     }
20     //设置事务自动提交,1为启用自动提交
21     mysql_autocommit(&(this->conn), 1);
22 }

下面这个是在连接数据库成功后:

特别注意,用这个之前请确认你的mysql里面有数据表,否则会出错!

      用来获取数据库中表的列名,并且在依次、有顺序地输出列名后输出所有数据的函数。

      里面一样注释齐全,还不明白的请留言!有错的请留言告诉我咯。谢谢!

      请读者认清里面的函数,下作简介:

mysql_query(,) 这条是执行命令的,成功返回0,第一个参数是连库缓存变量,第二个是命令字符串;

mysql_store_result(),获取结果集,形参是连库缓存变量,返回值是mysql res 类型的结果集缓存变量;mysql_fetch_fields(),获取表中的列名字,它返回的是mysql filed类型的数组,用一次就能获取所有列名,用一循环即可输出所有!mysql_num_fields(),获取字段的数目,就是有多少列;mysql_fetch_row(),获取一行的数据,这是一行哦,但是,获取一行后会自动后移,所以用while最好!返回值是mysql row类型的变量
 1 void DateBase::show_db(){//总体显示一遍数据
 2     int i,j;
 3     MYSQL_FIELD *files;
 4     check();//调用chec函数,检查好用户表的存在与否
 5     //this->mysql_res=mysql_list_tables(&(this->conn),"user_1");
 6     if(mysql_query(&(this->conn),"select * from user_1;")!=0){//选出用户表的所有数据 * 表示所有
 7         cout<<"获取用户表信息出错!";
 8     }
 9     this->mysql_res=mysql_store_result(&(this->conn));
10     files=mysql_fetch_fields(this->mysql_res);//获得字段名 
11     for(i=0;i<mysql_num_fields(this->mysql_res);i++){//mysql_num_fields返回字段的数目
12         cout<<std::left<<std::setw(14);cout<<files[i].name;//对齐输出,setw函数是对齐用到的
13     }
14     cout<<"\n";
15     while(mysql_row=mysql_fetch_row(this->mysql_res)){//获取一行的数据
16          for(j=0;j<mysql_num_fields(this->mysql_res);j++){
17              if(mysql_row[j]==NULL){//防止内容为空,程序崩溃
18                  cout<<"null";
19              }
20              else
21                cout<<std::left<<std::setw(14);cout<<mysql_row[j];
22           }
23          cout<<"\n";
24     }
25     mysql_free_result(mysql_res);//这个是释放内存
26  }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏遊俠扎彪

C++ 的 Name Mangling

编程语言组织程序,都有一定的可见范围,比如Java的包、C/C++的文件。就像我们平时使用的文件夹一样,有了这些组织机制,变量、函数的命名在一定程度上就可以重复...

94400
来自专栏社区的朋友们

深入浅出 Nodejs( 三 ):Nodejs 核心模块机制

本篇教程关于Nodejs的核心模块机制,具体讲Nodejs核心模块的原理、C/C++扩展模块的原理、包、模块调用栈以及NPM。

1.3K00
来自专栏社区的朋友们

深度学习入门实战(三):图片分类中的逻辑回归

上一讲我们介绍了一下线性回归如何通过TensorFlow训练,这一讲我们介绍下逻辑回归模型,一句话说概括,逻辑回归就是多分类问题。

4.9K10
来自专栏开发与安全

从零开始学C++之模板(四):用模板实现单例模式(线程安全)、模板方式实现动态创建对象

一、用模板实现单例模式 在前面的文章中,用过多种方法实现单例模式,现在用模板方式来实现: 为了实现线程安全,需要在linux 下使用pthread_mutex_...

38700
来自专栏况鹰的专栏

关于Android图片资源瘦身的奇思妙想

替换掉系统的压缩算法。如果你不嫌麻烦和喜欢折腾的话可以在你的apk使用一下,效果还是非常显著的。

2.7K40
来自专栏Celebi的专栏

C/C++ 学习笔记五(结构体、字符与字符串)

工作中经常使用到C/C++,为对C有个比较深刻的了解,重新拾起学习C的任务。在看书的同时,记录下思考的过程,也记录下重要的知识点。

60400
来自专栏肖力涛的专栏

NLP 点滴 :文本相似度 (下)

在自然语言处理过程中,经常会涉及到如何度量两个文本之间的相似性,我们都知道文本是一种高维的语义空间,如何对其进行抽象分解,从而能够站在数学角度去量化其相似性。

1.2K20
来自专栏女程序员的日常

实现一个栈类,类似STL中的栈

1、思路讲解 stack集合类是一个简单的堆栈的实现。 这里有两个模板参数,T和size,T用于指定堆栈中的元素类型,my_size用于表示堆栈中项数的最大值。...

26610
来自专栏女程序员的日常

虚函数&多态

对于经常被问到的虚函数和多态的问题,发现百度百科回答得十分详细,所以自己在百度百科上的解释进行总结 一、虚函数 (1)虚函数简介:在某基类中声明为virtua...

24610
来自专栏遊俠扎彪

如何让你的程序支持管道输入

其实很简单,管道是通过stdin和stdout来传给程序的。

29900

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励