簡體   English   中英

C#windows窗體在datagridview中顯示0,其中按小時分組的數據,但SQL開發人員顯示正確的結果

[英]C# windows form shows 0 in datagridview where for data grouped by hour, but SQL developer shows the correct results

我在Oracle中有一個查詢以按小時顯示事務數,然后最后一列顯示所有小時的總和。 該查詢在SQL開發人員中工作正常。 但是,當我嘗試在我的Windows窗體應用程序的datagridview中顯示結果時,我得到0表示所有小時數據。 然而,我確實得到了最終的總數。

這是我第一次使用日期選擇器並在datagridview中顯示數據時遇到問題。

下面是SQL開發人員的結果截圖(我意識到總列不等於顯示的列總數。屏幕截圖不顯示所有列。)

在此輸入圖像描述

這是窗口形式中相同數據的屏幕截圖。

在此輸入圖像描述

這就是我認為的相關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#代碼。

請注意,我明天早上才能測試任何解決方案。 感謝您的時間。

更新添加用於填充datagridview的代碼:

 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;
    }

我想出了解決這個問題的方法。 我有另一個應用程序顯示相同的查詢,但沒有分組。 我在sql developer和datagridview中看到了datetime格式的不同。

SQL開發人員:

在此輸入圖像描述

datagridview的:

在此輸入圖像描述

最后是Datetimepicker的格式:

在此輸入圖像描述

我從未改變datgridview顯示日期的方式。 我只定制了datetimepicker並將其用作查詢中的參數。 這似乎是個問題。

所以我將select語句中的相關列更改為:

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)...

或者我想。 當我嘗試在SQL Developer中運行查詢時,我會得到一個ORA-01722:invalid-number消息。

我確定它再次出現在分組聲明中,並尋找按小時分組的其他解決方案。 我嘗試使用此Stack Overflow問題中接受的答案,但收到一條消息,說明小時編號必須在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

進行這些更改后,我的應用程序會顯示我期望的結果:

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM