Getting Started
ADO.NET Provider and Low-Level Library
There are two ways to work with DuckDB from C#: You can use ADO.NET Provider or use a low-level bindings library for DuckDB. The ADO.NET Provider is built on top of the low-level library and is the recommended and most straightforward approach to work with DuckDB.
In both cases, two NuGet packages are available: The Full package that includes the DuckDB native library and a managed-only library that doesn't include a native library.
ADO.NET Provider | Includes DuckDB library | |
---|---|---|
DuckDB.NET.Bindings | ❌ | ❌ |
DuckDB.NET.Bindings.Full | ❌ | ✅ |
DuckDB.NET.Data | ✅ | ❌ |
DuckDB.NET.Data.Full | ✅ | ✅ |
Using ADO.NET Provider
dotnet add package DuckDB.NET.Data.Full
DuckDB.NET follows the ADO.NET provider model and its API. The following snippet shows how to run basic operations:
using var duckDBConnection = new DuckDBConnection("Data Source=file.db");
duckDBConnection.Open();
using var command = duckDBConnection.CreateCommand();
command.CommandText = "CREATE TABLE integers(foo INTEGER, bar INTEGER);";
var executeNonQuery = command.ExecuteNonQuery();
command.CommandText = "INSERT INTO integers VALUES (3, 4), (5, 6), (7, NULL);";
executeNonQuery = command.ExecuteNonQuery();
command.CommandText = "Select count(*) from integers";
var count = command.ExecuteScalar();
command.CommandText = "SELECT foo, bar FROM integers";
using var reader = command.ExecuteReader();
for (var index = 0; index < reader.FieldCount; index++)
{
var column = reader.GetName(index);
Console.Write($"{column} ");
}
Console.WriteLine();
while (reader.Read())
{
for (int ordinal = 0; ordinal < reader.FieldCount; ordinal++)
{
if (reader.IsDBNull(ordinal))
{
Console.WriteLine("NULL");
continue;
}
var val = reader.GetFieldValue<int>(ordinal);
Console.Write(val);
Console.Write(" ");
}
}