0

您好,我有以下代码:

  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 个文本框。我在一月到三月的时间里已经做到了。

如果我为 4 月添加另一行代码,

     textBox74.Text = Arbeitstage[3].ToString();

我得到一个超出范围的异常。我认为出现问题是因为 4 月没有记录,因此 List Arbeitstage 中的索引 [4] 不存在。因此,我想将 textBox74.Text 分配为零。

有人有想法吗?

提前谢谢了!

4

4 回答 4

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
于 2014-03-05T22:58:25.580 回答
0

你至少可以通过两种方式攻击这个。首先不使用 aList<>或您可以使用一个,然后循环遍历列表。

不使用列表可能是这样的:

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;
     } 
}

或者使用 aList<>可能看起来像这样:

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;
     } 
}

正确命名Textboxes 的方式很好,而不仅仅是末尾的数字,比如可能txtJanuarytxtFebruary等等txtMarch

于 2014-03-05T23:13:42.663 回答
0

有几种方法可以做到这一点。一个是

更改您的查询以选择月份数 - 1 和计数。

所以你最终会得到类似的东西

Month, Value
2      200
7      601

ETC

用十二个月预先填写您的清单;

然后在从查询中读取值时执行类似的操作

while (readerArbeitstage.Read())
{
int mnth = readerArbeitstage['Month'].AsInteger;
Arbeitstage[mnth] = readerArbeitstage['value'].AsInteger;
}

顺便说一句,如果您将文本框放在一个数组中,或者您可以从 monthNumber 派生名称,然后在 Controls 集合中查找它们,您会好得多。

于 2014-03-05T23:26:23.593 回答
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();
于 2014-03-06T17:21:39.393 回答