执行阅读器,将值添加到列表,索引超出范围



您好,我有以下代码:

  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而不是在末尾加上数字,例如可能txtJanuarytxtFebruarytxtMarch等,这很好。

非常感谢

!零填充列表的想法帮助了我。我更改了查询并按照托尼·霍普金斯的建议分配了值。这对我来说是最简单的解决方案,因为我是 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();

相关内容

  • 没有找到相关文章

最新更新