Столбец "zone_id" не существует - PullRequest
0 голосов
/ 01 февраля 2019

Функция в 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 голосов
/ 02 февраля 2019

Ваш запрос:

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.Я не собираюсь лгать, я использую его время от времени, но вы действительно должны ограничить его использование.

...