【一】ODB - C++ 访问数据库的利器--Hello World On Windows(Version-24)

本文以MySQL数据库为例,其他数据类似。

官方文档和下载

ODB官方首页    官方开发者说明书(开发教程)

安装下载首页(下载与安装教程Windows/Linux)

Windows安装步骤(都是英文版,流程虽然详细,但是却略显麻烦,主要是因为ODB的机制造成的)

ODB的使用原理

下面介绍ODB的使用原理来说明为什么会有这么多步骤:

ODB的架构和流程

(1)你自己定义一个C++的Person类.h/.cpp

(2)用安装的ODB Compiler编译Person.h得到新的

必选:

MySQL官方C开发库 

只用这个即可同时开发C++程序

作用:这个是MySQL官方提供的用于C开发程序读写MySQL提供头文件和动态链接库文件以及静态链接库文件,跟ODB没有任何关系。

这个不需要编译,提供现成的头文件和库文件。可以用C直接读写MySQL数据库。

官方下载地址(全部都有自己选): libmysqlclient

百度云下载仅提供:【mysql-connector-c-6.1.6-win32.zip】或者【mysql-connector-c-6.1.6-winx64.zip

MySQL官方C++开发库

不建议用:

后来发现/cpp里面下载的压缩文件中并没有【mysql_version.h】和【mysql_time.h】而是在/c的C版本包里有。所以下载了上面/c网址下的包。下载:mysql-connector-c++-noinstall-1.1.6-win32.zip 或者 mysql-connector-c++-noinstall-1.1.6-win64.zip

下载并使用ODB编译器

官方下载地址   百度云下载:odb-2.4.0-i686-windows.zip

主要功能:将自定义ODB结构编译生成标准的.hxx头文件和标准的.cxx源文件。

这个是个bin/odb.exe可执行文件,免安装。要想使用这个EXE只需要打开CMD终端,将目录切换到此目录即可执行:

上图表示odb已经可以使用。

下载并编译LIBODBlibodb-2.4.0.zip

官方下载地址  百度云下载地址

主要作用:官方名称叫一般运行时库Common Runtime Library (libodb),odb的主要功能接口都在这个库里面提供。这里面有源代码和VS工程,编译完生成的库文件即可投入使用。

 

下载并编译数据库运行时库LIBODB-<DATABASE>

官方下载地址  libodb-mssql-2.4.0.zip、libodb-oracle-2.4.0.zip、libodb-mysql-2.4.0.zip

百度云下载:libodb-mssql-2.4.0.ziplibodb-oracle-2.4.0.ziplibodb-mysql-2.4.0.zip

主要作用:将第三方数据库接口封装成统一接口给libodb,从而实现跨数据库访问。这些运行时库用VS Building之后会生成lib和dll文件

libodb-mysql在编译的时候需要两个东西(参考INSTALL文件):

(1)libodb-2.4.0中编译生成的头文件和连接库

(2)MySQL的客户端包,也就是【mysql-connector-c-6.1.6-win32.zip】里面的头文件和连接库

添加方法参考:http://blog.csdn.net/calmreason/article/details/6989390

直接编译会因为(1)(2)你没有提供而报错:

将libodb的/lib和/odb目录拷贝到libodb-mysql的工程中覆盖

重新编译提示缺少mysql-connector-c头文件:

将mysql-connector-c-2.4.0中的include和lib目录拷贝到odb-mysql-2.4.0的工程中覆盖

重新设置工程属性,编译,编译成功:

Debug生成lib【odb-mysql-d.lib】和dll【odb-mysql-d-2.4-vc10.dll】文件

Release生成lib【odb-mysql-d.lib】和dll【odb-mysql-d-2.4-vc10.dll】文件

编译运行Hello World

官方下载地址   百度云下载:odb-examples-2.4.0.zip

选择examples版本(以MySQL为例):


将【hello-mysql-vc10】project设置为启动项目,直接编译会报错:error MSB6006: "cmd.exe" exited with code 9009.

这是odb环境变量没有设置成功的问题,需要将odb.exe路径设置到系统path变量中(最好重启生效)

