2015-12-17 35 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时,它工作得很完美。