C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)
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(三)的更多相关文章
- C++版本 ORM 访问数据库之ODB 的oracle Demo测试(二)
有上篇文章已经说了odb的环境编译, 现在直接拿来给的例子进行数据库的增删改查操作测试 1. ODB访问oracle数据库_ 插入操作(insert) 直接运行上篇编译好的exe文件会出现如下错误 错 ...
- C++版本 ORM 访问数据库之ODB 的Window环境编译(一)
先简单说说我为什么要编译一个ORM访问数据库的版本, 以前在做C#访问数据库时候, 直接以orm方式访问数据库, 代码写起来简单, 不用写各种复杂的sql语句, 直接有orm框架生成, 后来转到C+ ...
- 对比传统方式访问数据库和SpringData访问数据库
我们在写代码的时候应该一边写一边测试,这样的话可以尽快的找到错误,在代码写多了之后去找错误的话不容易给错误定位 传统方式访问数据库 1:创建一个Maven web项目 2:修改pom.xml为以下内容 ...
- Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块
Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 ...
- PHP访问数据库
1.原生mysql方式 <?php //最原生态的访问方式,不过SQL注入是个麻烦事 $con = mysql_connect("localhost","root& ...
- 2017.11.12 web中JDBC 方式访问数据库的技术
JavaWeb------ 第四章 JDBC数据库访问技术 在JavaWeb应用程序中数据库访问是通过Java数据库连接(JavaDateBase Connectivity简称JDBC)数据库的链接一 ...
- 2017.10.3 JDBC访问数据库的建立过程
1·JDBC访问数据库,其访问流程: (1)注册驱动 (2)建立连接(Connection) (3)创建数据库操作对象用于执行SQL语句 (4)执行语句 (5)处理执行结果 (6)释放资源 2·注册驱 ...
- Silverlight访问数据库大全(转)
Silverlight访问数据库大全 Silverlight访问数据库大全 Posted on 2010-06-13 17:25 moss_tan_jun 阅读(1917) 评论(0) 编辑 收藏 最 ...
- 【一】ODB - C++ 访问数据库的利器--Hello World On Windows(Version-24)
本文以MySQL数据库为例,其他数据类似. 官方文档和下载 ODB官方首页 官方开发者说明书(开发教程) 安装下载首页(下载与安装教程Windows/Linux) Windows安装步骤(都是英 ...
随机推荐
- SpringMVC_处理器方法的返回值
一.返回ModelAndView 若处理器方法处理完后,需要跳转到其他资源,且又要在跳转的资源间传递数据,此时处理器方法返回ModelAndView比较好.当然,若要返回ModelAndView ...
- 5分钟上手:本地开发环境启动HTTPS
今天我们访问的所有网站几乎都是受HTTPS保护的.如果你的站点还没有,那你应该使用它.使用HTTPS保护服务器也意味着你不能从不是HTTPS服务器向此服务器发送请求.这给使用本地开发环境的开发人员带来 ...
- Asp.Net Core 中的静态文件
Asp.Net Core 中的静态文件 在这节中我们将讨论如何使 ASP.NET Core 应用程序,支持静态文件,如 HTML,图像,CSS 和 JavaScript 文件. 静态文件 默认情况下, ...
- python3的hashlib库sha256、pbkdf2_hmac、blake2b基本用法
hashlib.sha256: import hashlib x = hashlib.sha256()x.update(b"asd")print("x_1 = " ...
- 场sharepoint2016数据库恢复站点
前不久公司support方,不小心把IIS的应用删除了,算是灼急了,不过有过原来恢复的经历,似乎有了心理准备,可是这次比上次严重些.技术操作复杂些,不过通过此事,也是进一步了解了SP2016数据库结构 ...
- React + Ts 实现三子棋小游戏
在这里阅读效果更佳 还记得当年和同桌在草稿纸上下三子棋的时光吗 今天我们就用代码来重温一下年少(假设你有react基础,没有也行,只要你会三大框架的任意一种,上手react不难) 游戏规则 双方各执一 ...
- jquery源码问题
最近公司升级jquery版本后,原来项目中复选框的attr的使用失效,在查看了jquery的内容的时候发现版本更新,复选框的attr的使用替换成了prop,所以使用的时候出现了问题,但是涉及到的文件太 ...
- 四.Windows基础
系统目录 Windows Program files 用户 Perflogs:是Windows7的日志信息,如磁盘扫描错误信息,删掉可以,但不建议删,删掉反而降低系统速度,perflogs是系统自动生 ...
- 个人项目:WC
一.GitHub项目地址:https://github.com/lseap/myWC 二.PSP表格: PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...
- 谈谈<? extends T> 和<? super T>理解
项目中遇到<? extends T> 和<? super T> 这两者,来说说自己的理解.首先我们先了解什么是泛型 什么是泛型 泛型是在编译阶段一种防止错误对象输入的机制.编译 ...