2015-12-17 54 views
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方法,但我找不到真正的東西。

+0

您是否檢查過此問題「導致錯誤的最常見原因是您嘗試使用更高版本的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?) –

+0

我只是在從它讀取數據之前創建數據庫。因此,你所說的情況對於這個問題是不可能的。不管怎麼說,還是要謝謝你。我學到了一些有用的東西,謝謝你:) –

+0

我剛剛嘗試刪除而不是閱讀。它給出了同樣的錯誤。我認爲問題在於「關鍵」問題。 –

回答

0

我找不到問題。但是,當我使用DB_BTREE而不是DB_RECNO時,它工作得很完美。