2014-03-05 4 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(); 

를 쿼리는 날짜 부분에 의해 테이블 ​​주문을에서 일을 기대하고있다. 그래서 나는 한 열의 [Gesamt]와 12 개의 행을 가지고 있습니다. 근무일 수를 12 개의 텍스트 상자에 지정하고 싶습니다. 위의 내용을 1 월에서 3 월까지 수행했습니다.

내가 4 월 코드의 또 다른 라인을 추가하면

,

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

나는 범위 부족 예외를 얻을. 나는 4 월에 대한 기록이 없기 때문에 목록 Arbeitstage에있는 색인 [4]이 존재하지 않기 때문에 문제가 발생한다고 생각합니다. 그래서 textBox74.Text를 0으로 지정하고 싶습니다.

아무 생각 없습니까?

미리 감사드립니다.

답변

1

각 달의 일수가 필요한 경우 0으로 초기화 된 배열을 사용하여 각 달의 숫자를 저장할 수 있습니다. 그런 다음 각 달의 값을 인덱스 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

또는 대신 꽤 중복이 후 DB에서 반환 된 값을 열거하여이 배열을 업데이트하고 마지막으로 배열에 저장된 값을 조건을 확인하지 않고 각각의 텍스트 상자에 할당합니다. – 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의 제대로 이름을하는 방식으로 좋은 및 끝에있는 숫자와 마찬가지로, 아마 txtJanuary, txtFebruary, txtMarch

+0

첫 번째 질문에는 OP 질문과 동일한 문제가 발생하며 두 번째 질문은 전혀 작동하지 않습니다. –

+0

@ TonyHopkinson 특별히 2 번째를 지적 해 주셔서 감사합니다. 나는 그것을 첫 번째 것에서 복사하고 붙여 넣었다. 나는 두 번째 것을 업데이트했다. – Edper

0

그렇게하는 데는 몇 가지 좋은 방법이 있습니다.

귀하의 검색어를 변경하여 월별 숫자와 1을 선택하십시오.

그래서 당신이

Month, Value 
2  200 
7  601 

같은 끝낼 등

미리 채우는 12 개월로 목록을;

다음 방법으로 배열에 텍스트 상자가 있다면 당신은 떨어져 많은 좋을 것

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

처럼 뭔가를 할 쿼리에서 값을 읽는하거나 monthNumber에서 이름을 파생 수있을 때 Controls 컬렉션에서 Find Them을 선택합니다.

0

대단히 감사합니다! 채워진리스트가없는 아이디어는 나를 도왔습니다. Tony Hopkins가 제안한대로 쿼리를 변경하고 값을 할당했습니다. C#과 프로그래밍 전반에 익숙하지 않아서 가장 쉬운 솔루션입니다.하지만 CASE/SWTCH에 대한 힌트와 배열의 텍스트 상자를 사용해 주셔서 감사합니다. 나는 그것을 시도 할 것이다. 여기에 나를 위해 작동 코드입니다 : 그는 길이 12의 제로화 배열을 할당 할 수있는 "경우 - 다른"순서

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