上下文
我正在使用很棒的 DuckDB.NET 库和 C# 此示例。我专门与 ADO.NET 提供商合作。
问题
我的数据库包含下表:
CREATE TABLE tbl01 (
Id INTEGER,
TextListTest TEXT[],
DateTest DATE
);
在程序中,每条记录都由一个类封装:
class Record
{
public int Id { get; set; }
public List<string> TextListTest { get; set; };
public DateTime TextListTest { get; set; };
}
并附加到List<Record>
.此列表得到 非常大,所以我想避免INSERT
语句的每行开销 圈。文档说,如果我绝对必须使用 以这种方式插入我还应该将它们包装在BEGIN TRANSACTION
和COMMIT
的调用中.我 真的不想错过这里的插入性能。有没有另一种方法可以使用 我正在使用的库?
我注意到 DuckDB.NET 示例与LowLevelBindingsSample()
我可以使用预准备语句的方法,但我不确定这是否会带来任何性能优势。
有没有我缺少的方法 - 也许是附加器?如果有人可以使用 3 个特定数据提供示例 上表中的类型将不胜感激(我无法弄清楚LIST
列)。
using DuckDB.NET.Data;
namespace DuckTest;
class Record
{
public int Id { get; set; }
public List<string> TextListTest { get; set; }
public DateTime DateTest { get; set; }
}
class Program
{
public static void Main(string[] args)
{
// pretend this is a really big list!
List<Record> recordList = new List<Record>
{
new Record { Id = 1, TextListTest = new List<string> { "Ball", "Horse" }, DateTest = new DateTime(1994, 12, 3) },
new Record { Id = 2, TextListTest = new List<string> { "Matthew", "Giorgi is cool!" }, DateTest = new DateTime(1998, 11, 28) },
new Record { Id = 3, TextListTest = new List<string> { "Red", "Black", "Purple" }, DateTest = new DateTime(1999, 9, 13) },
new Record { Id = 4, TextListTest = new List<string> { "Cat" }, DateTest = new DateTime(1990, 2, 5) },
};
using (var duckDBConnection = new DuckDBConnection("Data Source=db01.duckdb"))
{
duckDBConnection.Open();
var command = duckDBConnection.CreateCommand();
command.CommandText = "CREATE TABLE tbl01 ( Id INTEGER, TextListTest TEXT[], DateTest DATE );";
var executeNonQuery = command.ExecuteNonQuery();
// I could do this in a loop but there's probably a better way...
command.CommandText = "INSERT INTO tbl01 VALUES (1, ['Ball', 'Horse'], '1994-12-03');";
executeNonQuery = command.ExecuteNonQuery();
}
}
}
如果需要,我愿意使用低级绑定库。
该库支持追加器,因此这应该是导入数据的最快方法。