mysql 获取结果_【原创】7. MYSQL++中的查询结果获取(各种Result类型)

在本节中,我将首先介绍MYSQL++中的查询的几个简单例子用法,然后看一下mysqlpp::Query中的几个与查询相关的方法原型(重点关注返回值),最后对几个关键类型进行解释。

1. MYSQL++的查询实例

下面的两个例子分别是STORE(所有数据一次性从服务器拉到本地缓存)和USE(将数据一条一条从服务器拉到本地)的使用方式,其中STORE内部实质就是mysql_store(

),而USE实质就是调用了mysql_use( )。

说明,下面的例子虽然使用的都是最为基本的查询过程(即没有使用template

sql或者SSQLS),但是这个并不影响我们的讨论,因为遍历结果集的过程是一致的。

STOREmysqlpp::Query query = conn.query("select item from stock");

mysqlpp::StoreQueryResult res = query.store();

mysqlpp::StoreQueryResult::const_iterator it;

for (it = res.begin(); it != res.end(); ++it)

{

mysqlpp::Row row = *it;

// 第一列 row[0]

// 第二列 row[1]

}

USEmysqlpp::Query query = conn.query("select * from stock");

mysqlpp::UseQueryResult res = query.use();

while (mysqlpp::Row row = res.fetch_row())

{

row["item"];

row["num"];

}

// Check for error:

// can‘t distinguish "end of results" and

// error cases in return from fetch_row() otherwise

if (conn.errnum())

{

cout << "Error in fetch_row";

}

从上面的两个例子中我们大致可以看出来,整个结果集的查询过程就是针对相匹配的Result类型,找到ROW,然后逐行或者跳跃着查找。

2.

Result相关类型的使用场合

首先让我们回顾mysqlpp::Query中提到的几个方法,以及他们的返回值。以下部分内容直接摘自关于mysqlpp::Query的介绍的内容。

为了讲述方便,我们先来看一下在result.h(Declares classes for holding information about SQL

query)中所定义的各种类型的关系。这几个类型后面会仔细说明。

9fe9ed973c843feb38e4cef276bbb129.png

1)bool mysqlpp::Query::exec(const std::string& str);

这里返回的是bool,表示的是“语句是否执行成功”,我认为适合于那种update,

delete,insert,且都不关心有多少rows被touch的情况。

2)SimpleResult mysqlpp::Query::execute();

这里的SimpleResult正如其名,其中只有如下信息

the last value used for an AUTO_INCREMENT field

(ulonglong insert_id() const)

the number of rows affected by the query(ulonglong rows( ) const)

any additional information about the query returned by the server(const

char* info( ) const)

3)UseQueryResult mysqlpp::Query::use();

由于use的语义类似于使用游标,也就是支持一行一行地拉出内容,所以UseQueryResult 也就自然而然地支持一些关于fetch

row的功能。

4)StoreQueryResult mysqlpp::Query::store();

StoreQueryResult它本身就是从vector继承而来,所以它就是vector。所以用户程序可以直接使用下标的形式来获取所有的ROW。这也就是说在这个store之后,所有的ROW的内容都在了这个vecor里面了。

3.

Result相关类型解析

与Result相关的类型主要集中在result.h和result.cpp。

1) SimpleResult

这个类型非常简单,是一个比较单纯的类型,并没有父类。主要的成员变量有3个,分别是

// last value used for an AUTO_INCREMENT field

ulonglong insert_id_;

// the number of rows affected by the query

ulonglong rows_;

// any additional information about the query returned by the server

std::string info_;

成员方法也比较单纯,就是对上述几个字段的GET,构造函数就是对上述几个字段的SET。

以SimpleResult mysqlpp::Query::execute();为例,让我们来看一下MYSQL++是如何设置这个SimpleResult。

0e1931d4eed6004dec7ffb4d3a2be424.png

