Cas*_*sey 5 .net postgresql npgsql
在 Npgsql V2 中,我可以使用以下代码来更新记录,并使用单个 Npgsql 命令返回更新的记录值。
该command.CommandText属性包含 UPDATE 语句和 SELECT 语句。这个想法是,当command.ExecuteReader调用时,两个命令都会运行,但 SELECT 命令的结果将被返回(因为它是最后一个命令)。
升级到 Npgsql 版本 3.0.3.0 后,数据读取器中的值(来自 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4087 次 |
| 最近记录: |