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