4. データベース利用の実装例

今回は、POCOでのデータベース利用の実装例を詳解します。
まず、参考情報のポインタを示します。
http://pocoproject.org/docs/00200-DataUserManual.html

英語サイトですが、データベースフレームワークの使い方を丁寧に説明しています。
英語を苦にしない人は、上記サイトを見てもらえればOKです。
でも、これだけだとこの記事が寂しすぎるので、MySQLでのCRUDのサンプルプログラムを紹介しておきます。

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "Poco/Tuple.h"
#include "Poco/Data/Common.h"
#include "Poco/Data/Session.h"
#include "Poco/Data/MySQL/Connector.h"
#include "Poco/Util/Application.h"
#include "Poco/Util/Option.h"
#include "Poco/Util/OptionSet.h"
#include "Poco/Util/HelpFormatter.h"
#include "Poco/Util/AbstractConfiguration.h"
#include <vector>
#include <iostream>
using namespace Poco::Data;
using Poco::Util::Application;
using Poco::Util::Option;
using Poco::Util::OptionSet;
using Poco::Util::HelpFormatter;
using Poco::Util::AbstractConfiguration;
using Poco::Util::OptionCallback;
typedef Poco::Tuple<std::string, std::string, int> Person;
typedef std::vector<Person> People;
class MysqlSample: public Application
    /// This sample demonstrates some of the features of the Poco::Data::MySQL class.
{
public:
    MysqlSample(): _helpRequested(false), _dbConnString("host=localhost;port=3306;user=test;password=test;db=test;compress=true;auto-reconnect=true")
    {
    }
protected:
    void initialize(Application& self)
    {
        loadConfiguration(); // load default configuration files, if present
        Application::initialize(self);
        // add your own initialization code here
    }
    void uninitialize()
    {
        // add your own uninitialization code here
        Application::uninitialize();
    }
    void reinitialize(Application& self)
    {
        Application::reinitialize(self);
        // add your own reinitialization code here
    }
    void defineOptions(OptionSet& options)
    {
        Application::defineOptions(options);
        options.addOption(
            Option("help", "h", "display help information on command line arguments")
                .required(false)
                .repeatable(false)
                .callback(OptionCallback<MysqlSample>(this, &MysqlSample::handleHelp)));
    }
    void handleHelp(const std::string& name, const std::string& value)
    {
        _helpRequested = true;
        displayHelp();
        stopOptionsProcessing();
    }
    void handleConfig(const std::string& name, const std::string& value)
    {
        loadConfiguration(value);
    }
    void displayHelp()
    {
        HelpFormatter helpFormatter(options());
        helpFormatter.setCommand(commandName());
        helpFormatter.setUsage("OPTIONS");
        helpFormatter.setHeader("A MysqlSample application that demonstrates how to use Poco::Data.");
        helpFormatter.format(std::cout);
    }
    int main(const std::vector<std::string>& args)
    {
        if (!_helpRequested)
        {
            // MySQLコネクタを登録します
            MySQL::Connector::registerConnector();
            // MySQLセッションを作成します。
            Session session(SessionFactory::instance().create(MySQL::Connector::KEY, _dbConnString));
            // もし存在していたら、サンプルテーブルを削除します。
            session << "DROP TABLE IF EXISTS Person", now;
            // サンプルテーブルを作成します。
            session << "CREATE TABLE Person (Name VARCHAR(30), Address VARCHAR(30), Age INTEGER)", now;
            // レコードを追加します。[C]
            Statement insert(session);
            Person person("Bart Simpson", "Springfield", 35);
            insert << "INSERT INTO Person VALUES(?, ?, ?)", use(person);
            insert.execute();
            person.set<0>("Lisa Obama");
            person.set<1>("Washington");
            person.set<2>(10);
            insert.execute();
            // レコードを照会します。[R]
            Statement select(session);
            People people;
            select << "SELECT Name, Address, Age FROM Person", into(people), now;
            for (unsigned int i = 0; i < people.size(); ++i)
            {
                std::cout << people.at(i).get<0>() << "," << people.at(i).get<1>() << "," << people.at(i).get<2>() << std::endl;
            }
            // レコードを更新します。[U]
            Statement update(session);
            person.set<2>(12);
            update << "UPDATE Person set Age = ? where Name = ?", use(person.get<2>()), use(person.get<0>()), now;
            // レコードを削除します。[D]
            Statement del(session);
            person.set<0>("Bart Simpson");
            del << "DELETE from Person where Name = ?", use(person.get<0>()), now;
        }
        return Application::EXIT_OK;
    }
private:
    bool _helpRequested;
    std::string _dbConnString;
};
POCO_APP_MAIN(MysqlSample)

Comments are closed.