再来看一下Query::insert_id( ), Query::affected_rows( ), Query::info(

),这几个方法都直接delegate DBDriver的相关函数,直接返回了结果而已。

2) ResultBase

这个类型是StoreQueryResult和UseQueryResult的父类型,该类型其实没有特别的含义,只是作为一个common

methods的container而已。但是该类型提供的几乎所有的public methods都是和fields有关的,包括了

根据index查找field;

根据name查找field;

根据index查找到field的名字和属性类型;

获取当前所在的field(ResultBase内部会有一个mutable的index名为current_field_用于指明当前fetch_field的是哪一个field,在fetch_field中该index会自增)

该类型的核心成员有如下几个

Fields(std::vector) 类型的 fields_

FieldNames (继承自std::vector<: string>)类型的 names_

FieldTypes ( 继承自std::vector)类型的types_

其中FieldNames和FieldTypes都是被RefCountedPointer包裹着,估计这样做能够节省空间。关于Field类型在后续进行介绍。至于刚才说的几个找field的操作,看着这几个核心成员的类型还是比较好理解的。不就是在vector中不找。

需要额外关注的是以下这个最主要的构造函数

c20691f4816dc67bcdcb6dcadf461f96.png

以下几点需要注意,

names_和types_在new出来之后是不需要显式delete的,因为他们都在智能指针RefCountedPointer包裹着。

成员初始化列表中的 fields_(Fields:: size_type(…)) 这一句其实调用的是

explicit std::vector::vector (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());

从以上构造函数可以看到,其实关于Field的信息还是从DBDriver中拿到的,然后关于FieldNames和FieldTypes的信息,则是通过这两个类型自身的构造函数给实现的(其实就是收到ResultBase*,然后遍历其中的成员变量

fields_ 再各求所需罢了。

为什么要有重新将指示field_当前index的指针重置的过程(dbd->field_seek(res,

0))?这是因为方便这个DBDriver再次循环访问这些fields。

3) StoreQueryResult

该类型是同时集成了ResultBase和vecor类型(请注意了,这个Result居然是一个vecor!)文档中说,该类型hold

results from a SQL query that returns rows: a specialization of std::vector

holding Row objects in memory so you get random-access semantics.

说白了,该类型在继承了ResultBase之后,只有以下这个构造函数是比较要紧的了。

01627ce8aa78c7ad45c31f6aea42f96b.png

有以下几点需要说明

StoreQueryResult继承自std::vector

在成员初始化列表中,首先调用ResultBase的构造函数

list_type是std::vector的typedef,所以在list_type(…)这一行,直接根据DBDriver返回的结果的rows的数量就布置好了vector的长度。

MYSQL_ROW是MYSQL自带的结构类型(定义域mysql.h中,typedef char **MYSQL_ROW;)

dbd->fetch_row(MYSQL_RES*)应该只是包装了mysql_fetch_row(MYSQL_RES*)这个MySql C

API,而dbd->fetch_lengths(MYSQL_RES*)其实包装的是mysql_fetch_lengths(MYSQL_RES*)这个MYSQL

C API,他获取的是整个row的对应的所有field的长度。

这一次Query的结果在全部拷贝完之后就释放了(dbd->free_result(res);)

如此一来,所有我们需要的信息都通过构造一个mysqlpp::Row对象来实现了。关于mysqlpp::Row的具体说明请看下文。

4) UseQueryResult

该类型拓展于ResultBase类型。根据MYSQL++ user

document的说法,UseQueryResule适用于For these large result sets,a “use” query tells the

database server to send the results back one row at a time, to be processed

linearly.

该类型的方法比StoreQueryResult丰富多了,主要体现在:

可以顺序读取行(mysqlpp::Row fetch_row() const;或者MYSQL_ROW fetch_raw_row()

const;)

可以获取当前行的各个field的信息(const Field& fetch_field() const; const Field&

fetch_field(Fields::size_type i) const)

可以获取当前行的所有fields的长度(const unsigned long* fetch_lengths() const;)

