Npgsql + Dapper ExecuteReader
问题描述:
不知道这是Npgsql或Dapper中的错误还是我做错了。Npgsql + Dapper ExecuteReader
我想插入一个记录数组并返回插入的行来获取插入的ID。记录被如
C#类
public class test
{
public int id { get; set; }
public string name { get; set; }
}
它被映射下表
// id is PK sequence
create table test (
id int,
name text
)
这里一个Postgres阵列参数传递的插入码
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))
投以下例外(IRowParser
是一个小巧玲珑接口)
{System.InvalidOperationException: No row is available
at Npgsql.NpgsqlDataReader.CheckRow()
at Npgsql.NpgsqlDataReader.GetValue(Int32 ordinal)
任何想法这里有什么问题吗?
答
尝试添加reader.Read()调用。
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
}
感谢您的代码对我有用,因为我想知道如何使用Dapper和PostgreSQL复合类型。
是你的'rowParser'有价值吗?你的'结果'是一类行吗? –
'rowParser'是一个'IRowParser',它是一个Dapper接口。 'result'是一个'List' – ubi
'result'是什么的列表? –