在 C# 中读取 BerkeleyDB 数据库行

Posted

技术标签:

【中文标题】在 C# 中读取 BerkeleyDB 数据库行【英文标题】:Reading BerkeleyDB database rows in C# 【发布时间】:2017-12-29 04:51:25 【问题描述】:

我在读取 berkeleyDB 格式文件中的行时遇到了一些问题。我使用 db_dump 实用程序来显示文件中的内容并且有很多条目,但是当我通过代码尝试时,我只能从光标返回一行(一个键和 4 个字节的数据)

DatabaseEntry foundKey = new DatabaseEntry();
DatabaseEntry foundData = new DatabaseEntry();
LockingInfo lockInfo = new LockingInfo();

BTreeCursor cursor = db.DB.Cursor();

while (cursor.MoveNext(foundKey, foundData, lockInfo))

    var kvp = cursor.CurrentMultiple;
    var keyString = Encoding.Default.GetString(foundKey.Data);
    var dataString = Encoding.Default.GetString(foundData.Data);
    Console.WriteLine($"keyString: dataString"); // output: main: 0002
    if(cursor.Count() > 1)
    
        // count is always 1
        Console.WriteLine($"There are duplicate records.");
    

cursor.Close();
db.DB.Close();
db.Environment.Close();

db_dump 输出:

VERSION=3
format=bytevalue
database=main
type=btree
db_pagesize=8192
HEADER=END
 0573262135f0b02634966b36b10c53c58fc6c3a2b8fff9e125be6ac3246..... (hundreds of lines)
DATA=END

知道我做错了什么吗?

【问题讨论】:

【参考方案1】:

看来我必须传递数据库名称才能读取游标中的数据。

打开数据库的时候,我原来是用下面这个,在使用游标的时候只返回数据库头:

db = BTreeDatabase.Open(filename, dbConfig, txn);

我应该在什么时候使用:

db = BTreeDatabase.Open(filename, "main", dbConfig, txn);

【讨论】:

以上是关于在 C# 中读取 BerkeleyDB 数据库行的主要内容,如果未能解决你的问题,请参考以下文章

BerkeleyDb 是适合我的项目的进程内数据库吗?

C#读取大数据量Excel,60W行数据,该怎么处理

C# 文件流 streamreader如何读取文本指定行的数据?

对 BerkeleyDB 数据库进行逆向工程

Berkeley DB 读取数据失败

如何在 C# 中使用数据读取器遍历行?