带有多个语句的Npgsql命令

时间:2015-10-03 04:09:49

标签: .net postgresql npgsql

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

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

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

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

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

有没有办法让这个工作与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

1 个答案:

答案 0 :(得分:0)

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