<强> * ---编辑 - 现在整个SOURSE *

当我调试它的结束,“get”和“价值”有不同的值!也许,我转换为无效*和回用户走错了路?

#include <db_cxx.h>
#include <stdio.h>

struct User{
User(){}
int name;
int town;
User(int a){};
inline int get_index(int a){
    return town;
} //for another stuff
};
int main(){ 
try {
DbEnv* env = new DbEnv(NULL);
env->open("./", 
    DB_CREATE | DB_INIT_MPOOL | DB_THREAD | 
DB_INIT_LOCK | DB_INIT_TXN | DB_RECOVER | DB_INIT_LOG, 0);
Db* datab = new Db(env, 0);
datab->open(NULL, "db.dbf", NULL, DB_BTREE, DB_CREATE | DB_AUTO_COMMIT, 0);

Dbt key, value, get;
char a[10] = "bbaaccd";
User u;
u.name = 1;
u.town = 34;
key.set_data(a);
key.set_size(strlen(a) + 1 );
value.set_data((void*)&u);
value.set_size(sizeof(u));
get.set_flags(DB_DBT_MALLOC);

DbTxn* txn;
env->txn_begin(NULL, &txn, 0);
datab->put(txn, &key, &value, 0);
datab->get(txn, &key, &get, 0);
txn->commit(0);
User g;
g = *((User*)&get);
printf("%d", g.town);
getchar();
return 0;
}catch (DbException &e){
    printf("%s", e.what());
    getchar();
}

<强>溶液

创造出一种“serializator”什么将转换所有POD的成无效*,然后将联合这些作品

PS或者我会重写用户到POD类型,一切都会好起来的,我希望。

添加

很奇怪,但...我投了defenetly非POD对象无效*和背面(它的std :: string内)和它的所有权利(不将其发送到数据库和背面)。怎么会这样?之后我投送和“波谷” DB(没有额外的方法,所有成员都是吊舱,这是一个简单的结构{INT一个; INT B; ...})defenetly荚对象,我回去dirted之一。这有什么错我的方法?

添加约一周第一 '添加' 之后

该死......我编译它的,只是必须在哪种污垢它returnes,呵呵看看吧!它的好!......我不能! !... ..将AAh主...一个合理的问题(在情况99.999%正确的答案是“我的”,但是......这里...) - 卫生组织是这个故障?我的或VSS?

有帮助吗?

解决方案

除非User POD 这是用C ++未定义

编辑:

看着 db_cxx.h ,你不应该做的通话get_doff()get_dlen()get_data()Dbt不只是投放(和分配)的东西它给用户类型?

其他提示

由于没有放(),它很可能是的返回值的检查有其防止更新错误。 文档表明相当多的错误condtions:

您几乎肯定不应该投“得到”直接给用户。取而代之的是,提取您存储数据,然后投一点。我们不能确切地知道,除非你与我们分享DBT的定义。做一个猜想,根据我们的可以的看到:

datab->get(txn, &key, &get, 0);
void* data = get.get_data();
User g = *((User*)data);

更告诉我们DBT,我们也许可以帮助您了解更多信息。

我会做这样的事情:

User               user;
std::stringstream  dbStotrStream;

dbStoreStream << user;  // Serialize user
std::string        dbStore(bdStoreStream.str());
value.set_data(dbStore.c_str());  
value.set_size(dbStore.lenght());

////  Put in DB

然后提取它是这样的:

//// Get from DB

std::string        dbStore(get.get_data(),get.get_date() + get.get_size());
std::stringstream  dbStoreStream(dbStore);
User              outUser;

 dbStoreStream >> outUSer;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top