【四】ODB - C++ 單表更新(V1.11)

CalmReason發表於2015-11-04

一點說明:如果類成員發生了增減,只需要重新編譯類别範本檔案生成對應的SQL指令碼。再用新指令碼生成表即可。

單表更新主要用的是用db->update(type)來更新記錄

這裡分兩種情況:
(1)通過db->load(key)主鍵key來更新一條記錄,之後修改記錄,再更新記錄
(2)通過db->query_one(bool)查詢條件查詢一條記錄,之後修改記錄,再更新記錄

(1)通過主鍵更新的程式碼如下:

// driver.cxx
//

#include <memory>   // std::auto_ptr
#include <iostream>

#include <odb/database.hxx>
#include <odb/transaction.hxx>

#include <odb/mysql/database.hxx>

#include "person.hxx"
#include "person-odb.hxx"

using namespace std;
using namespace odb::core;

int
    main (int argc, char* argv[])
{
    try
    {
        //auto_ptr<database> db (new odb::mysql::database (argc, argv));
        //連線資料庫
        auto_ptr<odb::database> db (
            new odb::mysql::database (
            "root"     // database login name
            ,"123456" // database password
            ,"collect" // database name
            ,"localhost"
            ,13306
            ));
        typedef odb::query<person> query;
        typedef odb::result<person> result;

        // Say hello to those over 30.
        //
        {
            transaction t (db->begin ());

            unsigned long joe_id = 3;
            auto_ptr<person> joe (db->load<person>(joe_id));
            joe->age(joe->age()+1);
            db->update(*joe);

            t.commit ();
        }
    }
    catch (const odb::exception& e)
    {
        cerr << e.what () << endl;
        return 1;
    }
}

執行前:
這裡寫圖片描述
執行後:
這裡寫圖片描述
(2)通過查詢單條記錄更新的程式碼如下:

// driver.cxx
//

#include <memory>   // std::auto_ptr
#include <iostream>

#include <odb/database.hxx>
#include <odb/transaction.hxx>

#include <odb/mysql/database.hxx>

#include "person.hxx"
#include "person-odb.hxx"

using namespace std;
using namespace odb::core;

int
    main (int argc, char* argv[])
{
    try
    {
        //auto_ptr<database> db (new odb::mysql::database (argc, argv));
        //連線資料庫
        auto_ptr<odb::database> db (
            new odb::mysql::database (
            "root"     // database login name
            ,"123456" // database password
            ,"collect" // database name
            ,"localhost"
            ,13306
            ));
        typedef odb::query<person> query;
        typedef odb::result<person> result;

        // Say hello to those over 30.
        //
        {
            transaction t (db->begin ());

            auto_ptr<person> joe (db->query_one<person>(query::first == "Joe"
                                                        && query::last == "Dirt"));
            joe->age(joe->age()+1);
            db->update(*joe);

            t.commit ();
        }
    }
    catch (const odb::exception& e)
    {
        cerr << e.what () << endl;
        return 1;
    }
}

執行結果:
這裡寫圖片描述

原文連結:http://www.codesynthesis.com/products/odb/doc/manual.xhtml#2.6

相關文章