woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

C++ API访问Berkeley DB XML数据库问题

Berkeley DB XML是一个开源的嵌入式的原生XMLnative-XML)数据库。它对外提供多种访问接口,如C++JavaPerlPythonPHPTclRuby等。在使用C++接口的过程中并非一帆风顺,如有一处设置不当就可能导致失败。这里笔者将整个过程中遇到的问题写了出来,希望对后面的使用者有所帮助。

在自己建立工程操作Berkeley DB XML数据库时需要引用到该数据库的很多DLL,这个跟访问SQL Server等数据库是不一样的,因为 Berkeley DB XML是嵌入式数据库,它跟应用程序运行在相同的地址空间,处于同一个进程。

这里以Visual Studio.net 2003C++环境为例。

1.创建工程。先新建一个空白的解决方案Solution1,然后在该解决方案中新建一个Win32控制台项目Test,工程会自动生成很多文件。保留Test.cpp,其他文件全部删除。

2.添加Berkeley DB XML头文件。头文件的位于C:\Program Files\Oracle\Berkeley DB XML 2.3.10\include(默认安装路径),将下面的所有文件拷贝至Test目录下。

3.添加libDLL文件。lib位于C:\Program Files\Oracle\Berkeley DB XML 2.3.10\lib目录下,共四个libdbxml23.liblibdb45.libxerces-c_2.libxqilla10.libDLL位于C:\Program Files\Oracle\Berkeley DB XML 2.3.10\bin目录下,共有四个分别为libdbxml23.dlllibdb45.dllxerces-c_2_7.dllxqilla10.dll。注意,将lib拷贝到Test目录下,DLL拷贝到Test/Debug(要先生成一下项目才会产生这样一个目录)目录下。

4.编写测试代码

/* file Test.cpp */

#include <dbxml/DbXml.hpp>

 

   using namespace DbXml;

 

   int main(int argc, char **argv)

   {

    // An empty string means an in-memory container, which

    // will not be persisted

    std::string containerName = "";

    std::string content = "<hello>Hello World</hello>";

    std::string docName = "doc";

  

    try {

     // All BDB XML programs require an XmlManager instance

     XmlManager mgr;

     XmlContainer cont = mgr.createContainer(containerName);

   

     // All Container modification operations need XmlUpdateContext

     XmlUpdateContext uc = mgr.createUpdateContext();

     cont.putDocument(docName, content, uc);

   

     // Now, get the document

     XmlDocument doc = cont.getDocument(docName);

     std::string docContent;

     std::string name = doc.getName();

     docContent = doc.getContent(docContent);

   

     // print it

     std::cout << "Document name: " << name << "\nContent: " <<

      docContent << std::endl;

   

     // In C++, resources are released as objects go out

     // of scope.

     } catch (XmlException &xe) {

     std::cout << "XmlException: " << xe.what() << std::endl;

    }

       return 0;

   }

5.设置工程属性。

打开工程属性页,

1)将预编译头设置为”不使用预编译头”;

2)添加附加包含目录,例如D:\sourcecode\Solution1\TestTest工程所在目录)

3)添加附加依赖项。包括libdbxml23.lib libdb45.lib xerces-c_2.lib xqilla10.lib

6.运行。这时你会发现程序崩溃,根本无法运行。

   这时默认是在Debug模式,你将它改为Release模式,嘿,成功了。事实上远没有这么简单,如果到此为止的话,这边文章也就没有写的必要了。

我们编写程序不可能在Release下整吧,程序是调出来的啊。因此必须搞定Debug模式下的运行问题。可能你刚才在拷贝lib文件时已经发现C:\Program Files\Oracle\Berkeley DB XML 2.3.10\lib下还有另外四个lib文件。与前面提到的四个文件的区别是文件名后面多了一个d,很明显这是用于调试的。

那么是不是把上面的lib文件替换为这四个文件(libdbxml23d.liblibdb45d.libxerces-c_2D.libxqilla10d.lib)就可以了呢?没那么简单!你还需要打开Berkeley DB XML的源代码工程,然后在Debug模式下生成一边(编译Berkeley DB XML源代码很简单,这里不多述),这时你就能在C:\Program Files\Oracle\Berkeley DB XML 2.3.10\dbxml\build_windows\Debug下找到这四个调试版的文件(libdbxml23d.dlllibdb45d.dllxerces-c_2_7D.dllxqilla10d.dll)

如果说把上面DLL文件替换为这四个DLL就可以了,我也没有写这篇文章的必要了。好,不管怎么说先把上面提到的八个文件替换了再说。这时当然要将工程属性中的附加依赖项改为” libdbxml23d.lib libdb45d.lib xerces-c_2D.lib xqilla10d.lib”。然后开始生成解决方案比运行,你会发现问题依然没有解决,在Debug模式还是存在程序崩溃的问题。

我一一查看项目配置属性以及是否有什么DLL没有加载全还是什么其他之类的原因,最后终于解决。原来代码生成中有个选项”运行时库”,系统默认是” 单线程调试(/MLd)”,这里一定要选择” 多线程调试 DLL (/MDd)”这一项。

 

posted on 2009-08-18 21:37 肥仔 阅读(897) 评论(0)  编辑 收藏 引用 所属分类: 数据库


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理