C++版本 ORM 访问数据库之ODB 的Window环境编译(一)
先简单说说我为什么要编译一个ORM访问数据库的版本, 以前在做C#访问数据库时候, 直接以orm方式访问数据库, 代码写起来简单, 不用写各种复杂的sql语句, 直接有orm框架生成, 后来转到C++上面来了, 也有访问的数据库, 虽然C++访问的数据库方式有很多, 但是都是那些odbc, ado 之类的访问方式, 虽然实现代码只有几行, 但是如果是新手调试的时候就有你受的了, 我影响最深的是, 我平时工作中访问的oracle数据库比较多, 由于公司前辈们都是与ado方式访问数据库, 所以我也网上找了一个ado访问oralce数据库的方式, 刚开始直接从网上copy了一份代码下来, 然后再根据自己的业务需求进行一下修修改改, 当时很高兴, 天真的以为编译成功就能用了, 但理想是完美的, 现实是残忍的, 程序运行起来既然在链接数据库的阶段就错了, 而且使用try catch抓到的错误莫名其妙, 百度答案五花八门没有能解决我的问题, 反正被这问题折腾了好几天, 主要有三个问题
1, oralce驱动没安装
2. 链接字符串不对(链接字符串根据你使用的驱动不同而有差异)
3. msado15.dll 库不对, 这个库是微软自带的库, 每个操作系统上的这个库都不同, 所以最好使用目标主机上的库拿到本地编译
扯远了, 其实就想说明一下ado访问数据库也不简单, 现在进入正题, 由于我经常使用oracle数据库, 所以我编译的是oracle ODB 环境, 其他数据库是一样的
ODB官方下载路径:
https://www.codesynthesis.com/products/odb/download.xhtml
需要下载的zip文件包
window环境编译器: Odb-2.4.0-i686-windows
核心库: libodb-2.4.0
oralce库: libodb-oracle-2.4.0
测试例子库: Odb-example-2.4.0
下载完成之后, 解压在同一文件夹中
开始ODB环境编译
1. 配置odb编译器------Odb-2.4.0-i686-windows
打开Odb-2.4.0-i686-windows文件夹, 进入bin目录下, 会发现一个odb.exe文件, 后将odb.exe 的路径配置到系统环境变量的path中, 然后打开cmd窗口运行odb --version 命令, 查看是否配置成功
如下图:
操作1

操作2

操作3

2. 编译libodb------libodb-2.4.0.zip
直接进入libodb-2.4.0文件夹后发现有vs工程文件, 直接用vs工具打开并编译即可
操作如下图:
操作1:

操作2: 打开直接编译, 无需任何配置

请记住生成的lib文件和bin文件
3. 编译oralce库文件------libodb-oracle-2.4.0.zip
操作如下图
操作1: 进入libodb-oracle-2.4.0, 直接用vs工具打开工程文件吗后编译

错误1: 无法打开包括文件:“odb/pre.hxx”: No such file or directory
解决方法: 将编译好的libodb库 中的lib 和odb两个文件夹直接复制替换到该工程下的libodb-oralce-2.4.0下的lib和odb目录
操作如下图



文件夹合并之后再编译

编译错误2: 找不到oci.h文件
解决方法: 因为oci.h是oracle的头文件, 需要到下官网下载oracle下载地址: https://www.oracle.com/downloads/index.html我下载的是oralce11gR2_Win32版本: 下载后,解压, 选择管理员模式安装, 然后找到oci.h文件所在的目录,

拷贝该目录下的lib和include两个文件夹(是两个文件夹, 不是一个, 即使你只拷贝include后面还是会出现找不到oci.lib库, 所以一下就讲连个文件夹都拷贝过去)

替换libodb-oracle-2.4.0目录中的lib和include两个文件夹

再编译:

还是找不到oci.h , 现在就需要修改项目属性

再编译:

继续配置项目工程属性

再编译:

再配置工程属性

编译:

终于成功了, 如果你还是失败了, 出现了如下错误:
error LNK2001: 无法解析的外部符号 _OCIDescriptorFree
那恭喜你, 你oralce下载错了版本, 你下的版本与你编译器运行的版本不一样(例如你下的是64bit, 和vs是Win32平台), 重新下载, 再编译就行了, 我刚开始就碰到这问题
4. 编译测试例子------odb-examples-2.4.0
因为我编译的是oracle数据库, 所以我打开的是examples-oracle-vs12.sln

将hello-oracle设置为启动项

直接编译, 如果出现错误:error MSB6006: "cmd.exe" exited with code 9009.
解决方法: 电脑重启(因为是配置odb.exe的path路径没生效, 重启即可)
电脑重启后编译结果:

其实就是需要libodb-2.4.0中的(odb-d.lib库) 和libodb-oracle(odb-oracle-d.lib)库,但是当你打开工程属时会发现已经包含了这两个库

因此只要将libodb-oracle-2.4.0中的include, odb, lib 这三个目录合并到exeample中再配置工程属性就行了
拷贝过程省去, 直接配置头文件路径配置

配置(odb-d.lib库) 和libodb-oracle(odb-oracle-d.lib)库路径

编译结果:

5. 使用odb编译器生成标准的odb文件
在hello-oracle-vc12工程中有一个person.hxx文件, 将将person.hxx(odb模板文件)文件拷贝到 目录odb-2.4.0-i686-windows\bin下,打开cmd, 进入到BIN目录, 运行命令
odb -d oracle --generate-query --generate-schema person.hxx
会生成这四个文件, person.sql, persion-odb.cxx, persion-odb.hxx, persion-odb.ixx, 然后将这4文件拷贝到hello-oracle-vc12工程中和person.hxx在同一级目录下
如果不进入到BIN目录目录下, 直接运行 odb -d oracle --generate-query --generate-schema person.hxx则会出现如下错误:


