列“ zone_id”不存在

时间:2019-02-01 04:06:13

标签: c# postgresql ado.net dapper npgsql

PostgreSQL中的功能包括

This function is present in the db

当我运行查询时,它像

一样工作正常
Select * rpt.cst_data_integration_individuals(13, '2017-12-27T13:07:58Z', '2018-12-27T13:07:58Z', TRUE);

它正在产生结果。

但是当我尝试通过ADO.net时,它给出了错误,例如“ zone_id”不存在,

Ado.net code for fetching the data from PostgresSql

childrenQuery =“从rpt.cst_data_integration_individuals(zone_id,period_start,period_end,is_child)中选择*”;

请有人帮助我。

1 个答案:

答案 0 :(得分:1)

您的查询:

Select * from rpt.cst_data_integration_individuals(zone_id, period_start, period_end, is_child)

意味着zone_id等都是可用字段。如果这是在存储过程中并且是变量,那么它可能会起作用,但是就您的查询而言,它甚至没有任何意义。

您需要使用“:”或“ @”字符在实际的childrenQuery中调用参数。

Select * from rpt.cst_data_integration_individuals(:zone_id, :period_start, :period_end, :is_child)

此外,为帮助调试,请使用数据类型显式声明参数。

cmd.Parameters.Add(new NpgsqlParameter("zone_id", NpgsqlTypes.NpgsqlDbType.Integer));
cmd.Parameters.Add(new NpgsqlParameter("period_start", NpgsqlTypes.NpgsqlDbType.TimestampTz));
cmd.Parameters.Add(new NpgsqlParameter("period_end", NpgsqlTypes.NpgsqlDbType.TimestampTz));
cmd.Parameters.Add(new NpgsqlParameter("is_child", NpgsqlTypes.NpgsqlDbType.Boolean));

cmd.Parameters[0].Value = zoneId;
cmd.Parameters[1].Value = fromDate;
cmd.Parameters[2].Value = toDate;
cmd.Parameters[3].Value = true;

(上面有高尔夫版本,但我从不打扰-我喜欢可读性)

如果您使用的是较早版本的Npgsql,它们可能会宽容。如果您使用的是最新版本,它们会给您一个很明显的错误提示,指出您出错了。如果zoneId是一个整数(和true明显的布尔数据类型相匹配),那么我的猜测将有一个与.NET如何被发送的不匹配的DateTime数据类型-也许它假设它是没有时区的时间戳。

无论哪种方式,显式参数声明都会有所帮助,而AddWithValue基本上是在要求它做出最好的猜测。

暂时避免使用AddWithValue。我不会说谎,我会不时使用它,但是您真的应该限制它的使用。