首先,我不认为 C++ 在这里起任何重要作用。在 Java、PHP、C 或任何其他客户端语言中,您很可能会遇到完全相同的问题。
其次,一个好的解决方案会考虑到有多大数据。我们是在谈论 1000 行还是几百万行?对于“小”数据,整个转换完全在内存中发生的解决方案可能就足够了。对于“更大”的数据,您可能不得不求助于在磁盘上写入中间数据。
第三,数据完整性如何?当我们将源数据库传输到目标数据库时,是否有可能更改?如果没有,那么一切都会变得更容易。
说了这么多,这里有一个可行的方法:使用INSERT INTO ... SELECT 语法(如果您插入到现有表中)或CREATE TABLE ... AS SELECT(如果您想创建一个新表)。查看INSERT 的 SQLite 文档:
INSERT 语句的第二种形式包含一个 SELECT 语句
而不是 VALUES 子句。一个新条目被插入到表中
执行SELECT语句返回的每一行数据。
...或CREATE TABLE:
“CREATE TABLE ... AS SELECT”语句创建并填充一个
基于 SELECT 语句结果的数据库表。
在这两种情况下,诀窍是创建一个SELECT 语句,该语句返回实际来自源数据库的固定值。
这意味着在您的 C++ 客户端应用程序中,您首先在源数据库中创建一个 SELECT 语句,然后使用它创建一个 INSERT 或 CREATE TABLE 查询字符串,如下所示:
INSERT INTO my_table SELECT 1, "abc", 2 UNION SELECT 123, "def", 456 UNION SELECT 1000, "foo", 2000
... 1、“abc”、2、123、“def”等所有值都来自源数据库,用于在 C++ 应用程序中构建查询。
问题在于,由于UNIONs 很多,这不能很好地扩展,并且它使得使用准备好的语句变得更加困难(代码方面)。但至少这是一种单一陈述的方法。
考虑到所有因素,您可以考虑只保留当前的解决方案,但对所有个人 INSERTs 使用 transaction。这将确保插入所有行或不插入任何行。