C++版本 ORM 访问数据库之ODB 的Window环境编译(一)的更多相关文章
- C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)
ODB的组成部分: 1: 操作系统的ODB编译器 2: odb核心库libodb 3: 各种数据库的相关链接库 使用ODB访问数据需要的库和头文件(不懂, 请看https://www.cnblogs. ...
- C++版本 ORM 访问数据库之ODB 的oracle Demo测试(二)
有上篇文章已经说了odb的环境编译, 现在直接拿来给的例子进行数据库的增删改查操作测试 1. ODB访问oracle数据库_ 插入操作(insert) 直接运行上篇编译好的exe文件会出现如下错误 错 ...
- 用dotnet core搭建web服务器(三)ORM访问数据库
访问传统sql数据库,大家以前都是用sql语句去查询.这些年流行orm方法 ORM是对象关系映射的简拼,就是用一个对象(class)去表示数据的一行,用对象的成员去表述数据的列 dotnet 官方很早 ...
- 【一】ODB - C++ 访问数据库的利器--Hello World On Windows(Version-24)
本文以MySQL数据库为例,其他数据类似. 官方文档和下载 ODB官方首页 官方开发者说明书(开发教程) 安装下载首页(下载与安装教程Windows/Linux) Windows安装步骤(都是英 ...
- [开源] .Net 使用 ORM 访问 达梦数据库
前言 武汉达梦数据库有限公司成立于2000年,为中国电子信息产业集团(CEC)旗下基础软件企业,专业从事数据库管理系统的研发.销售与服务,同时可为用户提供大数据平台架构咨询.数据技术方案规划.产品部署 ...
- Python与数据库[2] -> 关系对象映射/ORM[3] -> sqlalchemy 的声明层 ORM 访问方式
sqlalchemy的声明层ORM访问方式 sqlalchemy中可以利用声明层进行表格类的建立,并利用ORM对象进行数据库的操作及访问,另一种方式为显式的 ORM 访问方式. 主要的建立步骤包括: ...
- Python与数据库[2] -> 关系对象映射/ORM[4] -> sqlalchemy 的显式 ORM 访问方式
sqlalchemy 的显式 ORM 访问方式 对于sqlalchemy,可以利用一种显式的ORM方式进行访问,这种方式无需依赖声明层,而是显式地进行操作.还有一种访问方式为声明层 ORM 访问方式. ...
- VS2017新建MVC+ORM中的LinqDb访问数据库项目
1.前提概述 ORM对象关系映射(Object-Relational Mapping)是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说,它其实是创建了一个可在编程语言 ...
- Spring实战6:利用Spring和JDBC访问数据库
主要内容 定义Spring的数据访问支持 配置数据库资源 使用Spring提供的JDBC模板 写在前面:经过上一篇文章的学习,我们掌握了如何写web应用的控制器层,不过由于只定义了SpitterRep ...
随机推荐
- H3C 12508 收集诊断信息
案例:H3C 12508单板卡出现remove状态,需要配合研发收集诊断信息. (此文档只展示研发要求的诊断信息.) 总体:12500交换机返回三种文件----故障时诊断信息,主备单板的日志文 ...
- Salesforce学习之路(八)一次拉取多个文件或全部文件至本地
在开发中,经常会遇到本地工程错乱或者误操作导致本地本地项目被删除,此时利用SFDX: Retrieve Source from Org只会拉取新建并且名称相同的组件,若通过创建一个个文件,然后再拉取的 ...
- 博客中新浪图床 迁移至 阿里云的OSS
前言 因为之前有个新浪的图床,还挺好用,而且免费,自己博客的图片上传到其上面也挺方便的,但是,前几周吧,突然图片就不能访问了,之前本来是想通过添加 meta 头来解决的,但是发现没有效果.于是就自己搞 ...
- OpenGL入门1.3:着色器 GLSL
前言 经过之前一段时间的学习(渲染管线简介)我们已经知道了着色器(Shader)是运行在GPU上的程序,这些小程序为图形渲染管线的某个特定部分而运行,着色器只是一种把输入转化为输出的程序,着色器也是一 ...
- SQLMap常用教程
先安装 python环境(2.6.x或2.7版本) ,再将SQLMap 放在安装目录下 注意:sqlmap只是用来检测和利用sql注入点的,并不能扫描出网站有哪些漏洞,使用前请先使用扫描工具扫出sql ...
- runtime template in vuejs
在使用vuejs开发的过程中,有时候我们需要动态模板的场景,也就是说模板并不是静态定义好的,而是动态变化的. 比如在做一个所见所得编辑器时,编辑人员可能时刻需要调整他设计的页面内容,而如果页面内容包含 ...
- Linux入门——注意事项
Linux入门——注意事项 摘要:本文主要说明了在使用Linux操作系统时,需要注意的问题. 严格区分大小写 和Windows不同,Linux是严格区分大小写的,包括文件名和目录名.命令.命令选项.配 ...
- SQLServer 高效 分页存储过程
/********************************************************************** 参数:@PrimaryKey 主键,@OrderBy 排 ...
- maven 学习---Maven项目模板
Maven提供用户,使用原型的概念,不同类型的项目模板(以数字614)是一个非常大的列表. Maven帮助用户快速开始使用以下命令创建新的Java项目 mvn archetype:generate 什 ...
- ROW_NUMBER()实现分页
1. 在数据表基础上面添加一个自增的一列记录行数(虚拟的实际数据库不存在,不会影响数据库结构)的列当然也顺便起一个别名(我这里起了一个rowNum) 2.由于rowNum是一个虚拟的.若直接使用会报' ...