0
我正在为Berkeley DB工作。但是我有一个关于从数据库读取文件的问题。伯克利数据库读取数据失败
当一个像
程序创建数据库
开放
写
阅读
接近
在执行中根本没有问题。
但是,当我写入数据到db文件,并关闭它,然后再次打开并尝试读取,它会引发错误。代码中没有编译错误或任何警告。在dbRead()方法中,当程序进入db-> get(...)部分时,会抛出一个错误,如:
BDB1001 illegal record number size
get error (22): Invalid argument
我的代码写入DB是;
int dbWrite()
{
DB *db;
DBT key, data;
int ret;
ret = db_create(&db, NULL, 0);
if(ret != 0)
{
db->err(db, ret, "db_create error (%d)", ret);
return 1;
}
ret = db->set_re_source(db, "db");
if(ret != 0)
{
db->err(db, ret, "set_re_source error (%d)", ret);
return 2;
}
ret = db->open(db, NULL, "db", NULL, DB_RECNO, DB_CREATE, 0);
if(ret != 0)
{
db->err(db, ret, "open error (%d)", ret);
return 3;
}
memset(&key, 0, sizeof(key));
key.data = "key";
key.size = strlen("key");
memset(&data, 0, sizeof(data));
data.data = "data";
data.size = strlen("data");
ret = db->put(db, NULL, &key, &data, DB_APPEND);
if(ret != 0)
{
db->err(db, ret, "put error (%d)", ret);
return 4;
}
ret = db->close(db, 0);
if(ret != 0)
{
fprintf(stderr, "close error (%d)", ret);
/* db->err(db, ret, ""); */
return 7;
}
return 12;
}
我的代码,从DB读的(一部分程序引发的错误是在这里。)
int dbRead(){
DB *db;
DBT data;
int ret;
ret = db_create(&db, NULL, 0);
if(ret != 0)
{
db->err(db, ret, "db_create error (%d)", ret);
return 1;
}
ret = db->set_re_source(db, "db");
if(ret != 0)
{
db->err(db, ret, "set_re_source error (%d)", ret);
return 2;
}
ret = db->open(db, NULL, "db", NULL, DB_RECNO, DB_CREATE, 0);
if(ret != 0)
{
db->err(db, ret, "open error (%d)", ret);
return 3;
}
memset(&key, 0, sizeof(key));
key.data = "key";
key.size = strlen("key");
memset(&data, 0, sizeof(data));
data.size = 255;
ret = db->get(db, NULL, &key, &data, 0);
if(ret != 0)
{
db->err(db, ret, "get error (%d)", ret);
return 5;
}
printf("OK \n");
printf("Data: %s \n", data.data);
return 11;
};
此外,dbWrite的回报是12和dbRead的回归5.我知道,点是db-> get方法,但我找不到真正的东西。
您是否检查过此问题“导致错误的最常见原因是您尝试使用更高版本的Berkeley DB库打开早期的Berkeley DB文件。” (请参阅https://docs.python.org/2/faq/library.html#i-tried-to-open-berkeley-db-file-but-bsddb-produces-bsddb-error-22-invalid-参数-help-how-can-i-restore-my-data?) –
我只是在从它读取数据之前创建数据库。因此,你所说的情况对于这个问题是不可能的。不管怎么说,还是要谢谢你。我学到了一些有用的东西,谢谢你:) –
我刚刚尝试删除而不是阅读。它给出了同样的错误。我认为问题在于“关键”问题。 –