PostgreSQL中的功能包括
当我运行查询时,它像
一样工作正常Select * rpt.cst_data_integration_individuals(13, '2017-12-27T13:07:58Z', '2018-12-27T13:07:58Z', TRUE);
它正在产生结果。
但是当我尝试通过ADO.net时,它给出了错误,例如“ zone_id”不存在,
childrenQuery =“从rpt.cst_data_integration_individuals(zone_id,period_start,period_end,is_child)中选择*”;
请有人帮助我。
答案 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
。我不会说谎,我会不时使用它,但是您真的应该限制它的使用。