存档

2016年1月 的存档

了解Poco C++ Poco::Data 数据库基本操作

2016/01/27 9,509

前言

POCO::Data 是Poco的数据库抽象层,为C++提供统一的结构化数据库访问接口,使得C++以简单而自然的方式访问关系型数据库。使用它可以方便地从多种数据库中存取数据。目前Poco::Data支持的数据库连接类型包括 SQLite,MySQL及ODBC。POCO框架支持扩展,所以你也可以添加其他的本地连接扩展。

下面是一个使用Poco::Data::SQLite的一个简单例子:

 

创建会话(Sessions)

通过Session 构造器可以创建Session:

这个例子创建了一个SQLite类型的session。

第一个参数是希望创建的Session类型,目前支持的连接类型有"SQLite","ODBC","MySQL"。

第二个参数是数据库连接字符串,根据不同的数据库使用不同的连接字符串:

  • 对于Sqlite数据库,数据库路径即可做为连接字符串
  • 对于ODBC数据库,连接字符串类似于 "DSN=MyDSNName".具体参数请参考ODBC驱动文档
  • 对于MySQL数据,连接字符串由一系列键值对组成,例如 "host=localhist;port=3306;db=mydb;user=thename;password=thepwd;compress=true;auto-reconnect=true";具体请教参MySQL官方文档。

存取数据

单数据集

假设我们有一个表 tbA,表中有一个字段 fN,插入记录时我们可以这么写:

是不是很简单。然而这种写法并不提倡,我们有更好的方式:占位符!使用占位符(placeholders)可以匹配变量和占位符,在执行语句时自动用变量替换占位符。普遍公认的占位符是问号(?),有些数据库也使用冒号(:)来做占位符。具体使用哪一种,请参考所选用数据库的说明文档。

那么上面的例子可以写做:

此例中使用use(name)来匹配占位符。use是Poco::Data::Keywords下提供的关键字,可以将变量和占位符绑定(Binding)。这么做真正的意义,是将变量与SQL语句分隔开,防止SQL注入式攻击。

从数据库中取数据的操作与之类似。into关键字将数据库返回的值与C++对象匹配起来。并且支持指定默认值以防数据库返回null值。

此处需要注意的是,指定默认值的into,其定义为:into(T& t, const Position& pos, const T& def),使用的是模样类。在有些编译器下,不能隐式转换数据类型,所以需要显示的让第一个参数和第三个参数的数据类型保持一致。

into还可以和use联合使用:

当然,现实中的数据库不会总像例子中这么简单。在一个表中往往有多列,这样需要使用多次into/use关键字:

那么此时尤为重要的,就是into和use的顺序了。第一个占位符使用第一个use,第二个占位符使用第二个use,以此类推。into亦如是。

继续阅读

仿函数(function object,函数对象)

2016/01/12 6,936

引子

前一篇文章讲到了C++11的新特性lambda表达式

lambda表达式的本质是什么呢?为探究这个问题,我们将一段写有lambda表达式的代码反编译,可能会发现一些秘密.

首先写段程序:

在调试该代码时我们打开汇编视图,发现如下代码:

其中 <$_0::operator()(int, int) const>      即对应原代码中的lambda表达式。这里一串重载了"()"(operator())操作符的代码,即本文将要了解的仿函数

Note:  此处的 const  ,也应证了前文 mutable 可变范围 中提到的,lambda的调用运算符为"const-by-value"的

  定义

仿函数(finctor)是一种早期的叫法,在C++11中,标准的叫法为函数对象(function object)。仿函数是一种行为类似函数、具有函数特性的对象。

仿函数是一个对象,而不是函数。仿函数的类通过重载函数操作符"()"(operator())来实现函数调用的特性。

通过下面的例子来简单说明如何使用仿函数

这个例子中,lineA声明了一个对象。这是一个函数对象,其类(结构)定义在functional文件中,是STL内置的模板类。该类用于比较两个参数的大小。

lineB则像函数一样直接给该对象传入两个参数。

lineC是另一种写法。greater<int>() 声明了一个临时对象,然后传入参数(3,4)调用该临时对象。这种写法往往比lineB更加简洁。在STL源码里大量使用了这种写法。

lineD则是使用自定义的函数对象。

Note:lineB中使用了boolalpha,是iostream提供的一个操作符,这将使此后的标准输出中,将bool值输出为"true"或"false",而不是1/0。于其相反的操作为noboolalpha.

继续阅读

lambda 表达式

2016/01/11 7,411

LAMBDA简介lambda

从C++11开始,c++开始支持lambda表达式。

lambda用来创建一个可以捕获作用域内变量的匿名函数对象的闭包。这通常用来封装传递给算法或异步方法的少量代码块。

例如,简单实现一个Trim函数,去除字符串里的空格:

此例中,

即是一个lambda表达式。其做为一个匿名函数,被算法  for_each 使用,使得代码更简洁。

继续阅读