ODB的组成部分:

  1: 操作系统的ODB编译器

  2: odb核心库libodb

  3: 各种数据库的相关链接库

使用ODB访问数据需要的库和头文件(不懂, 请看https://www.cnblogs.com/hul201610101100/p/9482311.html):

  lib库: odb-oracle-d.lib, odb-d.lib (由libodb-oracle-2.4.0编译成功后产生的lib目录下的两个库)

  头文件: 直接将libodb-oracle-2.4.0编译成功后的odb目录拷贝到工程即可

源代码如下:

定义数据库表信息头文件:

 #pragma once
#include <string>
#include "odb/core.hxx" //直接将libodb-oracle-2.4.0目录中的odb目录copy过来, 再设置工程属性 using namespace std; //odb -d oracle --generate-query --generate-schema 头文件名
//eg: odb -d oracle --generate-query --generate-schema personinfo.h //声明接下来的一个对象是与数据库相关的类
#pragma db object
class personinfo
{
public:
//查询需要的构造函数
personinfo(){};
//插入需要的构造函数
personinfo(string strName, string strSex, int nAge, string strId, string strAddress)
{
name = strName;
sex = strSex;
age = nAge;
idnum = strId;
address = strAddress;
}; public:
string name;
string sex;
int age;
string idnum;
string address;
private:
//我们将类的构造函数或者将数据成员声明为私有时,odb的access类可以访问我们的数据成员和构造函数。
friend class odb::access; //odb/core.hxx //表明接下来这个字段是这个持久化类的标识符字段
//或
//我们也可以不用#pragma db id,而是使用#pragma db object no_id,表明这个持久化类没有标识符,如上例子
#pragma db id auto //编号自动增长, #pragma db object 这行代码添加了, 则该行代码一定添加, 不然用odb编译会失败
unsigned long id_;
};

定义好了数据表头文件之后, 将该文件拷贝到odb.exe目录下, 运行生成操作数据库相关的代码

odb -d oracle --generate-query --generate-schema personinfo.h

--generate-query: 生成查询书库代码

--generate-schema: 生成建表文件(.sql文件)

personinfo.h: 头文件名称

personinfo.h头文件解析:

class personinfo: 数据表名personinfo

name, sex, idnum, address, age, id: 数据表列名

odb命名执行成功会生成4个文件: personinfo-odb.cxx, personinfo-odb.hxx, personinfo-odb.ixx, personinfo.sql

将这四个头文件拷贝到工程目录(和personinfo.h同级目录)下, 后将 personinfo-odb.cxx(源文件), personinfo-odb.hxx(头文件), personinfo-odb.ixx(头文件), 加载到工程中

访问数据库代码如下:

 #include <stdio.h>
#include "personinfo.h"
#include "personinfo-odb.hxx"
//
// //
//odb 头文件
#include "odb/database.hxx"
#include "odb/transaction.hxx"
#include "odb/oracle/database.hxx"
//odb 命名空间
using namespace odb::core; //transaction //odb 调用的lib库, 使用libodb-oracle-2.4.0目录的lib目录
#pragma comment(lib, "odb-oracle-d.lib")
#pragma comment(lib, "odb-d.lib")
int main()
{
try
{
auto_ptr<database> db(new odb::oracle::database(
"HUL", //用户名
"sa", //密码
"ORCL", //数据库名
"127.0.0.1", //数据库ip地址
)); //数据库端口号
personinfo perInfo("mhm", "MAN", , "", "浙江杭州");
transaction tInsert(db->begin());
db->persist(perInfo);
tInsert.commit();
printf("执行插入成功\n"); typedef odb::query<personinfo> querys;
typedef odb::result<personinfo> results;
transaction tQuery (db->begin ()); //results rQuery(db->query<personinfo>()); //无条件查询
results rQuery(db->query<personinfo>(querys::age == )); //查询年龄==77的结果集
for(results::iterator it = rQuery.begin(); it != rQuery.end(); ++it)
{
printf("姓名: %s, 性别: %s, 年龄: %d, 身份编号:%s, 地址: %s\n", it->name.c_str(), it->sex.c_str(), it->age, it->idnum.c_str(), it->address.c_str());
}
tQuery.commit();
printf("执行查询操作成功\n");
transaction tDelet(db->begin ());
db->erase<personinfo>(); //删除id = 2, 当id = 2 不存在时, 会报错: object not persistent
//db->erase<personinfo>(perInfo); //删除对象
tDelet.commit ();
printf("执行删除操作成功\n"); transaction tUpdate (db->begin ());
unsigned long id = ;
auto_ptr<personinfo> joe (db->load<personinfo>(id)); //当id = 3 不存在时, 会报错: object not persistent
joe->age = ;
db->update (*joe);
printf("执行更新操作成功\n");
}
catch (const odb::exception& ex) //catch odb异常
{
printf("Error: %s", ex.what());
getchar();
return -;
} return ;
}

以上是以orm方式访问书库的简单代码, 希望能对你有点帮助, 也不枉我写这三篇文章

前两篇地址:

  Window ODB 环境编译 :https://www.cnblogs.com/hul201610101100/p/9482311.html

  ODB Demo使用: https://www.cnblogs.com/hul201610101100/p/9482605.html

C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)的更多相关文章

  1. C++版本 ORM 访问数据库之ODB 的oracle Demo测试(二)

    有上篇文章已经说了odb的环境编译, 现在直接拿来给的例子进行数据库的增删改查操作测试 1. ODB访问oracle数据库_ 插入操作(insert) 直接运行上篇编译好的exe文件会出现如下错误 错 ...

  2. C++版本 ORM 访问数据库之ODB 的Window环境编译(一)

    先简单说说我为什么要编译一个ORM访问数据库的版本, 以前在做C#访问数据库时候, 直接以orm方式访问数据库, 代码写起来简单,  不用写各种复杂的sql语句, 直接有orm框架生成, 后来转到C+ ...

  3. 对比传统方式访问数据库和SpringData访问数据库

    我们在写代码的时候应该一边写一边测试,这样的话可以尽快的找到错误,在代码写多了之后去找错误的话不容易给错误定位 传统方式访问数据库 1:创建一个Maven web项目 2:修改pom.xml为以下内容 ...

  4. Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块

    Python第十三天   django 1.6   导入模板   定义数据模型   访问数据库   GET和POST方法    SimpleCMDB项目   urllib模块   urllib2模块 ...

  5. PHP访问数据库

    1.原生mysql方式 <?php //最原生态的访问方式,不过SQL注入是个麻烦事 $con = mysql_connect("localhost","root& ...

  6. 2017.11.12 web中JDBC 方式访问数据库的技术

    JavaWeb------ 第四章 JDBC数据库访问技术 在JavaWeb应用程序中数据库访问是通过Java数据库连接(JavaDateBase Connectivity简称JDBC)数据库的链接一 ...

  7. 2017.10.3 JDBC访问数据库的建立过程

    1·JDBC访问数据库,其访问流程: (1)注册驱动 (2)建立连接(Connection) (3)创建数据库操作对象用于执行SQL语句 (4)执行语句 (5)处理执行结果 (6)释放资源 2·注册驱 ...

  8. Silverlight访问数据库大全(转)

    Silverlight访问数据库大全 Silverlight访问数据库大全 Posted on 2010-06-13 17:25 moss_tan_jun 阅读(1917) 评论(0) 编辑 收藏 最 ...

  9. 【一】ODB - C++ 访问数据库的利器--Hello World On Windows(Version-24)

    本文以MySQL数据库为例,其他数据类似. 官方文档和下载 ODB官方首页    官方开发者说明书(开发教程) 安装下载首页(下载与安装教程Windows/Linux) Windows安装步骤(都是英 ...

随机推荐

  1. windowsServer ------ 安装IIS

    1.找到服务器管理器,点击添加角色,一步步执行 2.添加IIS 相关组件 勾选web服务器 下一步 将web服务iis 相关组件全部勾选,ftp 可不选 选择好后安装 等一会 关闭 可以查看到所安装角 ...

  2. Java代码开发之《异常日志》

    异常日志 (一) 异常处理 1. [强制]Java 类库中定义的可以通过预检查方式规避的 RuntimeException 异常不应该通 过 catch 的方式来处理,比如:NullPointerEx ...

  3. 使用Redis作为Spring Security OAuth2的token存储

    写在前边 本文对Spring Security OAuth2的token使用Redis保存,相比JWT实现的token存储,Redis可以随时吊销access_token,并且Redis响应速度很快, ...

  4. 动态ALV表实例-移动类型汇总

    TABLES:MSEG,MAKT. "定义结构 TYPES:BEGIN OF TY_DATA, MJAHR LIKE MSEG-MJAHR, "物料凭证的年份 MBLNR LIKE ...

  5. SAP MM模块相关透明表收集

    物料表 MCHA 批次表(批次.评估类型 工厂物料) MARA 查看物料数据(发票名称.创建时间.人员) MARC 物料数据查询(利润中心.状态.在途) MAKT 查看物料描述 MKPF 物料抬头 M ...

  6. Python - 集合 - 第十一天

    Python 集合 集合(set)是一个无序的不重复元素序列. 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建 ...

  7. C 函数指针、回调函数

    参考链接:https://www.runoob.com/cprogramming/c-fun-pointer-callback.html 函数指针 函数指针就是执行函数的指针,他可以像正常函数一样去调 ...

  8. Linux目录和文件——目录格式

    Linux目录和文件——目录格式 摘要:本文主要了解了Linux系统的目录格式. 一切皆文件 Linux下“一切皆文件”是Unix/Linux的基本哲学之一. Linux中所有内容都是以文件的形式保存 ...

  9. mvc 返回json格式时间格式化

    protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEnco ...

  10. Java获取客户端真实IP地址

    Java代码 import javax.servlet.http.HttpServletRequest; /** * 获取对象的IP地址等信息 */ public class IPUtil { /** ...