2016-03-01 3 views
0

Я заметил следующее поведение:Как Npgsql дело с типами литых

В pgAdmin я выполнить этот запрос, и я получаю этот результат:

SELECT 
CAST(COALESCE(c.latitude, '-1') as varchar), 
CAST(COALESCE(c.longitude, '-1') as varchar) 
FROM mytable c WHERE c.acolumn = 'S' AND c.anothercolumn=1 

--------------------------------- 
coalesce   coalesce 
character varying character varying 
"-25.30089"  | "-57.625866" 

Я использую Npgsql версии 2.2.4.3 в C# проект, я выполнить тот же запрос, используя IDbCommand и IDataReader и я получаю эти результаты:

IDbCommand cmd = con.CreateCommand(); 
cmd.Connection = con; 
IDataReader reader = null; 
cmd.CommandText = "SELECT CAST(COALESCE(c.latitude, '-1') as varchar), CAST(COALESCE(c.longitude, '-1') as varchar) FROM mytable c WHERE c.acolumn = 'S' AND c.anothercolumn=1"; 
cmd.CommandType = CommandType.Text; 
reader = cmd.ExecuteReader(); 
while (reader.Read()) 
{ 
    string latitude_r= reader.GetValue(0).ToString(); 
    string longitude_r= reader.GetValue(1).ToString(); 
} 

--------------------------------------------- 
latitude_r "-25.300889999999999" string 
longitude_r "-57.625866000000002" string 

Может кто-нибудь объяснить мне, почему? потому что я использую интерфейс .NET IDbCommand? есть ли способ получить точное значение без этих дополнительных десятичных значений? это определение PostgreSQL столбцов:

ALTER TABLE mytable ADD COLUMN longitude double precision; 
ALTER TABLE mytable ADD COLUMN latitude double precision; 

ответ

1

Npgsql 2 очень стар теперь, вы должны использовать последнюю стабильную версию (3.0.5).

Объяснение для того, что вы видите, это просто - Npgsql 2 установить параметр extra_float_digits до 3 (см http://www.postgresql.org/docs/current/static/runtime-config-client.html) - это вызывает гораздо больше цифр, которые будут возвращены, и было необходимо из-за способа Npgsql передаваемых данных в/из сервер.

Npgsql 3 больше не устанавливает этот параметр (хотя вы можете установить его самостоятельно), поэтому вы должны увидеть то же поведение, что и в pgAdmin.