ExecuteReader,将值添加到List,索引超出范围

时间:2014-03-05 22:48:47

标签: c# sql executereader

您好我有以下代码:

  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指定为零。

有人有想法吗?

非常感谢提前!

4 个答案:

答案 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并且不仅仅是最后的数字,例如可能txtJanuarytxtFebruarytxtMarch等,这很好。< / 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)

非常感谢你!填充零列表的想法帮助了我。我更改了查询并按照Tony Hopkins的建议分配了值。这对我来说是最简单的解决方案,因为我是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();