.net 带有多个语句的Npgsql命令

.net 带有多个语句的Npgsql命令,.net,postgresql,npgsql,.net,Postgresql,Npgsql,在npgsqlv2中,我可以使用以下代码更新记录,并使用单个Npgsql命令返回更新后的记录值 command.CommandText属性既包含UPDATE语句,也包含SELECT语句。其思想是当调用command.ExecuteReader时,两个命令都将运行,但SELECT命令的结果将返回(因为它是最后一个命令) 升级到Npgsql版本3.0.3.0后,datareader中的值(来自SELECT语句)仍然是原始值,而不是更新后的值(代码中的返回dr(“操作”)行)。我尝试了每种不同的Iso

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

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

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

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

这是一个简化的函数,实际函数的目的是更新DB服务器上的记录,然后使用服务器更新的任何其他字段(例如“last_updated”时间戳字段,该字段在每次更新记录时在服务器上更新)更新应用程序中的对象

有没有一种方法可以通过NPGSQLv3.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中解决。

感谢您发布此消息,它绝对不应该发生。我正在调查PostgreSQL开发人员的情况,并将很快发回这里。虽然这并不能真正回答您的问题,但我确实建议避免这样的多语句。还有,你确定你在避免往返旅行吗?PgJDBC至少拆分多条语句并分别执行每一条语句。nPgSQL也可能。理想情况下,如果nPgSQL为此与PgJDBC有类似的接口,您应该做的是发出一批语句。如果nPgSQL不支持批处理,那么为它们添加支持可能是值得的;这样做可能并不难,而且性能提升是巨大的。@ShayRojansky您能否确认这个概念是否有效,是否真的可以避免第二次往返?我确实注意到NpgsqlCommand对象将命令文本分隔为多个语句(几乎就像每个语句是并行运行的,而不是顺序运行的)。我假设将多个语句添加到NpgsqlCommand.CommandText实际上就像发出一批顺序语句一样..NET的数据库API ADO.NET与您所做的一样支持批处理-将多个SQL语句插入单个命令的CommandText(不幸的是,没有单独的批处理API)。npgsql3.x通过使用分号进行拆分,然后将所有PostgreSQL协议消息一起发送(如果可能,在单个数据包中发送)来实现这一点。因此,性能优化肯定是存在的——只有一次往返。我不确定当第二个查询依赖于第一个查询时,为什么会出现问题…@Casey,我已经确认这是Npgsql与PostgreSQL通信方式的一个缺陷。你能为这个打开一个问题吗?很好。感谢您和Npgsql团队的其他成员所做的出色工作。