Npgsql如何处理强制转换类型

时间:2016-03-01 18:22:23

标签: c# postgresql 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 个答案:

答案 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相同的行为。