2013-12-06 2 views
1

У меня есть проблема с Отличительной NULL типа базы данных от «NULL» текста при чтении столбца таблицы из базы данныхNpgsqlDataReader - отличить нулевое значение от «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", но первое должно быть нулевым значением

ответ

4

К сожалению, обработка массивов Npgsql еще не завершена. Он не обрабатывает элементы NULL должным образом.

На поверхности, кажется, достаточно просто исправить. Декодер массива разбивает двойные кавычки из каждого значения перед их оценкой. Это означает, что NULL (буквальный) и «NULL» (строковое значение) оба заканчиваются как одно и то же значение внутри, которое затем интерпретируется как строковое значение «NULL».

Однако это не так просто, как просто фиксация декодера. Когда NULL и NULL правильно распознаются, возникает проблема хранения. Npgsql преобразует массивы из PG в собственные .NET-массивы. Например, текст PG [] в .NET String [] и PG int4 [] в .NET Int32 []. Это нормально для String [], но вы не можете сохранить значение NULL в Int32 [] (или любом массиве типов значений).

Чтобы устранить эту проблему, массивы необходимо будет сохранить каким-либо другим способом (возможно, класс NpgsqlArray, который позволит использовать NULL и предоставить подходящий интерфейс). К сожалению, это исправление нарушит совместимость.

Короткий ответ: вы просто не можете использовать массивы, содержащие NULL-элементы с Npgsql.

Смежные вопросы