您好我有以下代码:
SqlCeCommand commandArbeitstage= new SqlCeCommand("select count(IDStundensatz) as Gesamt from tblstunden Where IDPersonal = @IDPersonal Group by datepart(month, Datum) Order By datepart(month, Datum)", verbindung);
commandArbeitstage.Parameters.Add("IDPersonal", SqlDbType.Int);
commandArbeitstage.Parameters["@IDPersonal"].Value = IDPersonal;
SqlCeDataReader readerArbeitstage = commandArbeitstage.ExecuteReader();
List<Int32> Arbeitstage = new List<Int32>();
while (readerArbeitstage.Read())
{
Arbeitstage.Add(readerArbeitstage.GetInt32(0));
}
Arbeitstage.GetRange
textBox53.Text = Arbeitstage[0].ToString();
textBox60.Text = Arbeitstage[1].ToString();
textBox68.Text = Arbeitstage[2].ToString();
查询正在计算表中的工作日,并按日期部分对它们进行排序。所以我有一列[Gesamt]和12行。我想将工作天数分配给12个文本框。我已经在1月到3月完成了上述工作。
如果我为4月添加另一行代码,
textBox74.Text = Arbeitstage[3].ToString();
我超出了范围异常。我认为问题出现是因为4月没有记录,因此List Arbeitstage中的索引[4]不存在。因此,我想将textBox74.Text指定为零。
有人有想法吗?
非常感谢提前!
答案 0 :(得分:1)
如果您需要每月的天数,可以使用一个用零填充的数组来存储每个月的数字。然后,您可以引用每个月的值(通过索引0到11)。您还需要更改查询以返回月份编号。
SqlCeCommand commandArbeitstage= new SqlCeCommand("select datepart(month, Datum) as Month, count(IDStundensatz) as Gesamt from tblstunden Where IDPersonal = @IDPersonal Group by datepart(month, Datum) Order By datepart(month, Datum)", verbindung);
commandArbeitstage.Parameters.Add("IDPersonal", SqlDbType.Int);
commandArbeitstage.Parameters["@IDPersonal"].Value = IDPersonal;
SqlCeDataReader readerArbeitstage = commandArbeitstage.ExecuteReader();
Int32[] Arbeitstage = new Int32[12];
while (readerArbeitstage.Read())
{
Arbeitstage[readerArbeitstage.GetInt32(0) - 1] = readerArbeitstage.GetInt32(1));
}
textBox53.Text = Arbeitstage[0].ToString(); // January
// ... and so on up to 11
答案 1 :(得分:0)
你可以通过至少两种方式攻击这个。首先不使用List<>
,或者您可以使用一个然后遍历列表。
不使用列表可能是这样的:
int ctr=1;
while (readerArbeitstage.Read())
{
switch (ctr++)
{
case 1: // January
textBox53.Text = readerArbeitstage.GetInt32(1);
break;
case 2: // February
textBox60.Text = readerArbeitstage.GetInt32(1);
break;
case 3: // March
textBox68.Text = readerArbeitstage.GetInt32(1);
break;
}
}
或使用List<>
可能如下所示:
while (readerArbeitstage.Read())
{
Arbeitstage.Add(readerArbeitstage.GetInt32(0));
}
for (int i=0; i<Arbeitstage.Count-1;i++)
{
switch (i)
{
case 1: // January
textBox53.Text = Arbeitstage[i].ToString();
break;
case 2: // February
textBox60.Text = Arbeitstage[i].ToString();
break;
case 3: // March
textBox68.Text = Arbeitstage[i].ToString();
break;
}
}
正确地命名Textboxe
并且不仅仅是最后的数字,例如可能txtJanuary
,txtFebruary
,txtMarch
等,这很好。< / p>
答案 2 :(得分:0)
有很多方法可以做到这一点。 一个是
更改您的查询以选择月份编号 - 1和计数。
所以你最终会得到像
这样的东西Month, Value
2 200
7 601
等
在12个月内预先填写您的列表;
然后从查询中读取值时执行类似
的操作while (readerArbeitstage.Read())
{
int mnth = readerArbeitstage['Month'].AsInteger;
Arbeitstage[mnth] = readerArbeitstage['value'].AsInteger;
}
顺便提一下,如果你的文本框在数组中,你会好多了,或者你可以从monthNumber中获取名称,然后在Controls集合中找到它们。
答案 3 :(得分:0)
SqlCeCommand commandArbeitstage = new SqlCeCommand("SELECT DATEPART (month, Datum) AS Monat, COUNT(IDStundensatz) AS AnzahlTage FROM tblstunden WHERE IDPersonal = @IDPersonal GROUP BY DATEPART(month,datum)", verbindung);
commandArbeitstage.Parameters.Add("IDPersonal", SqlDbType.Int);
commandArbeitstage.Parameters["@IDPersonal"].Value = IDPersonal;
SqlCeDataReader readerArbeitstage = commandArbeitstage.ExecuteReader();
Int32[] Arbeitstage = new Int32[13];
while (readerArbeitstage.Read())
{
int mnth = Convert.ToInt32(readerArbeitstage["Monat"].ToString());
Arbeitstage[mnth] = Convert.ToInt32(readerArbeitstage["AnzahlTage"].ToString());
}
ATageJan.Text = Arbeitstage[1].ToString();
ATageFeb.Text = Arbeitstage[2].ToString();
ATageMrz.Text = Arbeitstage[3].ToString();
ATageApr.Text = Arbeitstage[4].ToString();
ATageMai.Text = Arbeitstage[5].ToString();
ATageJun.Text = Arbeitstage[6].ToString();
ATageJul.Text = Arbeitstage[7].ToString();
ATageAug.Text = Arbeitstage[8].ToString();
ATageSep.Text = Arbeitstage[9].ToString();
ATageOkt.Text = Arbeitstage[10].ToString();
ATageNov.Text = Arbeitstage[11].ToString();
ATageDez.Text = Arbeitstage[12].ToString();