2014-03-05 15 views
0

你好,我有以下代碼:的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(); 

查詢由datepart來計算工作日一張桌子和訂購。所以我有一列[Gesamt]和12行。我想將工作天數分配給12個文本框。 1月至3月我已經完成了上述工作。

如果我添加的四月份另一行代碼,

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

我得到了超出範圍的異常。我認爲問題的發生是因爲4月份沒有記錄,因此List Arbeitstage中的索引[4]不存在。所以我想爲textBox74.Text指定一個零。

有人有想法嗎?

非常感謝提前!

回答

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

或代替相當多餘「的if-else」序列,就可以分配長度12的歸零陣列,然後通過枚舉這是從數據庫返回的值更新此陣列和最後將存儲在數組中的值分配給各個文本框,而不檢查任何條件。 – nullop

+0

@nullop非常好的一點,我更新了我的答案。 – Szymon

+0

我試着用我的第一個和第二個查詢,但數組被填充的行數:1 2 3而不是在列天的值:即3 1 2. – user3204119

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 S和不只是數字在最後,如可能txtJanuary,txtFebruary,txtMarch

+0

第一個問題與OP詢問的問題相同,第二個根本不起作用。 –

+0

@TonyHopkinson謝謝你特別指出第二個。我只是複製並粘貼從第一個。因此我更新了第二個。 – Edper

0

有很好的方法做到這一點。 一個是

更改您的查詢來選擇月份數 - 1和計數。

所以你最終的東西,如

Month, Value 
2  200 
7  601 

預填充的十二個月內您的列表;

然後從查詢讀取時的值做一些像

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

你會好很多關,如果你的方式有一個數組的文本框,或者你可以從monthNumber得出名字然後在Controls集合中找到它們。

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();