Форма окна C # показывает 0 в таблице данных, где данные сгруппированы по часам, но разработчик SQL показывает правильные результаты - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть запрос в Oracle для отображения количества транзакций в час, затем в последнем столбце отображается сумма для всех часов. Запрос отлично работает в SQL-разработчике. Однако, когда я пытаюсь отобразить результаты в виде таблицы моего приложения Windows Form, я получаю 0 для всех часовых данных. Однако я получаю итоговую сумму.

Впервые у меня возникли проблемы с использованием средства выбора даты и отображением данных в виде таблицы.

Вот скриншот результатов в SQL-разработчике (я понимаю, что итоговый столбец не равен сумме показанных столбцов. На снимке экрана показаны не все столбцы.)

enter image description here

А вот скриншот с теми же данными в оконных формах.

enter image description here

Это то, что я считаю соответствующим кодом SQL. Пожалуйста, прости меня, если это слишком много.

SELECT
 user_name,
 SUM(CASE
     WHEN substr(hr,11) = '19:00:00' THEN t
     ELSE 0
 END) AS eight_pm,
 SUM(CASE
     WHEN substr(hr,11) = '20:00:00' THEN t
     ELSE 0
 END) AS nine_pm,
 SUM(CASE
     WHEN substr(hr,11) = '21:00:00' THEN t
     ELSE 0
 END) AS ten_pm,
 SUM(CASE
     WHEN substr(hr,11) = '22:00:00' THEN t
     ELSE 0
 END) AS eleven_pm,
 SUM(t) total
 FROM
 (
     SELECT
         user_name,
         COUNT(*) t,
         TO_CHAR(trunc(last_update_date,'HH24') ) AS hr
     FROM
         cte
     GROUP BY
         user_name,
         TO_CHAR(trunc(last_update_date,'HH24') )
 )
 GROUP BY
 user_name
 ORDER BY
 user_name

Я ничего не делаю со средством выбора даты, кроме использования его в качестве параметра для запроса данных. При необходимости я могу показать пользовательский формат или код C #.

Пожалуйста, обратите внимание, я не смогу проверить какие-либо решения до завтрашнего утра. Спасибо за ваше время.

Обновление Добавление кода для заполнения таблицы данных:

 private void btnSecondShiftStats_Click(object sender, EventArgs e)
    {
        var start = startDatePicker.Value;
        var end = endDatePicker.Value;
        string name = tbName.Text;

        dvgSecondShiftStats.DataSource = _secondShiftStatsData.GetStats(start, end, name);
    }

Метод GetStats:

   public List<SecondShiftStats> GetStats(DateTime fromDate, DateTime toDate, string uName)
    {
        var statList = new List<SecondShiftStats>();
        var conString = ConfigurationManager.ConnectionStrings["SecondShiftStatsConnection"].ConnectionString;
        using (OracleConnection con = new OracleConnection(conString))
        {
            string sql = @"WITH loaded AS (
                                             SELECT...";

            using (OracleCommand cmd = new OracleCommand(sql, con))
            {
                cmd.Parameters.Add(new OracleParameter(":start_time", OracleDbType.Date)).Value = fromDate;
                cmd.Parameters.Add(new OracleParameter(":end_time", OracleDbType.Date)).Value = toDate;

                cmd.Parameters.Add("name", uName);

                con.Open();
                using (OracleDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var stats = new SecondShiftStats();
                        stats.USER_NAME = reader["USER_NAME"].ToString();
                        stats.THREE_PM = Convert.ToInt32(reader["THREE_PM"]);
                        stats.FOUR_PM = Convert.ToInt32(reader["FOUR_PM"]);
                        stats.FIVE_PM = Convert.ToInt32(reader["FIVE_PM"]);
                        stats.SIX_PM = Convert.ToInt32(reader["SIX_PM"]);
                        stats.SEVEN_PM = Convert.ToInt32(reader["SEVEN_PM"]);
                        stats.EIGHT_PM = Convert.ToInt32(reader["EIGHT_PM"]);
                        stats.NINE_PM = Convert.ToInt32(reader["NINE_PM"]);
                        stats.TEN_PM = Convert.ToInt32(reader["TEN_PM"]);
                        stats.ELEVEN_PM = Convert.ToInt32(reader["ELEVEN_PM"]);
                        stats.TOTAL = Convert.ToInt32(reader["TOTAL"]);

                        statList.Add(stats);
                    }
                }

            } 

        }
        return statList;
    }

1 Ответ

0 голосов
/ 30 апреля 2019

Я разобрался с решением этой проблемы. У меня есть другое приложение, показывающее тот же запрос, но без группировки. Я видел разницу в формате datetime в sql developer против datagridview.

Разработчик SQL:

enter image description here

DataGridView:

enter image description here

И, наконец, формат Datetimepicker:

enter image description here

Я никогда не менял способ отображения даты на сетке. Я только настроил datetimepicker и использовал его в качестве параметра в запросе. Это, казалось, было проблемой.

Поэтому я изменил соответствующий столбец в операторе выбора на:

TO_CHAR(last_update_date, 'DD/MON/YYYY HH24:MI:SS')AS last_update_date.

Конечно, я знал, что мне придется изменить свой окончательный выбор на:

select ...
case when substr(hr,11)...

до

select ...
case when substr(hr,13)...

Или я так думал. Я получаю сообщение ORA-01722: недопустимый номер при попытке выполнить запрос в SQL Developer.

Я решил, что это снова в операторе группировки, и искал другие решения для группировки по часам. Я попытался использовать принятый ответ из этого вопроса переполнения стека , но получил сообщение о том, что номер часа должен быть в диапазоне от 1 до 12, даже если мой формат установлен на «HH24».

Чтобы исправить эту проблему, я изменил последний подзапрос на:

SELECT
 user_name,
 SUM(CASE
     WHEN hr = '19' THEN t
     ELSE 0
 END) AS eight_pm,
 SUM(CASE
     WHEN hr  = '20' THEN t
     ELSE 0
 END) AS nine_pm,
 SUM(CASE
     WHEN hr = '21' THEN t
     ELSE 0
 END) AS ten_pm,
 SUM(CASE
     WHEN hr = '22' THEN t
     ELSE 0
 END) AS eleven_pm,
 SUM(t) total
 FROM
 (
     SELECT
         user_name,
         COUNT(*) t,
         substr(last_update_date,13,2)as hr
     FROM
         cte
     GROUP BY
         user_name,
        substr(last_update_date,13,2)
 )
 group by
 user_name
 order by
 user_name

После внесения этих изменений мои приложения отображают ожидаемые результаты:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...