database - 混合 C++/CLI 代码与 Berkeley DB

标签 database visual-c++ c++-cli berkeley-db mixed-mode

我打算在 C++/CLI 中以 /clr 模式使用 Berkeley DB。我写了这段代码:

编辑:

// DB_test1.cpp : main project file.

#include "stdafx.h"
#pragma comment(lib,"libdb51")
using namespace System;
using namespace System::Runtime::InteropServices;

int main(array<System::String ^> ^args)
{
    Db SigDb(0,0);
    unsigned int oFlags= DB_CREATE;
    SigDb.open(NULL,"SigDb.db",0,DB_BTREE,oFlags,0);
    String^ HexSig="D8B1048900ABFF8B";
    wchar_t* a=( wchar_t* )Marshal::StringToHGlobalUni(HexSig).ToPointer() ;
    wchar_t* A=( wchar_t* )Marshal::StringToHGlobalUni(HexSig).ToPointer();;

    Dbt key1(&a,100);
    Dbt data1(&A,100);

    Marshal::FreeHGlobal(IntPtr(A));
    int ret= SigDb.put(NULL,&key1,&data1, DB_NOOVERWRITE);
    if(ret==DB_KEYEXIST){
        Console::WriteLine("You are trying to insert an exist key!");
    }


    wchar_t DDData[200];
    Dbt getKey, getData;
    getKey.set_data(&a);

    getKey.set_size(100);
    getData.set_data(DDData);
    getData.set_ulen(200);
    getData.set_flags(DB_DBT_USERMEM);
    Marshal::FreeHGlobal(IntPtr(a));
    if(SigDb.get(NULL,&getKey,&getData,0)==DB_NOTFOUND)
        Console::WriteLine("Not Found !");
    else
        Console::WriteLine(" {0}",Marshal::PtrToStringUni((IntPtr)DDData));


    return 0;
}

代码编译成功,但输出错误。我只是想将 String^ HexSig="D8B1048900ABFF8B"; 存储在 SigDb.db 中,然后直接读取相同的字符串并打印它!。结果不像预期的那样显示为 D8B1048900ABFF8B,而是显示为随机字符串。有什么想法吗?

编辑后: 这段代码始终执行 Console::WriteLine("Not Found !");

最佳答案

我发现您的应用程序存在两个问题:

1) 对 Marshal::FreeHGlobal 的两次调用是在使用缓冲区内容之前进行的。您不应该在 put 操作之后释放“A”,并且在 put 和 get 操作之后您不应该释放“a”。

2) 您将指针存储在 Berkeley DB 中,而不是字符串本身。这是由于 Dbt 构造函数调用。你的申请是: Dbt key1(&a,100); 它应该是: Dbt key1(a, 100);

与 getKey.set_data 方法类似 - 它应该使用指针,而不是对指针的引用。

一旦我对您的应用程序进行了上述更改,它就会按预期运行。

问候, 亚历克斯戈罗德 甲骨文伯克利数据库

关于database - 混合 C++/CLI 代码与 Berkeley DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5715988/

相关文章:

java - 如何动态处理java代码中的新表列

sql - SequelizeJS 软删除

database - 按应用程序主题组织 SQL 文件值得头疼吗?

c++ - 减少实时绘图数据的有效方法

c++ - Visual C++中消息回调函数的执行顺序

android - 构建房间期间出现 StackOverflowError

c++ - CryptGenRandom 输出与 rand() 调用不同

c++ - 将非托管 C++ 对象传递到托管 C++ 代码

c++-cli - CLI/C++ 发布 .exe?

c++ - 带有非托管 SQLite 的混合 C++/CLI 代码