值得注意的是,UseQueryResult有一个成员变量mutable RefCountedPointer result_;

需要强调的有两点

MYSQL_RES是 MYSQL C API

中的用于做为资源的结构体,获取一行的函数mysql_fetch_one_row的参数就是MYSQL_RES*

RefCountedPointer是一个智能指针,但是就在定义这些result类型的result.h中,作者将其针对MYSQL_RES进行了具化,即

3706cfd924a56181ce0e44d239107b44.png

很显然,这个是为了在ref

count为0时自动调用析构器而准备的,该Destroyer使用mysql_free_result来销毁这里的result_,从而代替默认的delete操作。

接下来,我们来具体看几个函数的实现。

构造函数

d23479f07982580a24aecaa7f29225a4.png

获取fields的信息

38c601734437264f1835f9197317c530.png

83b801008087f6ddceab8f58615e7666.png

请注意,这个result_是一个RefCountedPointer,所以调用的raw方法将会返回MYSQL_RES*

获取一行数据

核心的做法就是利用MYSQL_ROW  DBDriver::fetch_row(MYSQL_RES* res)

const。其实质也就是调用了mysql_fetch_one_row( )这个C API。然后直接生成一个mysqlpp::Row对象,返回。

0873cd754866fc31b6381b47fde36b62.png

原文:http://www.cnblogs.com/aicro/p/3633506.html

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

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

相关文章

Error loading WebappClassLoader

Error: 严重: Error loading WebappClassLoader context: /oa.myeclipse.bak delegate: false repositories: /WEB-INF/classes/----------> Parent Classloader:org.apache.catalina.loader.StandardClassLoader3bc473 org.apache.struts.action.ActionServletjava.l…

python内置函数返回序列中最大元素_Python之路(第八篇)Python内置函数、zip()、max()、min()...

一、python内置函数abs()求绝对值例子print(abs(-2))all()把序列中每一个元素做布尔运算&#xff0c;如果全部都是true&#xff0c;就返回true,但是如果是空字符串、空列表也返回true例子print(all([1,2,1,]))输出结果False例子2print(all())输出结果Trueany()把序列中每一个元…

Rds基于mysql开发的_开发云数据库RDS MYSQL版讲解

前言 这篇文章适合所有的 C# 开发新手、老鸟以及想准备学习开发 C# 的程序猿。.NET Core是一个开源通用的开发框架&#xff0c;支持跨平台, 阿里云函数计算推出了 dotnetcore2.1 runtime&#xff0c; 使用 C# 编写 serverless 函数, 详情见官方文档&#xff1a;C# 函数入口. 在…

C# Action

C# Action 的一般用法 最近在看汤姆大叔的JavaScript教程&#xff0c;总结的相当好&#xff0c;可惜自己功力尚浅不能把学到的融会贯通。看过今天大叔发的一篇博文&#xff0c;在js的回调函数中想到了一点关于Action的用法。 发一段简单不能在简单的程序 1 class Program 2 …

浮动div,回到顶部

<div style"height: 5000px">这是顶部</div> <div id"FloatDIV" style"position: absolute;top: 0px; z-index:9999; background: #fff000;cursor: pointer"onclick"window.scrollTo(0,0);">回到顶部 </div>&…

通过图片 找到桌面相同图片区域坐标_【Axure RP9原型案例】京东与淘宝的商品图片是如何被放大的...

摘要&#xff1a;在电商的商品详情页中我们经常会看到图片放大器的运用&#xff0c;我们以京东商品详情页为例来制作这样的原型效果。案例中综合运用了鼠标移入事件、鼠标移动事件&#xff0c;元件的移动、元件的显示/隐藏等交互动作。京东示意图观察交互首先我们观察京东详情页…

ref的mysql_ref:Mysql授权远程登陆

