使用游标查询记录的时候,需要连续执行3次才能得到正确的结果,前面2次都只能得到一条记录
比如key=100的时候数据库里有20条记录,前几次执行的时候能得到20条记录,但是这20条记录是完全相同的,3次之后得到结果才是正确的,请问有没有人碰到类似的问题
DBC *cursorp = NULL;

try
{
if(m_db->cursor(m_db, NULL, &cursorp, 0) != 0)
{
return FALSE;
}

if (cursorp->get(cursorp, key, data, DB_SET) != 0) 
{
cursorp->close(cursorp);
return false;
}
Message *pack = (Message *)data->data;

pCtrl->ShowDbMsg(pdlg, pack);
while ((ret = cursorp->get(cursorp, key, data, DB_NEXT_DUP)) == 0) 
{
pCtrl->ShowDbMsg(pdlg, pack);
}
if (ret != DB_NOTFOUND) 

AfxMessageBox("查找出错");
}

if (cursorp != NULL) 
cursorp->close(cursorp);
    }
catch(...) 
{
AfxMessageBox("出错啦!");
    }

解决方案 »

  1.   

    参考一下这个DB是否有对应的example等,是否调用正确...
      

  2.   

    很早以前写过BDB程序,但是遍历查找没出现过LZ问题,LZ再仔细检查一下。。
      

  3.   

    我的代码如下,测试是正常的,如果还出现你说的情况,应该是别的原因了。 DB *dbp = (DB *)hConfig;
    DBC *cursorp;
    DBT key, data;
    int ret;

    /* Database open omitted for clarity */

    /* Get a cursor */
    dbp->cursor(dbp, NULL, &cursorp, 0); 

    /* Initialize our DBTs. */
    memset(&key, 0, sizeof(DBT));
    memset(&data, 0, sizeof(DBT));

    /* Iterate over the database, retrieving each record in turn. */
    while ((ret = cursorp->get(cursorp, &key, &data, DB_NEXT)) == 0) {
            RecordsBackCall(key.data,key.size,data.data,data.size);
    }
    if (ret != DB_NOTFOUND) {
            /* Error handling goes here */
    ret = 0;
    }

    /* Cursors must be closed */
    if (cursorp != NULL) 
    cursorp->close(cursorp); 


    return ret;
    我们的差别在于DB_NEXT和DB_NEXT_DUP 
      

  4.   

    BDB这个数据库蛮不错的,在少量数据下速度很快(1万条记录写只要70ms),而且简单~~当初我用来做程序的数据配置模块,都好几年了。