NpgsqlDataReader - 将空值与“NULL”文字区分开来

时间:2013-12-06 08:35:57

标签: 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",但第一个应为空值

1 个答案:

答案 0 :(得分:4)

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

从表面上看,似乎很容易修复。阵列解码器在评估它们之前从每个值中删除双引号。这意味着NULL(文字)和“NULL”(字符串值)都在内部结束为相同的值,然后将其解释为字符串值“NULL”。

然而,它并不像修复解码器那么简单。一旦NULL和“NULL”被正确区分,就会出现存储问题。 Npgsql将PG中的数组转换为本机.NET数组。例如,PG text []到.NET String [],以及PG int4 []到.NET Int32 []。这对String []来说很好,但你不能在Int32 [](或任何值类型数组)中存储NULL值。

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

简短的回答是,你暂时不能将包含NULL元素的数组与Npgsql一起使用。