“ NpgsqlBinaryImporter”不包含“取消”的定义

时间:2019-05-22 19:07:14

标签: npgsql

在撰写本文时,https://www.npgsql.org/doc/copy.html#cancel上的文档说:

  

可以通过调用Cancel()随时取消导入操作   导入器对象上的方法。没有数据提交到数据库   在关闭或处置进口商之前。

     

也可以通过调用Cancel()取消导出操作。

我刚刚将Npgsql程序包从3.1.10更新到了4.0.7,现在我收到类似于以下代码的错误'NpgsqlBinaryImporter' does not contain a definition for 'Cancel'

void WriteStuff(IEnumerable<RowInfo> enumerable, NpgsqlConnection conn)
{
    using (var writer = conn.BeginBinaryImport("COPY blah blah FROM STDIN (FORMAT BINARY)"))
    {
        try
        {
            foreach (var rowInfo in enumerable)
            {
                writer.StartRow();
                writer.Write(...); // blah blah
            }
            writer.Close();
        }
        catch
        {
            writer.Cancel();
            throw;
        }
    }
}

似乎this commit将Cancel()设为私有。

那么现在取消批量操作的正确方法是什么?我需要将其包装在交易中吗?

[给出了答案,我应该摆脱上面代码中的try-catch代码,让异常发生。同样,对writer.Close()的调用也应更改为writer.Complete()。 ]

1 个答案:

答案 0 :(得分:0)

Npgsql 4.0以一种重要的方式see the release notes更改了取消时的COPY API。

简而言之,您现在必须在NpgsqlBinaryImporter上显式调用Complete()才能进行导入。在不调用Complete()的情况下处理它会取消该操作。这样做是为了确保异常不会引起提交,并且与.NET TransactionScope的工作方式保持一致。

我将对此进行更新-感谢您指出!