Notice: Function wp_enqueue_script was called incorrectly. Scripts and styles should not be registered or enqueued until the wp_enqueue_scripts, admin_enqueue_scripts, or login_enqueue_scripts hooks. This notice was triggered by the jquery handle. Please see Debugging in WordPress for more information. (This message was added in version 3.3.0.) in /mnt/webroot/wandoer/code.wandoer/wp-includes/functions.php on line 6260
POCO C++ – 豌豆

标签: POCO C++

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

    前言

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

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

    #include "Poco/Data/Session.h"
    #include "Poco/Data/SQLite/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()
    {
        //注册SQLite连接器
        Poco::Data::SQLite::Connector::registerConnector();
    
        // 创建传话 session
        Session session("SQLite", "sample.db");
    
        // 删除表
        session << "DROP TABLE IF EXISTS Person", now;
    
        // 网创建表
        session << "CREATE TABLE Person (Name VARCHAR(30), Address VARCHAR, Age INTEGER(3))", now;
    
        // 插入记录
        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;
        }
    
        return 0;
    }

     

    创建会话(Sessions)

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

    Session session("SQLite","./sample.db");

    这个例子创建了一个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,插入记录时我们可以这么写:

    std::string name="wandoer"; 
    session << "INSERT INTO tbA VALUES("<<name<<")",now;

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

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

    std::string name="wandoer"; 
    session << "INSERT INTO tbA VALUES(?)",use(name), now;

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

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

    std::string name; 
    session << "SELECT fN FROM tbA",into(name),now;
    session << "SELECT fN FROM tbA",into(name,0,std::string("default")),now;

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

    into还可以和use联合使用:

    std::string name;
    std::string match="wandoer";
    session << "SELECT fN FROM tbA WHERE fN=?",into(name),use(match),now;

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

    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和use的顺序了。第一个占位符使用第一个use,第二个占位符使用第二个use,以此类推。into亦如是。

    (更多…)