C++ API访问Berkeley DB XML数据库问题
作者:gobitan(雨水) 日期:2007-03-18 转载请注明出处http://blog.csdn.net/gobitan
Berkeley DB XML是一个开源的嵌入式的原生XML(native-XML)数据库。它对外提供多种访问接口,如C++、Java、Perl、Python、PHP、Tcl、Ruby等。在使用C++接口的过程中并非一帆风顺,如有一处设置不当就可能导致失败。这里笔者将整个过程中遇到的问题写了出来,希望对后面的使用者有所帮助。
在自己建立工程操作Berkeley DB XML数据库时需要引用到该数据库的很多DLL,这个跟访问SQL Server等数据库是不一样的,因为 Berkeley DB XML是嵌入式数据库,它跟应用程序运行在相同的地址空间,处于同一个进程。
这里以Visual Studio.net 2003的C++环境为例。
1.创建工程。先新建一个空白的解决方案Solution1,然后在该解决方案中新建一个W
2.添加Berkeley DB XML头文件。头文件的位于C:/Program Files/Oracle/Berkeley DB XML
3.添加lib和DLL文件。lib位于C:/Program Files/Oracle/Berkeley DB XML
4.编写测试代码
/* file Test.cpp */
us
{
// An empty str
// will not be persisted
std::str
std::str
std::str
try {
// All BDB XML programs require an XmlManager
XmlManager mgr;
XmlConta
// All Conta
XmlUpdateContext uc = mgr.createUpdateContext();
cont.putDocument(docName, content, uc);
// Now, get the document
XmlDocument doc = cont.getDocument(docName);
std::str
std::str
docContent = doc.getContent(docContent);
// pr
std::cout << "Document name: " << name << "/nContent: " <<
docContent << std::endl;
//
// of scope.
} catch (XmlException &xe) {
std::cout << "XmlException: " << xe.what() << std::endl;
}
return 0;
}
5.设置工程属性。
打开工程属性页,
(1)将预编译头设置为”不使用预编译头”;
(2)添加附加包含目录,例如D:/sourcecode/Solution1/Test(Test工程所在目录)
(3)添加附加依赖项。包括libdbxml23.lib libdb45.lib xerces-c_2.lib xqilla10.lib。
6.运行。这时你会发现程序崩溃,根本无法运行。
这时默认是在Debug模式,你将它改为Release模式,嘿,成功了。事实上远没有这么简单,如果到此为止的话,这边文章也就没有写的必要了。
我们编写程序不可能在Release下整吧,程序是调出来的啊。因此必须搞定Debug模式下的运行问题。可能你刚才在拷贝lib文件时已经发现C:/Program Files/Oracle/Berkeley DB XML
那么是不是把上面的lib文件替换为这四个文件(libdbxml23d.lib、libdb45d.lib、xerces-c_2D.lib、xqilla10d.lib)就可以了呢?没那么简单!你还需要打开Berkeley DB XML的源代码工程,然后在Debug模式下生成一边(编译Berkeley DB XML源代码很简单,这里不多述),这时你就能在C:/Program Files/Oracle/Berkeley DB XML
如果说把上面DLL文件替换为这四个DLL就可以了,我也没有写这篇文章的必要了。好,不管怎么说先把上面提到的八个文件替换了再说。这时当然要将工程属性中的附加依赖项改为” libdbxml23d.lib libdb45d.lib xerces-c_2D.lib xqilla10d.lib”。然后开始生成解决方案比运行,你会发现问题依然没有解决,在Debug模式还是存在程序崩溃的问题。
我一一查看项目配置属性以及是否有什么DLL没有加载全还是什么其他之类的原因,最后终于解决。原来代码生成中有个选项”运行时库”,系统默认是” 单线程调试(/MLd)”,这里一定要选择” 多线程调试 DLL (/MDd)”这一项。如图所示:
这个问题我第一次遇到时可是耗费了我好几个小时,也是我想把它写出来的原因,节约一点大家的时间。
题外话:我平时遇到技术问题也喜欢到网上去搜找解决办法,这大大地节约了我解决问题的时间,提高了工作效率。网上找不到的时我就自己独立解决。平时在网上获益于那些把自己的心得写出来奉献到网上的朋友,这里感谢他们!俗话说“来而不往非礼也!”我也有把自己的所得与大家分享的义务!如果我们都能把自己解决问题的办法花点时间写出来,我想我们每个人都将从中受益非浅!此所谓“我为人人,人人为我!”。
----胡家辉