我正在测试一个示例应用程序,该应用程序添加了许多个人,即“人员”,并为每个人记录一年中每个月的时间度量,即“minTime”为十进制值,“auxTime”为小数值。
在我的代码中,我遍历一个SQL数据库表,试图总计每个小时的小数值。 “person”是nvarchar,“yearTotal”是小数。
我想在ListView屏幕中显示总计。
出于测试目的,我添加了2人。每个人都有12个月中每个人输入的时间。
我遇到了两个问题。
1)尝试将“yearTotal”添加到ListView控件,最终显示每个人每月12个月的数据。
例如:约翰史密斯50小时,约翰史密斯75小时等,而不是约翰史密斯的总数,这发生在所有人身上。
2)一旦“yearTotal”达到第一个人的正确总数,它就会保留该值并为下一个人递增它,为所有后续人员提供虚假值。
我需要知道如何(以及在何处)将每个人在ONE Entry中的年度总数添加到ListView控件,而不是同一个人的多个条目。
例如:约翰史密斯840小时,莎莉琼斯750小时。
这是一个下载“testDB”的链接,其中包含一个名为“timeRecord”的表。请记住,我需要一种方法来完全计算每个人的值,从1月到12月总计他们的值,并在ListView控件中显示该人的总计。
当我尝试在minTime和auxTime列上使用SUM(带别名)时,SQL仍会显示每个人的月份总数,但不会显示单个总计。 sample database
我不会解释它但只是编写完成的代码。
class String_String
{
public _string1 { get; set; }
public _string2 { get; set; }
}
try
{
using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\TimeKeeping.mdf;Integrated Security=True;User Instance=False"))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(
"SELECT people, SUM(minTime) FROM timeTable ASC GROUP BY PEOPLE ORDER BY people", conn))
{
SqlDataReader dr = cmd.ExecuteReader();
List<String_String> list = new List<String_String>();
while(dr.Read())
{
list.Add(new List<String_String> { _string1 = dr[0].ToString(), _string2 = dr[1].ToString() });
}
lstVwPeopleTime.DataSource = list;
lstVwPeopleTime.DisplayMember = "_string2";
lstVwPeopleTime.ValueMember = "_string1";
}
}
}
catch (SqlException ex) { MessageBox.Show(ex.Message); }
catch (System.Exception ex) { MessageBox.Show(ex.Message); }
代码未经过测试,因此可能会出错。
我终于弄清楚如何解决我遇到的问题。我创建了一个单独的方法,即private void GetTotals(字符串名称),其中我传递每个人的名字。我在tablename中查询了person,minTime,auxTime,其中person = @person。然后在SQL datareader循环中,我递增minTime和auxTime值,并将这些值传递给ListViewItem,以便在我的ListView控件中显示。
while (reader.Read())
{
yearTotal += Convert.ToDecimal(reader["minTime"].ToString(), CultureInfo.InvariantCulture) + 0.00M;
auxTotal += Convert.ToDecimal(reader["auxTime"].ToString(), CultureInfo.InvariantCulture) + 0.00M;
}
ListViewItem listItem = new ListViewItem(name);
listItem.SubItems.Add(yearTotal.ToString());
listItem.SubItems.Add(auxTotal.ToString());
lstVwPeopleTime.Items.Add(listItem);
name = "";
return;
在我以前的方法中,我只创建并实例化一个ArrayList,查询表中所有人的名字并将它们添加到ArrayList中。然后在foreach循环中,我将每个人的名字传递给GetTotals方法。此方法成功汇总并显示每个人在ListView控件中的12个月值。