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. CDN的智能调度,链路优化的详细解答

    您的用户在请求资源的过程中,可能受到网络.地域.带宽等影响,无法保证请求一定是按照最优访问路径进行传递,猫云 CDN 通过对全网链路进行实时监控,结合自研的 GSLB 调度体系和智能路由技术,从以下几 ...

  2. jquery改变表单某个输入框的值时,另一个或几个输入框的值同步变化,这里演示的是改变数量时价格同步变化

    效果如下,当我输入数量时,下面的价格同步变化 代码如下: 上图圈起来的事件是当input 框里面的值改变时触发的事件. 补图

  3. Ubuntu18.04下修改快捷键

    Ubuntu下修改快捷键 Intelij Idea在Ubuntu下的快捷键几乎和windows差不多,最常用的一个快捷键与系统冲突: Ctrl + Alt + T idea是surround with ...

  4. .net core EF Core 调用存储过程

    在这里,我们将尝试去学习一下 .net core EF Core 中调用存储过程. 我们知道,EF Core 是不支持直接调用存储过程的,那它又提供了什么样的方式去执行存储过程呢?有如下方法: 1.F ...

  5. 『CSP2019初赛后的总结』

    初赛已经过去了,分数大概也已经知道了,接下来的一个月停课应该就是全部准备复赛. 联赛前几次讲课的内容是组合计数,计数\(dp\),字符串,概率期望,数论,数据结构,多数知识点难度都是大于联赛难度的,不 ...

  6. Node.js能解决什么问题?

    一.使用Node.js能解决什么问题 对于PHP.JAVA.Python等服务端语言中,为每个客户端连接创建一个新的线程,而每个线程需要大约2M的内存,理论上,具有8GB内存的服务器可以同时连接的最大 ...

  7. vue 获取视频时长

    参考资料:js获取上传音视频文件的时长 直接通过element-ui自带的上传组件结合js即可,代码如下: HTML: <el-upload class="upload-demo&qu ...

  8. c++语法大全笔记(一)

    目录 一:初级知识   c++是一种中级语言,是c的扩充,是一种面向对象的程序设计语言,可以运行到多个平台.这里直接讲语法.   基础c++模板: #include <iostream> ...

  9. foreachRDD

    需求: 将统计结果写入到MySQL create table wordcount( word varchar(50) default null, wordcount int(10) default n ...

  10. Modbus协议 CRC 校验码

    CRC(循环冗余校验)在线计算 http://www.ip33.com/crc.html 里面的8005的多项式值,但网上看到的算法都是用A001来异或的 ---------------------- ...