在Windows环境上操作。步骤如下&#xff1a;1. 打开cmd窗口&#xff0c;登陆mysqlmysql -uroot -p1234562.使用mysql数据库use mysql3.查看结果中host一行中是否有%,如果有%&#xff0c;此行用户名允许远程登录。下图所示&#xff0c;白色框中表示允许远程登录的账号&#xff1…

每当处于窘境时,想想当初坚持的理由

突然间想起了关于信仰的话题&#xff0c;自己不想很多伟大和强悍的人&#xff0c;有着坚忍不催的信仰&#xff0c;很多事想做就不顾后果的做了&#xff0c;常常会弄得最后一塌糊涂甚至后悔莫及&#xff0c;回想伴着ACM一路渴磕磕碰碰&#xff0c;走走停停&#xff0c;最终却是一…

mysql 5.7.4 m14_win7 64位下如何安装配置mysql-5.7.4-m14-winx64(安装记录)

1. mysql-5.7.4-m14-winx64.zip下载官方网站下载地址&#xff1a;http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.17-winx64.zip2、解压到D:\mysql.(路径自己指定)3、在D:\mysql\mysql-5.7.4-m14-winx64下新建my.ini配置文件内容如下&#xff1a;#################…

python中的sorted是什么意思_python中sort与sorted区别

1、sort()函数 (只对list有用)sort(...)L.sort(key None,reverseFalse)key 函数 这个函数会从每个元素中提取一个用于比较的关键字。默认是Nonereverse True/False (默认是False升序&#xff1b;True&#xff1a;降序)作用&#xff1a;对原序列进行排序&#xff0c;也就是直…

怎样在wp7中检测“主题背景”

由于Windows Phone 可以使用深色&#xff08;黑色&#xff09;或淡色&#xff08;白色&#xff09;主题&#xff0c;知道用户的主题以确定你的应用程序的颜色模式是很重要的一件事。 XAML <Grid x:Name"LayoutRoot" Background"Transparent"><Sta…

mysql执行计划中的temp_MYSQL语句调优:GROUP BY ORDER BY语句中出现USING TEMPATORY

CREATE TABLE WCC_BYPrice (BPRID int(11) NOT NULL AUTO_INCREMENT,PRID int(11) NOT NULL COMMENT 价格表主键,PKID int(11) NOT NULL COMMENT 商品表主键,BRID mediumint(8) NOT NULL COMMENT 品牌id,STID mediumint(8) NOT NULL COMMENT 商家id,CRCode varchar(8) DEFAULT …

json格式校验并显示错误_使用postman做自动化接口校验

要想实现接口的自动化测试&#xff0c;需要以下几个步骤&#xff1a;自动登录首先点击postman左上角的new按钮&#xff0c;创建一个collection&#xff0c;在pre-request-scripts标签下&#xff0c;给整个collection创建一个公用规则编写登录脚本pre-request-scripts在请求发送…

前端学习(2906):Vite 解决了 Webpack 哪些问题

随着项目的复杂度升级&#xff0c;代码规范和管理就必须要同步提升。于是&#xff0c;编程社区中提出了多种模块化规范&#xff0c;服务端选择了 CommonJS 规范&#xff0c;客户端选择 AMD 规范较多&#xff0c;但是&#xff0c;两种模块化规范也都存在一定的问题&#xff0c;都…

wpf 去除按钮点击时会画一个点线的矩形

wpf 去除按钮点击时会画一个点线的矩形 最近在研究wpf&#xff0c;啥都不懂&#xff0c;特把自己查到的有用东西&#xff0c;收集一下&#xff1a;<Pagexmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.…

tfidf算法 python_tf–idf算法解释及其python代码实现(下)

tf–idf算法python代码实现这是我写的一个tf-idf的简单实现的代码&#xff0c;我们知道tfidftf*idf&#xff0c;所以可以分别计算tf和idf值在相乘&#xff0c;首先我们创建一个简单的语料库&#xff0c;作为例子&#xff0c;只有四句话&#xff0c;每句表示一个文档copus[我正在…