[英]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.