c# - NpgsqlDataReader - 将空值与 "NULL"文字区分开来

标签 c# postgresql npgsql

从数据库中读取表列时,我无法区分 NULL 数据库类型和“NULL”文本

示例代码:

using (var connection = new NpgsqlConnection("connectionString"))
{
    connection.Open();
    var query = @"SELECT array_agg(a) col FROM unnest('{NULL,""NULL""}'::text[]) a";
    using(var cmd = new NpgsqlCommand(query, connection)
    {
        using(var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                var strings = rowa["col"] as string[];
                Console.WriteLine(strings[0]);
                Console.WriteLine(strings[1]);
            }
        }
    }
}

strings[0]strings[1] 都是"NULL" 但第一个应该是空值

最佳答案

不幸的是,Npgsql 的数组处理还没有完成。它不能正确处理 NULL 元素。

从表面上看,修复起来似乎很简单。数组解码器在评估每个值之前从每个值中去除双引号。这意味着 NULL(文字)和“NULL”(字符串值)在内部都以相同的值结束,然后被解释为字符串值“NULL”。

然而,这并不像修复解码器那么简单。正确区分NULL和“NULL”之后,存储的问题就来了。 Npgsql 将数组从 PG 转换为 native .NET 数组。例如,PG text[] 到 .NET String[],PG int4[] 到 .NET Int32[]。这对 String[] 没问题,但您不能在 Int32[](或任何值类型数组)中存储 NULL 值。

要解决这个问题,数组需要以其他方式存储(可能是 NpgsqlArray 类,它允许 NULL 并提供合适的接口(interface))。不幸的是,该修复会破坏兼容性。

简短的回答是,你暂时不能在 Npgsql 中使用包含 NULL 元素的数组。

关于c# - NpgsqlDataReader - 将空值与 "NULL"文字区分开来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20419445/

相关文章:

c# - 从 HttpWebResponse 获取重定向 URL 的集合

sql - 等效于 Merge with output 子句在 SQL Server 到 Postgresql

postgresql - Npgql get_HasRows() 抛出 ArgumentOutOfRangeException

PostgreSQL,Npgsql 返回 42601 : syntax error at or near "$1"

c# - 通过 nPgSQL 接收 NOTIFY 负载

c# - Thread.Yield 是否会让 CPU 进行上下文切换到同一进程或同一处理器中的其他线程?

c# - 你如何正确编写一个 foreach 循环以在 asp.net C# 中上传多个文件

c# - 如何将 DLL 引用添加到 .NET WebAPI 项目?

会计报表的SQL

PostgreSQL - 它会在同一张表上使用两个索引吗?