[poco] 访问数据库

From: https://blog.csdn.net/hl2015222050145/article/details/52335422?utm_source=blogxgwz6

poco访问数据基本步骤:
a.  创建会话(session)

b. 从DB中读写数据
c. 使用statements

d. 使用容器(Collection) (数据,集合...)
e. 使用limit限定
f. 如何使用复杂的数据类型(如何将一个C++对象映射到数据库的表

创建会话:Session create(const std::string& connectorKey, const std::string& connectionString);
参数1:SQLite;MySQL;或者ODBC,ODBC支持Oracle, SQLite, DB2, SQLServer和PostgreSQL。
参数2:就是数据库文件的路径或者连接字符

基本操作(增删查改):

增:

    std::string aName("Peter");
    ses << "INSERT INTO 表名 VALUES(" << aName << ")", now;
    或者ses << "INSERT INTO 表名 VALUES(?)", use(aName), now;


查:


一般查找

    std::string aName;
    ses << "SELECT NAME FROM FORENAME", into(aName), now; // aName的默认值为空字符串
    ses << "SELECT NAME FROM FORENAME", into(aName, "default"), now;


匹配查找  先into后use  且不能使用常量 如:4

    std::string aName;
    std::string match("Peter")
    ses << "SELECT NAME FROM FORENAME WHERE NAME=?", into(aName), use(match), now;
    poco_assert (aName == match);


多字节匹配查找

    std::string firstName("Peter";
    std::string lastName("Junior");
    int age = 0;
    ses << "INSERT INTO PERSON VALUES (?, ?, ?)", use(firstName), use(lastName), use(age), now;
    ses << "SELECT (firstname, lastname, age) FROM Person", into(firstName), into(lastName), into(age), now;


into语句允许定义一个默认值,主要针对数据库查询里面包含空时候

    ses << "SELECT (firstname, lastname, age) FROM Person", into(firstName), into(lastName), into(age, -1), now;
 
改:
    session << "update Person set Address = ? WHERE Name= ?", use(addr),use(name),now;


使用Statements:

用于保存SQl语句,使得多次查询。

    std::string aName("Peter");
    Statement stmt = ( ses << "INSERT INTO FORENAME VALUES(?)", use(aName) );//括号必须


或者
    Statement stmt(ses);
    stmt << "INSERT INTO FORENAME VALUES(?)", use(aName);
eg:

    std::string aName("Peter");
    Statement stmt = ( ses << "INSERT INTO FORENAME VALUES(?)", use(aName) );
    .
    .
    stmt.execute();
    poco_assert (stmt.done());


容器使用:

默认支持以下容器类:
a. vector(数组): 无特别要求
b. set: 类型需要支持<操作符,注意:重复的key/value将忽略
c.  multiset: 需支持<操作符
d. map: 需支持()操作符,并且按key返回对象,注意:重复的key/value将忽略
e. multimap: 需支持()操作符,并按key返加对象.

        std::vector<std::string> names;
        ses << "SELECT NAME FROM FORENAME", into(names), now;


Limit限定:针对查询结果的个数限定

        std::vector<std::string> names;
        ses << "SELECT NAME FROM FORENAME", into(names), limit(50), now;
以上代码将只返回50行的数据。(当然也可能什么都不返回),并追加到 names这个容量中。如果想确保50行记录返回,需要设置limit的第二参数为true(默认为false):
        std::vector<std::string> names;
        ses << "SELECT NAME FROM FORENAME", into(names), limit(50, true), now;
        Statement stmt = (ses << "SELECT NAME FROM FORENAME", into(aName), lowerLimit(1), upperLimit(10));//限制范围
        Statement stmt = (ses << "SELECT NAME FROM FORENAME", into(aName), range(1,10));


类作为保存变量:这个就是将自定义类作为容器查询

        namespace Poco 
        {
            namespace Data
                 {
                    template <>
                    class TypeHandler<class Person>
                        {
                            .....
                        }
                }
        }


记录集(RecordSet)

a. 遍历数据表中所有的行与列
b. 获取各列的元信息,比如名称,类型,长度等.

            Statement select(session);
            select << "SELECT * FROM Person";
            select.execute();
            RecordSet rs(select);


遍历结果:


            bool more = rs.moveFirst();
            while (more)
            {
                for (std::size_t col = 0; col < cols; ++col)
                {
                    std::cout << rs[col].convert<std::string>() << " ";
                }
                std::cout << std::endl;
                more = rs.moveNext();
            }


Tuples:在数据库中的列类型已知的情阅下,Poco::Tuple以及Tuple数组提供了更简便的方法获取数据。

            typedef Poco::Tuple<std::string, std::string, int> Person;
            typedef std::vector<Person> People;
 
            People people;
            people.push_back(Person("Bart Simpson", "Springfield", 12));
            people.push_back(Person("Lisa Simpson", "Springfield", 10));
 
            Statement insert(session);
            insert << "INSERT INTO Person VALUES(?, ?, ?)",
            use(people), now;
 
            当然,tuple也可以用于查询:
            Statement select(session);
            select << "SELECT Name, Address, Age FROM Person", into(people),  now;
 
            for (People::const_iterator it = people.begin(); it != people.end(); ++it)
            {
                std::cout << "Name: " << it->get<0>() <<
                ", Address: " << it->get<1>() <<
                ", Age: " << it->get<2>() <<std::endl;
            }

参考链接:http://pocoproject.org/docs/00200-DataUserManual.html


 测试代码:

#include "Poco/Data/Session.h"
#include "Poco/Data/MySQL/Connector.h"
#include <vector>
#include <iostream>
 
 
using namespace Poco::Data::Keywords;
using Poco::Data::Session;
using Poco::Data::Statement;
 
 
struct Person
{
    std::string name;
    std::string address;
    int         age;
};
 
 
int main(int argc, char** argv)
{
    Poco::Data::MySQL::Connector::registerConnector();
 
    // 创建 session
    Session session("MySQL", "host=127.0.0.1;port=3306;db=demo;user=admin;password=admin;compress=true;auto-reconnect=true");
 
    // 删除已存在的表
    session << "DROP TABLE IF EXISTS Person", now;
 
    // 创建新表
    session << "CREATE TABLE Person (Name char(20),Address char(30) ,Age integer)", now;//varchar 会报错
    // 插入数据
    Person person =
    {
        "Bart Simpson",
        "Springfield",
        12
    };
 
    Statement insert(session);
    insert << "INSERT INTO Person VALUES(?, ?, ?)",
        use(person.name),
        use(person.address),
        use(person.age);
 
    insert.execute();
 
    person.name = "Lisa Simpson";
    person.address = "Springfield";
    person.age = 10;
 
    insert.execute();
 
    //查询数据
    Statement select(session);
    select << "select Name, Address, Age FROM Person",
        into(person.name),
        into(person.address),
        into(person.age),
        range(0, 1); //  只查询前两行
 
 
    while (!select.done())
    {
        select.execute();
        std::cout << person.name << " " << person.address << " " << person.age << std::endl;
    }
 
    std::string addr = "hubeilichuan";
    std::string name = "Lisa Simpson";
 
    session << "update Person set Address = ? WHERE Name= ?", use(addr),use(name),now;
    // 另一种查询方式
    std::vector<std::string> names;
    session << "SELECT Address FROM Person",
        into(names),
        now;
 
 
    for (std::vector<std::string>::const_iterator it = names.begin(); it != names.end(); ++it)
    {
        std::cout << *it << std::endl;
    }
    getchar();
    return 0;
}


测试工程链接:http://download.csdn.net/detail/hl2015222050145/9614574

编译好的动态库链接:http://download.csdn.net/detail/hl2015222050145/9614205
 

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

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

相关文章

应对不良网络文化的技术之一——网络信息抽取技术

1 引言 2008年1月17日&#xff0c;中国互联网络信息中心(CNNIC)发布了《第21次中国互联网络发展状况统计报告》[1]&#xff0c;报告显示&#xff1a; (1) 截至2007年12月&#xff0c;网民数已增至2.1亿人。中国网民数增长迅速&#xff0c;比2007年6月增加4800万人&…

最安全的js类型检测

众所周知js内置的类型检测机制不可靠&#xff0c;比如typeof操作符&#xff0c;对于正则和数组检测时返回值都是object&#xff0c; 而使用instanceof检测类型时&#xff0c;虽然可以对正则和数组正常验证&#xff0c;但验证undefined会报错&#xff0c;还有对于Symbol无法验证…

HBuilder完成webApp入门(2)

一、HBuilder的下载地址&#xff1a;http://www.dcloud.io/&#xff0c;点击那个“DownLoad”就可以 了 二、假设一切顺利&#xff0c;启动HBuilder后&#xff0c;大家会看到如下的界面 点击新建移动APP&#xff1a; 接下来就会弹出一个选择模板的对话框&#xff1a; 默认的模板…

js防篡改对象之不可扩展对象

const person {name: 啦啦德玛西亚}console.log(Object.isExtensible(person))//true//使用Object.preventExtensions()可以将对象修改为不可扩展对象&#xff0c;无法再给对象添加属性和方法Object.preventExtensions(person)//使用Object.isExtensible()方法可以确定对象是否…

高可用集群 heartbeatv1实例

——————— 高可用集群的简单配置 ————————地址规划 主节点&#xff1a;HA1 172.16.21.13 hostname node2.magedu.com备节点&#xff1a; HA2 172.16.21.14 hostname node1.magedu.comVIP 172.16.21.9前提工作1&#xff0c;配置主机名 hostname保证uname …

你知道“拉黑”、“关注”、“点赞”、“转发”、“分享到朋友圈”等英语咋说吗?

From: https://www.sohu.com/a/220161051_559507 “分享到朋友圈”等英语咋说吗&#xff1f; Mini apps 小程序 小程序”&#xff08;mini apps&#xff09;是一个不需要下载安装就可使用的应用&#xff08;apps that can be accessed without downloading&#xff09;&#x…

C#进化史

C#进化史 C#进化史从数据类型看C#演化C# 1写的产品类C# 强类型集合——解决限制1和2c# 自动属性——解决限制3c# 4 命名实参C# 1~C# 4的演变历程排序C# 1——提供一个IComparer实现C# 2——泛型比较器C# 3——Lambda表达式、扩展方法C# 1~C# 3简化排序的历程查询集合C# 1——循…

防篡改对象之密封对象

const person {name: 啦啦德玛西亚}console.log(Object.isExtensible(person))// trueconsole.log(Object.isSealed(person))// false// 使用Object.seal()将对象修改为密封对象// 密封对象不可扩展&#xff0c;而且已有成员的[[Configurable]]特性将被设置为false// 意味着不…

配套自测连载(三)

接上期(答案已给出)本期是专门针对《深入理解计算机网络》图书第4章而编写的10道计算机网络体系架构中的物理层技术自测题&#xff0c;可以检验你对本章的学习效果。把你的答案直接写在评论中即可&#xff0c;笔者将在每期发表10天后给出正确答案。本书是国内最通俗、最系统的计…

[json] JSON for Modern C++

有幸能接触到这个&#xff0c;这是我遇到的使用最方便的json了&#xff0c;效率没研究过&#xff01; 简单了使用了下&#xff0c;感觉非常好用&#xff0c;记录下&#xff1a; 要使用这个json&#xff0c;只需要使用json.hpp就行&#xff0c;放入自己的工程里&#xff0c;但…

面向对象的需求分析方法

面向对象的需求分析方法 面向对象的需求分析方法的核心是利用面向对象的概念和方法为软件需求建造模型。它包含面向对象风格的图形语言机制和用于指导需求分析的面向对象方法学。 面向对象的思想最初起源于 20世纪 60年代中期的仿真程序设计语言Simula67。20世纪80年代初出现的…

js防篡改对象之冻结对象

const person {name: 啦啦德玛西亚,_job: 无业}Object.defineProperty(person, job, {get: function() {return this._job},set: function(newValue) {this._job newValue}})console.log(Object.isFrozen(person))// false//使用Object.freeze()将对象修改为冻结对象&#xf…

libinject的编译

libinject是一个Android进程注入实例&#xff0c;其下载地址为&#xff1a;http://download.csdn.net/download/ljhzbljhzb/3680780 libinject的编译需要NDK开发环境&#xff0c;在NDK安装成功之后&#xff0c;可以先将其自带的实例中的HelloJni导入到eclipse中&#xff0c;编译…

Boost - 序列化 (Serialization)

From: https://blog.csdn.net/zj510/article/details/8105408 程序开发中&#xff0c;序列化是经常需要用到的。像一些相对高级语言&#xff0c;比如JAVA, C#都已经很好的支持了序列化&#xff0c;那么C呢&#xff1f;当然一个比较好的选择就是用Boost&#xff0c;这个号称C准…

Linux Supervisor 守护进程基本配置

supervisor:C/S架构的进程控制系统&#xff0c;可使用户在类UNIX系统中监控、管理进程。常用于管理与某个用户或项目相关的进程。 组成部分supervisord&#xff1a;服务守护进程supervisorctl&#xff1a;命令行客户端Web Server&#xff1a;提供与supervisorctl功能相当的WEB操…

ES6使用object的is()方法比较两个值

此前js比较两个值是否相等时&#xff0c;一般使用 或 符号&#xff0c;我之前倾向使用后者&#xff0c;因为可以避免比较时触发强制类型转换&#xff0c;但某些情况使用 依然有问题&#xff0c;比如再比较NaN NaN时&#xff0c;返回的是false&#xff0c;需要使用isNaN()才能…

关闭子窗口 父窗口自动刷新

function clsoseForm(){window.opener.location.hrefwindow.opener.location.href; window.opener.location.reload();window.close();}转载于:https://blog.51cto.com/congwa/1199250

使用vue的sync修饰符进行子父组件的数据绑定

官方文档 父组件代码 <template><div><input type"button" value"我是父组件的按钮" click"show" /><!-- 在需要子组件修改的数据后加上.sync即可 --><child :isShow.syncisShow v-show"isShow" />&l…

三阶魔方还原公式

From: https://www.cnblogs.com/zqifa/p/mofang-1.html 1. 第二层棱块归位&#xff1a; 2. 顶层十字 3. 顶层棱中间块归位 这一步的目的是使顶层的4个棱中间块全部归位。 转动顶层(U)&#xff0c;若可以使一个棱中间块归位(如下图左&#xff0c;这里以[红-黄]块为例)&#x…

选项板概述

2019独角兽企业重金招聘Python工程师标准>>> 1、选项板概述 选项面板是一个包括一个或多个选项卡(Tab)&#xff0c;同一时刻只显示一个选项卡的这种用户界面。比如下图的IE选项设置界面中&#xff0c;就是一个选项板的应用&#xff0c;选项板上有“常规”、“安全”…