'NpgsqlBinaryImporter' 不包含 'Cancel' 的定义

'NpgsqlBinaryImporter' does not contain a definition for 'Cancel'

在我写这篇文章时,https://www.npgsql.org/doc/copy.html#cancel 的文档说:

Import operations can be cancelled at any time by calling the Cancel() method on the importer object. No data is committed to the database before the importer is closed or disposed.

Export operations can be cancelled as well, also by calling 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()。 ]

Npgsql 4.0 以重要的方式改变了围绕取消的 COPY API,see the release notes

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

我会更新这方面的文档 - 感谢您指出!