具有多个语句的 Npgsql 命令

Npgsql Command with Multiple Statements

在 Npgsql V2 中,我可以使用以下代码更新记录,并且 return 使用单个 Npgsql 命令更新记录值。

command.CommandText 属性 包含 UPDATE 语句和 SELECT 语句。这个想法是,当调用 command.ExecuteReader 时,两个命令都将 运行,但是 SELECT 命令的结果将被 returned(因为它是最后一个命令)。

升级到 Npgsql 版本 3.0.3.0 后,datareader 中的值(来自 SELECT 语句)仍然是原始值,而不是更新后的值(代码中的 Return dr("action") 行).我已经尝试了每个不同的 IsolationLevel,它们都给出了相同的结果(就好像 SELECT 语句没有看到来自 INSERT 语句的更新值)。该值已在数据库中正确更新(如果我重新查询它具有更新值的记录)。

我可以拆分它并使用两个单独的 NpgsqlCommand(一个用于 INSERT,另一个用于 SELECT),但我不想创建到服务器的第二次往返。

这是一个简化的函数,真正的函数的目的是更新数据库服务器上的记录,然后用服务器更新的任何其他字段更新应用程序中的对象(例如"last_updated" 每次更新记录时在服务器上更新的时间戳字段。

有没有办法让它与 Npgsql V3.0.3.0 一起工作?

Public Function UpdateRecordExample(id As Guid, newAction As String) As String
        Using conn As New NpgsqlConnection("Connection String Here")
            Using trans = conn.BeginTransaction(IsolationLevel.ReadUncommitted)
                Dim command = conn.CreateCommand
                command.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
                command.CommandText = "Update pm.action_item SET action=@action WHERE id=@id; SELECT * FROM pm.action_item WHERE id=@ID;"
                command.Parameters.Add(New NpgsqlParameter("id", id))
                command.Parameters.Add(New NpgsqlParameter("action", newAction))
                Using dr = command.ExecuteReader
                    If dr.Read Then
                        Return dr("action") 'This is still the original value and not "newAction"
                    Else
                        Throw New DBConcurrencyException
                    End If
                End Using
            End Using
        End Using
    End Function

请注意,此问题已在 Npgsql 3.1 中得到解决。