从数据库
读取表列时,我遇到了将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"
,但第一个应为空值
答案 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一起使用。