您好,我有以下代码:
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 个文本框。我在上面已经为一月至三月做了这件事。
如果我在四月再添加一行代码,
textBox74.Text = Arbeitstage[3].ToString();
我收到超出范围的异常。我认为出现问题是因为没有 4 月份的记录,因此列表 Arbeitstage 中的索引[4] 不存在。因此,我想为textBox74.Text分配一个零。
有人有想法吗?
提前非常感谢!
如果需要每个月的数字,则可以使用用零初始化的数组来存储每个月的数字。然后,您可以引用每个月的值(按索引 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 和计数。
所以你最终会得到类似的东西
Month, Value
2 200
7 601
等
预先填充您的列表十二个月;
然后,当从查询中读取值时,执行以下操作
while (readerArbeitstage.Read())
{
int mnth = readerArbeitstage['Month'].AsInteger;
Arbeitstage[mnth] = readerArbeitstage['value'].AsInteger;
}
顺便说一下,如果你把文本框放在一个数组中,你会好得多,或者你可以从monthNumber派生名称,然后在控件集合中找到它们。
你至少可以用两种方式攻击这个。首先不使用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
等,这很好。
!零填充列表的想法帮助了我。我更改了查询并按照托尼·霍普金斯的建议分配了值。这对我来说是最简单的解决方案,因为我是 C# 和整体编程的新手。但是感谢您提供有关 CASE/SWTCH 的提示以及在数组中使用文本框。我会尝试一下。这是对我有用的代码:
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();