小编Cas*_*sey的帖子

具有多个语句的 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 …
Run Code Online (Sandbox Code Playgroud)

.net postgresql npgsql

5
推荐指数
1
解决办法
4087
查看次数

Npgsql 或您的 PostgreSQL 不支持 System.UInt32 类型

使用 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

postgresql npgsql

4
推荐指数
1
解决办法
2060
查看次数

标签 统计

npgsql ×2

postgresql ×2

.net ×1