내 코드의이 부분에 문제가있어서 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"
Command와 DataReader는 일회용이므로'using' 문을 사용해야합니다. 이 질문이 귀하의 문제를 해결할 지 모르겠으나, 어쨌든해야합니다. 특히 foreach 루프 내에 있기 때문에. –
웹 구성의 연결 문자열에서'MultipleActiveResultSets = true'를 활성화 했습니까? 다른 쿼리의 결과를 반복하면서 쿼리를 실행하려고하는 코드가있는 것으로 보입니다 ('이 명령과 연결된 열려있는 DataReader가 이미 있습니다'오류로 표시됨). –