之后会提示缺少一些头文件:主要是libodb的头文件、libodb-mysql的头文件

其实是需要:LIBODB(odb-d.lib)、LIBODB-<MYSQL>(odb-mysql-d.lib).(LIBMYSQLCLIENT(mysql-connector-c-6.1.6-win32)这个已经被编译到odblib-mysql中了,所以不需要了)。

头文件自己加,库文件需要什么工程里已经为你写好了:

由于刚才在编译libodb-mysql的时候已经将libodb和mysql-connector-c的资源添加过了。

所以现在只需要将libodb-mysql中的:include、odb、lib这三个目录靠过来并在example(或者你自己的工程)工程属性中添加引用即可。

 

目前项目中的【person.hxx】文件是一个odb模板文件,还不能直接被VS编译使用,项目中的【person-odb.hxx】、【person-odb.cxx】、【person-odb.ixx】也只是空引用,打不开,因为这些文件还不存在,需要odb编译器编译之后生成新的.h文件和.cpp文件才可以被CPP项目使用

将【person.hxx】拷贝到odb的bin目录下,cmd执行:odb -d mysql --generate-query --generate-schema person.hxx

执行完生成【person-odb.hxx】、【person-odb.cxx】、【person-odb.ixx】、【person.sql】这四个文件:

将这四个文件拷贝到本项目【person.hxx】文件同级目录下

 

创建数据库表

用【person.sql】创建数据库表。

可以成功编译:

生成的文件driver.exe在目录:【F:\编程开发\C++\ODB\odb-examples-2.4.0\odb-examples-2.4.0\hello\Debug】下,为了运行exe,需要将运行时库文件

libmysql.dll、odb-d-2.4-vc10.dll、odb-mysql-d-2.4-vc10.dll拷贝到此目录。

执行Start Without Debugging:

2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
请按任意键继续. . .

可以看出程序默认连接本机的MySQL服务,并且企图访问端口:10061。

其实这需要具体的设置:ip,port,usr,psw,默认情况下程序使用命令行获取这些信息,参考2.3 Compiling and Running,关于如何使用database的构造函数直接传递数据库访问信息参考:3.4 Database 

直接修改代码,在代码中写死连接数据库的信息:

原来的代码:

 

[cpp] view plain copy

 

  1. auto_ptr<database> db (create_database (argc, argv));  

修改访问数据库的代码:

 

 

[cpp] view plain copy

 

  1. auto_ptr<odb::database> db (  
  2.     new odb::mysql::database (  
  3.     "root"     // database login name  
  4.     ,"123456" // database password  
  5.     ,"collect" // database name  
  6.     ,"localhost"  
  7.     ,13306  
  8.     ));  

编译运行:

 

这个例子可以跑起来其实是需要odb的所有步骤的,其他例子均可仿照这个例子的做法,自己创建的项目引用odb也是如此!奔跑吧,小怪兽!!

时间: 2025-01-29 13:07:21

【一】ODB - C++ 访问数据库的利器--Hello World On Windows(Version-24)的相关文章

delphi 通过 ado 访问数据库存储过程,如果有插入动作,为什么会执行两遍?

问题描述 delphi 通过 ado 访问数据库存储过程,如果有插入动作,为什么会执行两遍? 20C 如题.这是我反复测试后得出的结论.我实在不理解为什么. 具体测试过程是这样子的:我用ado连接数据库.然后我写了一个简单的存储过程,就是往表里插入数据.然后我用ado调用这个存储过程.然后我就发现,虽然程序里我只调用了一次,但实际上表里的数据却被插入了完全一模一样的两条. 这算是bug还是怎么回事?是不是有什么我不曾注意到的细节没处理好? 存储过程代码如下: create procedure p

实现换一换功能怎么实现 要访问数据库的

问题描述 实现换一换功能怎么实现 要访问数据库的 页面中显示了9条数据,怎么点击换一换然后从后台查询,之后的内容? 解决方案 相当于翻页,原理一样的 解决方案二: SELECT * FROM ( SELECT 表名.*, ROWNUM AS CON FROM 表名 WHERE ROWNUM <= M AND 其它查询条件 ORDER BY 排序条件 ) WHERE CON >=N;查n到m条 解决方案三: 就随机从数据库按某些条件查询另外9组数据咯

