ODB库安装使用简介

调研

下载

  • odb-2.4.0-i686-windows
  • libodb-2.4.0
  • libodb-sqlite-2.4.0(自行选择)
  • libodb-boost-2.4.0(自行选择,主要为智能指针添加支持)

编译

  • 添加odb的环境变量:

    C:\Users\Administrator
    λ odb --version
    ODB object-relational mapping (ORM) compiler for C++ 2.4.0
    Copyright (c) 2009-2015 Code Synthesis Tools CC
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  • 编译libodb-vc10.sln
  • 编译libodb-sqlite-vc10.sln
    注意

    • 需要添加包含目录
    • 需要包含链接库目录,由于sqlite本身没有提供lib文件,选择使用vs自动生成

      E:\DB\sqlite>LIB /DEF:sqlite3.def /machine:IX86
      Microsoft (R) Library Manager Version 10.00.30319.01
      Copyright (C) Microsoft Corporation.  All rights reserved.
      
         正在创建库 sqlite3.lib 和对象 sqlite3.exp
    • 右键属性中,取消预处理器中的的SQLITE_ENABLE_UNLOCK_NOTIFY命令,然后可以正常编译工程;否则将出现下面的问题

      1>     正在创建库 ..\..\lib\odb-sqlite-d.lib 和对象 ..\..\lib\odb-sqlite-d.exp
      1>connection.obj : error LNK2019: 无法解析的外部符号 _sqlite3_unlock_notify,该符号在函数 "public: void __thiscall odb::sqlite::connection::wait(void)" (?wait@connection@sqlite@odb@@QAEXXZ) 中被引用
      1>E:\DB\libodb-sqlite-2.4.0\odb\sqlite\..\..\bin\odb-sqlite-d-2.4-vc10.dll : fatal error LNK1120: 1 个无法解析的外部命令
      1>
      1>生成失败。

示例

编译example项目的access-sqlite-vc10工程

#ifndef PERSON_HXX
#define PERSON_HXX

#include <string>

#include <odb/core.hxx>

#pragma db object
class person
{
public:
    person () {}
    person (const std::string& email,
        const std::string& first,
        const std::string& middle,
        const std::string& last,
        unsigned short age)
        : email_ (email), first_ (first), middle_ (middle), last_ (last)
    {
        data_.age = age;
    }

    // 标准存取器和修改器能够被odb发现使用
    const std::string&  email () const
    {
        return email_;
    }

    void email (const std::string& email)
    {
        email_ = email;
    }

    const std::string& getFirst () const
    {
        return first_;
    }

    std::string& setFirst ()
    {
        return first_;
    }

    const std::string& g_middle () const
    {
        return middle_;
    }

    void s_middle (const std::string& middle)
    {
        middle_ = middle;
    }

    const char* last () const
    {
        return last_.c_str ();
    }

    void last (const char* last)
    {
        last_ = last;
    }

    unsigned short age () const
    {
        return data_.age;
    }

    void age (unsigned short age)
    {
        data_.age = age;
    }

private:
#pragma db id //自动生成主键
    std::string email_; 
    std::string first_; 

#pragma db get(g_middle) set(s_middle)
    std::string middle_;

#pragma db get(std::string (this.last ())) set(last ((?).c_str ()))
    std::string last_;

#pragma db transient
    struct
    {
        unsigned short age;
    } data_;

#pragma db member(age) virtual(unsigned short) 
};

#endif // PERSON_HXX

main函数

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

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

#include "database.hxx" // create_database

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

using namespace std;
using namespace odb::core;

int
main (int argc, char* argv[])
{
  try
  {//创建db
    auto_ptr<database> db (create_database (argc, argv));

    {
      person john ("john@doe.com", "John", "X", "Doe", 31);
      person jane ("jane@doe.com", "Jane", "Y", "Doe", 29);

      transaction t (db->begin ());
      db->persist (john);//插入
      db->persist (jane);
      t.commit ();
    }

    {//查询
      typedef odb::result<person> result;

      transaction t (db->begin ());
      result r (db->query<person> ());

      for (result::iterator i (r.begin ()); i != r.end (); ++i)
        cout << i->getFirst () << ' '
             << i->g_middle () << ' '
             << i->last () << ' '
             << i->email () << ' '
             << i->age () << endl;

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

vs会自动执行odb命令,来生成对应的person-odb.ixx,person-odb.hxx,person-odb.cxx;如果不能成功调用odb,可以参见4。

参考:

[1].http://www.sqlite.org/howtocompile.html
[2].http://blog.csdn.net/feng______/article/details/33411119
[3].http://www.codesynthesis.com/products/odb/doc/manual.xhtml
[4].http://wiki.codesynthesis.com/Using_ODB_with_Microsoft_Visual_Studio

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值