2017-09-25 72 views
1

不知道这是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) 

任何想法这里有什么问题吗?

+0

是你的'rowParser'有价值吗?你的'结果'是一类行吗? –

+0

'rowParser'是一个'IRowParser',它是一个Dapper接口。 'result'是一个'List' – ubi

+0

'result'是什么的列表? –

回答

0

尝试添加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复合类型。