使用现有字段值和 C# 函数在 SQLite 数据库中填充新字段

Populate new field in SQLite database using existing field value and a C# function

我有一个 SQLite 数据库,我想为其填充一个基于现有字段的新字段。我想使用 C# 函数导出新字段值。

在伪代码中,它类似于:

foreach ( record in the SQLite database)
{
my_new_field[record_num] = my_C#_function(existing_field_value[record_num]);
}

查看了 Whosebug 上的其他建议后,我使用 SqliteDataReader 读取每条记录,然后 运行 基于特定 RowId 的 SQlite "UPDATE" 命令更新新字段值对于同一条记录。

它可以工作....但它真的很慢并且像疯了似的敲打着硬盘。真的没有更好的办法吗?

我需要更新的一些数据库可能有数百万条记录。

在此先感谢您的帮助。

编辑:

作为对评论的回应,这里有一些使用称为 Concordance CPL 的遗留语言的真实代码。需要注意的重要一点是,您可以一次性读取和写入对当前记录的更改:

int db;

cycle(db)
{
db->FIRSTFIELD = myfunction(db->SECONDFIELD);
}

myfunction(text input)
{
text output;

/// code in here to derive output from input

return output;
}

我觉得在 SQLite 中没有等效的方法来执行此操作,因为 SQL 本质上是事务性的,而 Concordance 允许您按顺序遍历和更新数据库。

答案是将所有更新打包到一个事务中。

这里有一个用于批量插入的示例: https://www.jokecamp.com/blog/make-your-sqlite-bulk-inserts-very-fast-in-c/

在我的例子中,这将是基于 RowID 的批量更新打包到单个事务中。

它现在可以工作了,性能提高了很多个数量级。

编辑:根据上面的有用评论,定义自定义 C# 函数然后在单个 UPDATE 命令中引用它也很有效,并且在某些方面比上面更好,因为您不必在内部循环C#本身。参见例如Create/Use User-defined functions in System.Data.SQLite?