先简单说说我为什么要编译一个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

  C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

  操作2

  C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

  操作3

  C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

 2.  编译libodb------libodb-2.4.0.zip

  直接进入libodb-2.4.0文件夹后发现有vs工程文件, 直接用vs工具打开并编译即可

  操作如下图:

  操作1:

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

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

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

请记住生成的lib文件和bin文件

3. 编译oralce库文件------libodb-oracle-2.4.0.zip

  操作如下图

  操作1: 进入libodb-oracle-2.4.0, 直接用vs工具打开工程文件吗后编译

  C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

错误1: 无法打开包括文件:“odb/pre.hxx”: No such file or directory

解决方法: 将编译好的libodb库 中的lib 和odb两个文件夹直接复制替换到该工程下的libodb-oralce-2.4.0下的lib和odb目录

操作如下图

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

文件夹合并之后再编译

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

编译错误2: 找不到oci.h文件

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

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

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

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

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

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

再编译:

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

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

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

再编译:

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

继续配置项目工程属性

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

再编译:

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

再配置工程属性

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

编译:

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

终于成功了, 如果你还是失败了, 出现了如下错误:

error LNK2001: 无法解析的外部符号 _OCIDescriptorFree

那恭喜你, 你oralce下载错了版本, 你下的版本与你编译器运行的版本不一样(例如你下的是64bit, 和vs是Win32平台), 重新下载, 再编译就行了, 我刚开始就碰到这问题

4. 编译测试例子------odb-examples-2.4.0

  因为我编译的是oracle数据库, 所以我打开的是examples-oracle-vs12.sln

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

将hello-oracle设置为启动项

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

直接编译, 如果出现错误:error MSB6006: "cmd.exe" exited with code 9009.

解决方法: 电脑重启(因为是配置odb.exe的path路径没生效, 重启即可)

电脑重启后编译结果:

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

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

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

因此只要将libodb-oracle-2.4.0中的include, odb, lib 这三个目录合并到exeample中再配置工程属性就行了

拷贝过程省去, 直接配置头文件路径配置

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

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

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

编译结果:

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

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环境编译(一)-LMLPHP

C++版本 ORM 访问数据库之ODB 的Window环境编译(一)-LMLPHP

 

  

05-11 20:20