问题描述
所以这听起来像是一个愚蠢的问题,但是我已经查阅了Berkeley DB C ++ API的大多数官方文档,而且似乎找不到答案。如何检查数据库中是否存在密钥?这是一些示例代码。
// Database created.
Dbt key(&some_string,some_size);
Dbt data(&some_struct,some_other_size);
database.put(nullptr,&key,&data,0);
// Now my &some_string key is definitely in the database,and I can easily get it.
// However if I create an identical string to search for the key,I get DB_NOTFOUND
Dbt search_key(&the_same_string,the_same_size);
int ret = database.exists(nullptr,&search_key,0);
// This returns DB_NOTFOUND.
如果我传递原始密钥Dbt对象,则ret当然为0。但是,如果您还没有该确切记录的关联Dbt对象,那么是否无法检查密钥是否存在?
我还尝试使用游标,并且如果设置DB_FirsT标志,则Dbc :: get()可用于查找键。但是那个会自动写入我传递的任何数据Dbt对象中。
我要做的就是检查是否存在带有特定密钥的Dbt对象,仅此而已。
解决方法
用于实例化Dbt
的第二个参数只是整数大小,而不是指针。因此,例如,您的一行:
Dbt key(&some_string,&some_size);
应成为:
Dbt key(&some_string,some_size);
此外,如果您的some_string
是std::string
,则必须将其转换为纯C字符数组。考虑在写入数据库的字符串中包含NUL
终止符。您不必这样做,但这通常使调试更容易。