我注意到以下行为:
在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,我使用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;
答案 0 :(得分: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相同的行为。