C++ 连接数据库的入口和获取列数、数据
这里不具体放出完整的程序,分享两个核心函数:
由于这里用到的函数是编译器自己的库所没有的,需要自己下载mysql.h库或者本地有数据库,可以去bin找到,放进去。
前提,我自己的测试数据库是WampServe自带的mysql,曾经试过连接新浪云的,发现很坑,它里面的要放代码进去它空间才能连,不能在本机连,连接的输入形参全是它规定的常量!
第一个是连接数据库的:
行内带有详细注释,皆本人的见解,有理解错的,求帮指出。
再作简单介绍,之所有带有int返回类型,是因为一旦连接数据库失败就return 0 结束程序。
形参所输入的分别是 数据库地址、端口,本机的端口一般是3306、数据库名、用户名、密码,调用就能用了。
 int DateBase::init(const char* host, int port, const char* database, const char* user, const char* password){
     this->mysql_res = NULL;//再次先赋空,原因是init这函数可以在任意函数内使用,为了避免在它之前,有缓存读入导致出错,统一用init前,res为NULL
     my_bool opt_reconnect=;//全局的“是”,用于是否开启一些功能
     mysql_init(&(this->conn));//初始化,这个是连库必须的函数,传入conn,把缓存存进去    
     mysql_options(&(this->conn), MYSQL_SET_CHARSET_NAME,(char *)"gbk");
     //库函数,mysql_options设置gbk字符码,,utf8会导致从库中取数据显示出乱码,
     //此函数的功能很大,第二个参数就是选择功能,这里是选择设置字符码,设置字符码还可以用query命令,只不过它更麻烦。
     mysql_options(&(this->conn), MYSQL_OPT_RECONNECT,(char *)&opt_reconnect);
     //设置当mysql异常断开连接, 看第二个参数,reconne,就是重连。可自动重连,怎样测掉了呢?
     //下面的real connect函数,连了之后,如果发现有丢失,就会联系它
     if(!mysql_real_connect(&(this->conn), host, user, password, database, port, NULL, CLIENT_MULTI_STATEMENTS|CLIENT_FOUND_ROWS)) {
         //这个是连接函数,核心之一,可选参数很多,这里最后的是,允许进行其他操作,连接失败输出所有信息
         cout<<host<<user<<password<<database<<port<<endl;
         return ;
     }
     //设置事务自动提交,1为启用自动提交
     mysql_autocommit(&(this->conn), );
 }
下面这个是在连接数据库成功后:
特别注意,用这个之前请确认你的mysql里面有数据表,否则会出错!
用来获取数据库中表的列名,并且在依次、有顺序地输出列名后输出所有数据的函数。
里面一样注释齐全,还不明白的请留言!有错的请留言告诉我咯。谢谢!
请读者认清里面的函数,下作简介:
mysql_query(,) 这条是执行命令的,成功返回0,第一个参数是连库缓存变量,第二个是命令字符串;
mysql_store_result(),获取结果集,形参是连库缓存变量,返回值是mysql res 类型的结果集缓存变量; mysql_fetch_fields(),获取表中的列名字,它返回的是mysql filed类型的数组,用一次就能获取所有列名,用一循环即可输出所有! mysql_num_fields(),获取字段的数目,就是有多少列; mysql_fetch_row(),获取一行的数据,这是一行哦,但是,获取一行后会自动后移,所以用while最好!返回值是mysql row类型的变量
 void DateBase::show_db(){//总体显示一遍数据
     int i,j;
     MYSQL_FIELD *files;
     check();//调用chec函数,检查好用户表的存在与否
     //this->mysql_res=mysql_list_tables(&(this->conn),"user_1");
     if(mysql_query(&(this->conn),"select * from user_1;")!=){//选出用户表的所有数据 * 表示所有
         cout<<"获取用户表信息出错!";
     }
     this->mysql_res=mysql_store_result(&(this->conn));
     files=mysql_fetch_fields(this->mysql_res);//获得字段名
     for(i=;i<mysql_num_fields(this->mysql_res);i++){//mysql_num_fields返回字段的数目
         cout<<std::left<<std::setw();cout<<files[i].name;//对齐输出,setw函数是对齐用到的
     }
     cout<<"\n";
     while(mysql_row=mysql_fetch_row(this->mysql_res)){//获取一行的数据
          for(j=;j<mysql_num_fields(this->mysql_res);j++){
              if(mysql_row[j]==NULL){//防止内容为空,程序崩溃
                  cout<<"null";
              }
              else
                cout<<std::left<<std::setw();cout<<mysql_row[j];
           }
          cout<<"\n";
     }
     mysql_free_result(mysql_res);//这个是释放内存
  }
C++ 连接数据库的入口和获取列数、数据的更多相关文章
- 如何在MyEclipse中通过hibernate使用jtds驱动连接数据库,并向数据库添加数据的方法
		
最近学习了下如何在MyEclipse中通过hibernate使用jtds驱动连接数据库,并向数据库添加数据的方法,虽然MyEclipse中自带了连接数据库的方法,我也尝试了下其他方法,如有不当之处请指 ...
 - POI中getLastRowNum() 和getLastCellNum()的区别 hssfSheet.getLastRowNum();//最后一行行标,比行数小1 hssfSheet.getRow(k).getLastCellNum();//获取列数,比最后一列列标大1
		
