首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Npgsql + Dapper ExecuteReader

Npgsql + Dapper ExecuteReader
EN

Stack Overflow用户
提问于 2017-09-25 13:08:23
回答 1查看 1.7K关注 0票数 2

不确定这是Npgsql或Dapper中的错误,还是我做错了。

我尝试插入一个记录数组,并返回插入的行以获取插入的ids。记录将作为Postgres数组参数传递

c#类

代码语言:javascript
复制
public class test
{
    public int id { get; set; }
    public string name { get; set; }
}

它映射到下表

代码语言:javascript
复制
// id is PK sequence
create table test (
    id int,
    name text
)

下面是插入代码

代码语言:javascript
复制
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是一个Dapper接口)

代码语言:javascript
复制
{System.InvalidOperationException: No row is available
   at Npgsql.NpgsqlDataReader.CheckRow()
   at Npgsql.NpgsqlDataReader.GetValue(Int32 ordinal)

你知道这是怎么回事吗?

EN

回答 1

Stack Overflow用户

发布于 2017-11-24 06:05:11

尝试添加reader.Read()调用。

代码语言:javascript
复制
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复合类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46397957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档