Eclipse3.0配置SQLExplorer访问数据库

sql|访问|数据|数据库 英文原文地址: http://www.onjava.com/pub/a/onjava/2005/05/11/sqlexplorer.html中文地址: http://www.matrix.org.cn/resource/article/43/43630_Eclipse_SQLExplorer.html关键词: Eclipse SQLExplorer MySQL JDBC SQLExplorer是Eclipse集成开发环境的一种插件,它可以被用来从Eclipse连接到一

学习ADO和ODBC访问数据库的一些思路整理

ado|odbc|访问|数据|数据库 最近一直在学习研究用vc++访问数据库的问题,使用过ADO,也使用过ODBC.就这两种连接数据源的接口都有好几种方式,可以利用database,也可以利用dataset.利用这个word把我学习的思路整理一下. 一.使用ADO连接数据源 一般来说当建立基于对话框的应用程序时,都选择使用ADO比较方便(这纯属个人习惯问题). 1.直接在应用程序中建立与数据库的connection 2.自己写一个ADOConnection类作为应用程序操作数据库的接口,这样操作

ADO.NET访问数据库的步骤

ado|访问|数据|数据库 不论从语法来看,还是从风格和设计目标来看,ADO.NET都和ADO有显著的不同.在ASP中通过ADO访问数据库,一般要通过以下四个步骤: 1.创建一个到数据库的链路,即ADO.Connection: 2.查询一个数据集合,即执行SQL,产生一个Recordset: 3.对数据集合进行需要的操作: 4.关闭数据链路. 在ADO.NET里,这些步骤有很大的变化.ADO.NET的最重要概念之一是DataSet.DataSet是不依赖于数据库的独立数据集合.所谓独立,就是:即

VB程序如何访问数据库

 通过[Data]控件访问数据库     (1)启动VB.    (2)出现如图10.12所示的新建工程的[新建]选项卡.    (3)出现如图10.13所示的VB主界面.    (4)如图10.14所示.    (5)出现如图10.15所示的[属性窗口]界面.    ―――――――――――――――――――――――――――――――――――――    odbc;dsn=graduateDB;uid=scott;pwd=tiger;    ――――――――――――――――――――――――――――――

用连接池提高Servlet访问数据库的效率 (-)

servlet|访问|数据|数据库 Java Servlet作为首选的服务器端数据处理技术,正在迅速取代CGI脚本.Servlet超越CGI的优势之一在于,不仅多个请求可以共享公用资源,而且还可以在不同用户请求之间保留持续数据.本文介绍一种充分发挥该特色的实用技术,即数据库连接池. 一.实现连接池的意义 动态Web站点往往用数据库存储的信息生成Web页面,每一个页面请求导致一次数据库访问.连接数据库不仅要开销一定的通讯和内存资源,还必须完成用户验证.安全上下文配置这类任务,因而往往成为最为耗时的

Java访问数据库的速度瓶颈问题的分析及解决

访问|解决|数据|数据库|速度|问题 内容: 速度瓶颈问题的提出 JDBC访问数据库的机制 不同模式的JDBC接口的选择 Java程序中SQL语句格式的优化 软件模型中对数据库访问的设计模式的优化 将深入研究的问题 参考资料 关于作者 FoolsGarden@SMTH 自由Java传道士 2001 年 11 月 速度瓶颈问题的提出 在企业级的Java应用中,访问数据库是一个必备的环节.数据库作为数据资源的集散地,往往位于企业级软件体系的后方,供前方的应用程序访问.在Java技术的体系中,应用程序

通过socket访问数据库

访问|数据|数据库 发布者:flyfox Tip:通过socket访问数据库,分 Clinet, Display,sqlServer三个类 Client.java import java.awt.*; import java.io.*; import java.net.*; import java.applet.*; public class Client extends Applet { public TextArea chat_txt; private TextField sql_txt;