hssfSheet.getLastRowNum();//最后一行行标,比行数小1 hssfSheet.getRow(k).getLastCellNum();//获取列数,比最后一列列标大1
 - CListCtrl获取列数
		
CListCtrl获取列数 // m_List是一个CListCtrl CHeaderCtrl* pHeaderCtrl = m_List.GetHeaderCtrl();if(pHeaderCtrl ...
 - 2016/05/10   thinkphp 3.2.2   ①系统常量信息    ②跨控制器调用    ③连接数据库配置及Model数据模型层   ④数据查询
		
[系统常量信息] 获取系统常量信息: 如果加参数true,会分组显示: 显示如下: [跨控制器调用] 一个控制器在执行的时候,可以实例化另外一个控制,并通过对象访问其指定方法. 跨控制器调用可以节省我 ...
 - php连接数据库、创建数据库、创建数据表
		
<?php $con = mysql_connect("localhost", "root", "root"); if(!$con){ ...
 - 数据库中的记录通过servlet回显到jsp页面中(连接数据库或者查询參照:对数据进行增删改查)
		
我们常常会用到通过图书的名称来查询图书那么这种话我们也就会使用到从数据库中搜索出数据而且载入到自己的Jsp页面中 这种话我们须要将从数据库中获取到的数据放进响应中然后通过%=request.getAt ...
 - 如何解决python连接数据库编码问题(python传数据到mysql乱码)'ascii' codec can't encode _mysql_exceptions.OperationalError: (1366, "Incorrect string value:?
		
首先描述下问题: 在使用python计算出结果后将结果插入到mysql过程中,报如下错误.原因很好定位就是编码的问题.那么到底是编码哪里出了问题了呢? 报错如上: 排查顺序: 第一:python的编 ...
 - VIN码识别/车架号OCR识别:快速占领汽车后市场数据入口
		
大数据时代,企业在数据入口方面的竞争越来越激烈,这种对于入口级的大数据“争夺战”,让很多企业在数据挖掘和收集的技术方面开始加快更新速度. 在当前IT行业激烈竞争环境之下,对于入口产品的控制成为了大数据 ...
 - jsp+servlet+poi导出数据库中的数据
		
index.jsp: <a href="POIout">简单导出数据</a> <a href="POIoutTemplate"&g ...
 
随机推荐
- script async 和script defer的区别
			
浏览器对js文件的操作主要有两部分:下载和执行: js文件下载在有些浏览器中是并行的,在有些浏览器中是串行的,如:IE8.firefox3.chrome2都是串行下载的: 执行在所有浏览器中默认是阻塞 ...
 - linux一句话轻松提权
			
linux命令: [b@fuckks~]$ printf "install uprobes /bin/sh" > exploit.conf; MODPROBE_OPTI** ...
 - JVM垃圾收集器
			
JVM中垃圾的回收由垃圾收集器进行,随着JDK的不断升级,垃圾收集器也开发出了各种版本,垃圾收集器不断优化的动力,就是为了实现更短的停顿. 下面是7种不同的分代收集器,如果两个收集器之间有连线,则表示 ...
 - Jtable 表格按多列排序(支持中文汉字排序)
			
这两天公司让做一个Jtable表格的排序,首先按A列排序,在A列相等时按B列排序,B列相等时按C列排序,ABC三列可以任意指定,最多分三列,这样的一个需求.由于我是大神,所以必须做了出来.ok,不自恋 ...
 - bzoj3648: 寝室管理(环套树+点分治)
			
好题..写了两个半小时hh,省选的时候要一个半小时内调出这种题目还真是难= = 题目大意是给一棵树或环套树,求点距大于等于K的点对数 这里的树状数组做了一点变换.不是向上更新和向下求和,而是反过来,所 ...
 - Unity3D UGUI之ScrollView弹簧效果
			
unity3d版本5.3.2p4 UGUI中ScrollView包含Viewport(Content) ScrollView包含脚本.其Movement Type一共3个选项.Elastic就是弹簧效 ...
 - iPhone6/6 Plus兩款大屏智能機
			
蘋果終於順應時代潮流,於今年推出了iPhone6/6 Plus兩款大屏智能機.但很快就有人開始懷念老款iPhone的“一手掌控”,畢竟不是所有人都有一雙大手.不過近期就有傳言稱,蘋果將於明年重新推出一 ...
 - 省市县三级联动(jqurey+json)
			
1.效果图 2.联动js /** * jquery.choosearea.js - 地区联动封装 */ ; (function ($) { var choosearea = function (opt ...
 - Thrift-0.9.2编译安装
			
确定安装好了boost1.54以上 确定libevent版本大于1.0 只编译生成cpp库 ./configure --without-java --without-lua --without-pyt ...
 - 在windows上如何安装python web引擎jinja2
			
首先要把你的Python文件夹加到环境变量里头去.假设你的Python文件夹位于C:\Python34,那么你需要打开CMD并输入: SETX PATH "%path%;C:\Python3 ...