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?) –
我只是在從它讀取數據之前創建數據庫。因此,你所說的情況對於這個問題是不可能的。不管怎麼說,還是要謝謝你。我學到了一些有用的東西,謝謝你:) –
我剛剛嘗試刪除而不是閱讀。它給出了同樣的錯誤。我認爲問題在於「關鍵」問題。 –