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 ...
随机推荐
- let/const特性
let: 1.声明的变量不存在预解析: console.log(a); let a=1; 2.变量名不允许重复(在同一作用域下): { let a=1; let a=2; console.lo ...
- decodeURIComponent 解码函数
想象一个场景,你朋友发一个链接让你打开,但链接是下面其中之一,你会不会想锤死他 1. \u0068\u0074\u0074\u0070\u003a\u002f\u002f\u0062\u0069\u0 ...
- Practical Go: Real world advice for writing maintainable Go programs
转自:https://dave.cheney.net/practical-go/presentations/qcon-china.html?from=timeline 1. Guiding pri ...
- Nginx Cache-Control
转自:https://www.cnblogs.com/sfnz/p/5383647.html HTTP协议的Cache-Control指定请求和响应遵循的缓存机制.在请求消息或响应消息中设置 Cach ...
- WPF ToggleButton Style
<Style x:Key="ArrowToggleStyle" TargetType="ToggleButton"> <Setter Prop ...
- CefSharp F12打开DevTools查看console js和c#方法互相调用
转载地址: https://www.cnblogs.com/lonelyxmas/p/11010018.html winform嵌入chrome浏览器,修改项目属性 生成 平台为x86 1.nuget ...
- 相同域名下的cookie污染
问题描述 本地用同一个tomcat调试两个相同框架的不同项目,在同一个浏览器界面里切换时,A项目的登录会把B项目的登录给踢掉,翻反过来亦如此.通过查看浏览器cookie,发现两个项目的cookie完全 ...
- Writing Your Own Widget(自定义组件)
英文地址:http://dojotoolkit.org/reference-guide/1.10/quickstart/writingWidgets.html#quickstart-writingwi ...
- redis报错: redis.exceptions.ResponseError: value is not an integer or out of range
问题描述 今天在使用python的redis客户端时碰到了这样的报错:redis.exceptions.ResponseError: value is not an integer or out of ...
- Apache:系统找不到指定的文件: No installed ConfigArgs for the service "Apache2"
解决方法: 将以下内容保存成FixApacheError.reg文件(其中红色粗体Apache2改成报错的系统服务名称,如"RTX_HTTPServer"),导入系统注册表 Fix ...