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安装步骤(都是英 ...
随机推荐
- Springboot概述
目录 什么是springboot Springboot的优点 SpringBoot的缺点 一:什么是springboot Springboot是Spring开源组织下的子项目,是Spring组件一站式 ...
- 自己动手搭建经典的3层 Asp.Net MVC
1:IBaseDAL using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expr ...
- trailhead学习之 LWC for Aura Developers
本篇查看https://trailhead.salesforce.com/content/learn/modules/lightning-web-components-for-aura-develop ...
- 【设计模式】Composite
目录 前言 安卓View的实现 View Beyond setContentView setContentView做了什么事情? 如何将xml文件变成对象的? 小结 View的绘制流程 三个流程 三个 ...
- 关于Qt 静态成员函数调用信号
class globalCalcThread; extern globalCalcThread *g_calcThread; class globalCalcThread : public QThre ...
- shell脚本实现自动化安装linux版本的loadrunner agent(centos6.8)
#!/bin/bash #Centos6下安装LoadRunner负载机 #@author Agoly #@date #@source 高级测试技术交流圈: yum -y install expect ...
- vue中输入框只能输入数字
方案1:增加自定义指令 自定义指令写法: directives: { numberOnly: { bind(el) { ...
- 7 CentOS 7网卡配置
首先重中之重:修改前一定要进行系统备份,如果是虚拟机进行快照 查看虚拟机的网卡配置 注意桥接模式和NAT模式 桥接模式:网络层面,虚拟机和PC处于同级地位,虚拟机直接和路由器相连 NA ...
- 相同域名下的cookie污染
问题描述 本地用同一个tomcat调试两个相同框架的不同项目,在同一个浏览器界面里切换时,A项目的登录会把B项目的登录给踢掉,翻反过来亦如此.通过查看浏览器cookie,发现两个项目的cookie完全 ...
- pandas 之 交叉表-透视表
import numpy as np import pandas as pd 认识 A pivot table is a data summarization tool(数据汇总工具) frequen ...