When querying tables with a decimal data type, duckdb.net returns an error "DuckDBQuery failed". This occurs where the decimal values in the table are NULL or has a value.
The query should return the decimal values stored in the table.
using System;
using System.Data.Common;
using DuckDB.NET.Data;
namespace DuckDbDecimalIssue
{
internal class Program
{
static void Main(string[] args)
{
// Using duckdb.dll from:
// https://github.com/duckdb/duckdb/releases/download/v0.3.1/libduckdb-windows-amd64.zip
var connectionString = "Data Source=db.duckdb;";
using (var cn = new DuckDBConnection(connectionString))
{
cn.Open();
Execute(cn, @"DROP TABLE IF EXISTS test;");
Execute(cn, @"CREATE TABLE test (dec DECIMAL(18, 4) NULL, value FLOAT NULL);");
Execute(cn, @"INSERT INTO test (dec, value) SELECT NULL, 10");
var query = "SELECT * FROM test";
using (var reader = ExecuteReader(cn, query))
{
while (reader.Read())
{
Console.WriteLine($"{reader[0]}\t{reader[1]}");
}
}
}
}
static void Execute(DuckDBConnection cn, string sql)
{
var createTableCommand = cn.CreateCommand();
createTableCommand.CommandText = sql;
createTableCommand.ExecuteNonQuery();
}
static DbDataReader ExecuteReader(DuckDBConnection cn, string sql)
{
var createTableCommand = cn.CreateCommand();
createTableCommand.CommandText = sql;
return createTableCommand.ExecuteReader();
}
}
}
If you change the column type of "dec" above to INT, then the code works properly.