2017-05-17 8 views
0

내 코드의이 부분에 문제가있어서 datareader를 사용하고 있습니다.데이터 주소와 함께 문제가 발생했습니다

foreach (Giorno iDet in iNom.Gg.Where(x => x.minRegular != 0 | x.minOver != 0 | x.minLate != 0)) 
{ 
    bool Importato = false; 
    com = new SqlCommand("SELECT id, Lavorato, Straordinario, Assenza, Permesso, Malattia, Infortunio, Ferie, Maternita, Ritardo, Festivita " + 
         "FROM presenze_giorno WHERE data = @data AND reparto = @rep AND nomcod = @nom", TranOP.Connection, TranOP); 
    com.Parameters.AddWithValue("data", iDet.Gg); 
    com.Parameters.AddWithValue("rep", iNom.Reparto); 
    com.Parameters.AddWithValue("nom", iNom.Codice);         
    SqlDataReader dr = com.ExecuteReader(); 
    if (dr.HasRows) 
     Importato = true;              
    if (!Importato) 
    { 
     //Inserisco il giorno 
     com = new SqlCommand("INSERT INTO presenze_giorno (data, reparto, nomcod, nomdesc, errmarcatura, ingresso, uscita, " + 
          "Lavorato, Ritardo, Straordinario, Assenza) VALUES " + 
          "(@data, @reparto, @nomcod, @nomdesc, @errmarcatura, @ingresso, @uscita, @Lavorato, @Ritardo, " + 
          "@Straordinario, @Assenza); SELECT SCOPE_IDENTITY()", TranOP.Connection, TranOP); 
     com.Parameters.AddWithValue("data", iDet.Gg); 
     com.Parameters.AddWithValue("reparto", iNom.Reparto); 
     com.Parameters.AddWithValue("nomcod", iNom.Codice); 
     com.Parameters.AddWithValue("nomdesc", iNom.Descrizione); 
     com.Parameters.AddWithValue("errmarcatura", iNom.MarcaturaSbagliata); 
     com.Parameters.AddWithValue("ingresso", iDet.Gg.Add(iDet.InT)); 
     com.Parameters.AddWithValue("uscita", iDet.Gg.Add(iDet.OutT)); 
     com.Parameters.AddWithValue("Lavorato", iDet.minRegular); 
     com.Parameters.AddWithValue("Ritardo", iDet.minLate); 
     com.Parameters.AddWithValue("Straordinario", iDet.minOver); 
     com.Parameters.AddWithValue("Assenza", iDet.minAssente); 
     int wid = Convert.ToInt32(com.ExecuteScalar().ToString()); 
     //Inserisco le marcature 
     Lettura search = Lett.Find(f => f.Data == iDet.Gg & f.Reparto == iNom.Reparto & f.Codice == iNom.Codice); 
     if (search != null) 
      foreach (IngrUsc item in search.IU) 
      { 
       com = new SqlCommand("INSERT INTO presenze_marcature (idtesta, ingresso, uscita) VALUES (@idtesta, @ingresso, @uscita)", TranOP.Connection, TranOP); 
       com.Parameters.AddWithValue("idtesta", wid); 
       com.Parameters.AddWithValue("ingresso", iDet.Gg.Add(item.InT)); 
       com.Parameters.AddWithValue("uscita", iDet.Gg.Add(item.OutT)); 
       com.ExecuteNonQuery(); 
      } 
    }        
    //controllo se tutti gli altri campi sono a 0, se si faccio Update                 
    else if (Convert.ToInt32(dr["Lavorato"]) == 0 & Convert.ToInt32(dr["Straordinario"]) == 0 & Convert.ToInt32(dr["Assenza"]) == 0 & Convert.ToInt32(dr["Permesso"]) == 0 
      & Convert.ToInt32(dr["Malattia"]) == 0 & Convert.ToInt32(dr["Infortunio"]) == 0 & Convert.ToInt32(dr["Ferie"]) == 0 & Convert.ToInt32(dr["Maternita"]) == 0 
      & Convert.ToInt32(dr["Ritardo"]) == 0 & Convert.ToInt32(dr["Festivita"]) == 0) 
    { 
     com = new SqlCommand("UPDATE Presenze_Giorno " + 
          "SET Lavorato = @lav, Straordinario = @stra, Assenza = @ass, Permesso = @perm, Malattia = @mala, Infortunio = @inf, " + 
          "Ferie = @ferie, Maternita = @mat, Ritardo = @rit, Festivita = @fest" + 
          "WHERE data = @data AND reparto = @rep AND nomcod = @nom", TranOP.Connection, TranOP); 
     com.Parameters.AddWithValue("data", iDet.Gg); 
     com.Parameters.AddWithValue("rep", iNom.Reparto); 
     com.Parameters.AddWithValue("nom", iNom.Codice); 
     com.Parameters.AddWithValue("lav", iDet.minRegular); 
     com.Parameters.AddWithValue("stra", iDet.minOver); 
     com.Parameters.AddWithValue("ass", iDet.minAssente); 
     com.Parameters.AddWithValue("perm", iDet.minPermesso); 
     com.Parameters.AddWithValue("mala", iDet.minMalattia); 
     com.Parameters.AddWithValue("inf", iDet.minInfortunio); 
     com.Parameters.AddWithValue("ferie", iDet.minFerie); 
     com.Parameters.AddWithValue("mat", iDet.minMaternita); 
     com.Parameters.AddWithValue("rit", iDet.minLate); 
     com.Parameters.AddWithValue("fest", iDet.minFestivita); 
     com.ExecuteNonQuery(); 
    } 
    dr.Close(); 

난 경우 다른 할 32 DR을 int로 변환하려고 [ "Lavorato"] ECC는, ECC 내 오류를 제공합니다.

"System.InvalidOperationException :. 'A 명령 è GIA 않은 DataReader를 아페르토, 체에는 Deve의 essere에 치우 associato"

+0

Command와 DataReader는 일회용이므로'using' 문을 사용해야합니다. 이 질문이 귀하의 문제를 해결할 지 모르겠으나, 어쨌든해야합니다. 특히 foreach 루프 내에 있기 때문에. –

+0

웹 구성의 연결 문자열에서'MultipleActiveResultSets = true'를 활성화 했습니까? 다른 쿼리의 결과를 반복하면서 쿼리를 실행하려고하는 코드가있는 것으로 보입니다 ('이 명령과 연결된 열려있는 DataReader가 이미 있습니다'오류로 표시됨). –

답변

0

DataReader은 다른 .NET 데이터베이스 클래스와 달리 데이터베이스와의 연결이 끊어지지 않습니다. 즉, 개방형 연결 및 전용 명령이 필요합니다. MSDN 상태 :

ADO.NET DataReader를 사용하면 데이터베이스에서 전진 전용 데이터 스트림 읽기 전용을 검색 할 수 있습니다. 결과는 쿼리로 실행되고 클라이언트의 네트워크 버퍼에 저장됩니다. DataReader의 Read 메서드를 사용하여 요청할 때까지 결과가 반환됩니다.

두 가지 방법을 사용하여 문제를 해결할 수 있습니다 :

  • 데이터와 함께 작동 다른 명령을 명령의 연결 문자열에 MultipleActiveResultSets=true 세트가 있습니다. 또한 SqlCommand com2 = new SqlCommand("INSERT INTO presenze_giorno ...

, 또 다른 몇 가지 :

무료 자원과 밀접한 관계에 DataReader을 종료하는 것을 잊지 마세요 그래서, 대신 com 인스턴스를 재사용,이 같은 새로운 하나를합니다.

using (SqlDataReader dr = com.ExecuteReader()) 
{ 
    //rest of your code 
} 

하고, 당신이 당신의 DataReader가의 Read 메소드를 호출하지 않는 것 같습니다, 그래서 DataReader를 먼저 행에 진출하지 않고 첫 번째 행 "전에"유지 ​​: 가장 좋은 방법은 다음과 같이 using block에서 그것을 사용하는 것입니다. 다음과 같이 할 수 있습니다 :

if (dr.HasRows) 
    Importato = true;  
dr.Read(); 
+0

감사합니다. Nino !!! – frnbrt22

+0

@ frnbrt22 솔루션으로 내 대답을 표시하는 방법 감사합니다 :) – Nino