最近我们从 MSSQL 数据库迁移到 PostgreSQL 数据库。为了通过 .NET 访问 PostgreSQL,我们使用 PostgreSQL 的 NpgSql ADO.NET 提供程序。有时我们的应用程序会收到错误“此 npgsqltransaction 已完成,不再可用”。这是一种罕见的情况,因此我们无法找到问题的确切原因。
有人可以告诉我这个错误的情况和原因吗?
--卡迈勒
这是 Npgsql 早期版本的问题。发生这种情况是因为当在已完成的事务上访问 NpgsqlTransaction.Connection 时它们会抛出异常。
5.0.1 版本已修复。如果您将 Npgsql 软件包升级到最新版本,这将解决。
我注意到抛出此异常的另一种情况。如果您尝试在包含显式事务的 sql 命令的代码中提交事务,则会导致您所询问的异常。
代码示例:
using var connection = new NpgsqlConnection(connectionString)
await connection.OpenAsync();
var transaction = await connection.BeginTransactionAsync();
var command = connection.CreateCommand();
command.CommandText = sqlScript;
var result = await command.ExecuteNonQueryAsync();
await transaction.CommitAsync();
sqlScript 包含这样的内容:
START TRANSACTION;
-- your commands here
COMMIT;