Npgsql + Dapper ExecuteReader

c# dapper npgsql postgresql

Pregunta

No estoy seguro si esto es un error en Npgsql o Dapper o lo estoy haciendo mal.

Estoy intentando insertar una matriz de registros y devolver las filas insertadas para obtener los ID insertados. Los registros se pasan como un parámetro de matriz de Postgres

Clase c #

public class test
{
    public int id { get; set; }
    public string name { get; set; }
}

Está mapeado a la siguiente tabla

// id is PK sequence
create table test (
    id int,
    name text
)

Aquí está el código de inserción

var sql = @"
with t as (
    insert into public.test t (id, name)
    select i.id, i.name
    from unnest(@items) i left outer join t
    on i.name = t.name
    where i.id is null
    returning *
)";

var items = new[]
{
    new NpgsqlParameter("items", new []
    {
        new test() {name = "x"},
        new test() {name = "y"},
    }
};

// Not using Dapper for command exec as it doesn't support PG composite types
// Only using the RowParser
IList<T> result = new List<test>();
using (var connection = new NpgsqlConnection(...))
{
    connection.MapComposite<test>("public.test");
    using (NpgsqlCommand cmd = new NpgsqlCommand())
    {
        cmd.Connection = connection;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = sql;
        cmd.Parameters.Add(parameters);

        using (var reader = await cmd.ExecuteReaderAsync())
        {
            var hasRows = reader.HasRows; // true
            var rowParser = reader.GetRowParser<test>(typeof(test)); // <== Dapper parser
            result.Add(rowParser(reader)); // <== throws the exception below
        }
    }
}

result.Add(parser(reader)) arroja la siguiente excepción ( IRowParser es una interfaz Dapper)

{System.InvalidOperationException: No row is available
   at Npgsql.NpgsqlDataReader.CheckRow()
   at Npgsql.NpgsqlDataReader.GetValue(Int32 ordinal)

Alguna idea de lo que está mal aquí?

Respuesta popular

Intente agregar un lector. Lectura () llamada.

using (var reader = await cmd.ExecuteReaderAsync())
{
    reader.Read() // <== ADD THIS LINE
    var hasRows = reader.HasRows; // true
    var rowParser = reader.GetRowParser<test>(typeof(test)); // <== Dapper parser
    result.Add(rowParser(reader)); // <== throws the exception below
}

Gracias, su código fue útil para mí, ya que quería saber cómo podría usar los tipos compuestos Dapper y PostgreSQL.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué