簡體   English   中英

帶有多個語句的Npgsql命令

[英]Npgsql Command with Multiple Statements

在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”時間戳字段每次更新記錄時在服務器上)。

有沒有辦法使這個工作與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中得到解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM