2016-03-01 78 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" 

我在C#中使用版本Npgsql的2.2.4.3项目,使用涉及IDbCommandIDataReader相同的查询,我得到这些结果:

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

2 Npgsql的是很老的,现在,你应该使用最新的稳定版本(3.0.5)。

为你看到的原因很简单 - 2 Npgsql的设置extra_float_digits参数为3(见http://www.postgresql.org/docs/current/static/runtime-config-client.html) - 这会导致返回更多的数字,是必要的,因为方式转移Npgsql的数据/从服务器。

Npgsql 3不再设置此参数(尽管您可以自己设置),因此应该看到与pgAdmin中相同的行为。