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 ...
随机推荐
- 图——拓扑排序(uva10305)
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
- 在线图片压缩后以ImageIO 流的形式 设置大小显示指定页面
1.Servlet 代码 public class ZoomImgServlet extends HttpServlet implements Servlet { public void init ...
- MYSQL MHA
MYSQL MHA 简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于 Face ...
- snmp学习笔记
snmp5.5 client 包含头文件 #include <net-snmp/net-snmp-config.h> #include <net-snmp/net-snmp-incl ...
- checkbox和文字对齐
<style type="text/css"> input{vertical-align:middle; margin-top:0;} </style>
- Mac上开启Web服务
$ sudo apachectl start$ httpd -v /Library/WebServer/Documents
- Android中SQLite数据库小计
2016-03-16 Android数据库支持 本文节选并翻译<Enterprise Android - Programing Android Database Applications for ...
- 剑指Offer面试题:34.翻转单词顺序VS左旋转字符串
一.题目一:翻转单词顺序 1.1 题目说明 题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a st ...
- MySQL 提高Insert性能
插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: 连接:(3) 发送查询给服务器:(2) 分析查询:(2) 插入记录:(1x记录大小) 插入索引:(1x索引) 关闭:(1) 这不考虑打开 ...
- The Hacker's Guide To Python 单元测试
The Hacker's Guide To Python 单元测试 基本方式 python中提供了非常简单的单元测试方式,利用nose包中的nosetests命令可以实现简单的批量测试. 安装nose ...