在 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 …Run Code Online (Sandbox Code Playgroud) 使用 Npgsql V3.0.3.0,我将一条新记录添加到一个表中,该表在数据库中有一个 OID 类型的列,它应该映射到UInt32.Net 类型。
执行插入命令时,抛出以下异常“Npgsql 或您的 PostgreSQL 不支持此 .NET 类型:System.UInt32”。
异常中的堆栈跟踪是:
at Npgsql.TypeHandlerRegistry.get_Item(Type type)
at Npgsql.TypeHandlerRegistry.get_Item(Object value)
at Npgsql.NpgsqlParameter.ResolveHandler(TypeHandlerRegistry registry)
at Npgsql.NpgsqlParameter.Bind(TypeHandlerRegistry registry)
at Npgsql.NpgsqlCommand.ValidateAndCreateMessages(CommandBehavior behavior)
at Npgsql.NpgsqlCommand.ExecuteNonQueryInternal()
at Npgsql.NpgsqlCommand.ExecuteNonQuery
Run Code Online (Sandbox Code Playgroud)
此表中GetSchemaTablea的方法DataReader报告 OID 列的“数据类型”为UInt32。