C# Berkeley DB重复密钥错误

C# Berkeley DB重复密钥错误,c#,.net,berkeley-db,C#,.net,Berkeley Db,我一直在尝试让伯克利DB为我的C项目启动并运行。我从Oracle下载并构建了.NET版本。在很大程度上,它以我所期望的方式工作,表现得像个冠军。但我遇到的一个问题与重复钥匙有关 首先,每次我尝试使用.putnodupplicate方法时,它都会抛出一个错误,即使该键不是dupe db.PutNoDuplicate(k, v); 控制台上的输出显示为DB->put指定的非法标志,并引发异常,错误代码为22。异常本身不包含任何信息 所以我想,好吧,也许这个方法有问题,我自己检查一下。我把密码改成

我一直在尝试让伯克利DB为我的C项目启动并运行。我从Oracle下载并构建了.NET版本。在很大程度上,它以我所期望的方式工作,表现得像个冠军。但我遇到的一个问题与重复钥匙有关

首先,每次我尝试使用.putnodupplicate方法时,它都会抛出一个错误,即使该键不是dupe

db.PutNoDuplicate(k, v);
控制台上的输出显示为DB->put指定的非法标志,并引发异常,错误代码为22。异常本身不包含任何信息

所以我想,好吧,也许这个方法有问题,我自己检查一下。我把密码改成

if (db.Exists(k))
    throw new System.Data.DataException("Duplicate key");
else
    db.Put(k, v);
这是可行的,但速度非常慢。作为参考,当只调用db.Put时,它几乎会立即添加大约10000条记录,但在执行上述db.Exists检查时,速度会减慢到大约每秒40条记录。那不可能是对的

有人能提供一些关于正在发生的事情的见解吗?谢谢


编辑:所以我找到了其中的一部分。由于Berkeley db代码在函数返回false时会定期抛出并在内部处理异常,因此db.Exists检查的速度变慢。当我运行代码的发布版本时,速度回到了我预期的水平。但我还是想知道为什么putNoDuplicate调用一开始就失败了

我没有与Berkeley DB合作过,但是他们的文档和常见问题解答看起来相当不错。在您的情况下,我建议您阅读并遵循他们关于获取冗长消息的建议,这可能会告诉您发生了什么。实际上,我一直在深入研究这一问题,但尚未发现有关错误原因的更多信息。