Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# i';我的数据阅读器出了问题_C#_Sql_.net_Sqldatareader_Sqlcommand - Fatal编程技术网

C# i';我的数据阅读器出了问题

C# i';我的数据阅读器出了问题,c#,sql,.net,sqldatareader,sqlcommand,C#,Sql,.net,Sqldatareader,Sqlcommand,我的这部分代码有问题,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, Infortu

我的这部分代码有问题,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();
当我执行else if并尝试转换为int 32 dr[“Lavorato”]ecc时,ecc会给我一个错误

“System.InvalidOperationException:'与un关联的命令'gi' 数据阅读器aperto,che deve essere chiuso。“


DataReader
,与其他.NET数据库类不同,它不会与数据库断开连接。这意味着它需要开放连接和专用命令。MSDN声明:

您可以使用ADO.NET DataReader检索只读, 仅转发来自数据库的数据流。结果返回为 查询将执行,并存储在客户端的网络缓冲区中 直到您使用DataReader的Read方法请求它们

您可以使用两种方法解决问题:

  • 在命令的连接字符串中设置
    MultipleActiveResultSets=true
  • 使用另一个处理数据的命令。因此,与其重用
    com
    实例,不如创建一个新实例,如下所示:
    SqlCommand com2=newsqlcommand(“INSERT INTO presenze\u giorno…
另外,还有几件事:

不要忘记关闭
DataReader
以释放资源并关闭连接。最好的方法是在
中使用block
,如下所示:

using (SqlDataReader dr = com.ExecuteReader())
{
    //rest of your code
}
if (dr.HasRows)
    Importato = true;    
dr.Read();
而且,看起来您并没有调用dataReader的
Read
方法,所以dataReader并没有前进到第一行,而是停留在第一行之前。您可以这样操作:

using (SqlDataReader dr = com.ExecuteReader())
{
    //rest of your code
}
if (dr.HasRows)
    Importato = true;    
dr.Read();

命令和DataReader是一次性的,所以应该在
中使用
语句。注释而不是回答,因为我不知道这是否能解决您的问题,但您还是应该这样做,特别是在foreach循环中。您是否在web配置的连接字符串中激活了
MultipleActiveResultSets=true
ode试图执行一个查询,但仍在对另一个查询的结果进行迭代(标记为error
,已经有一个打开的DataReader与此命令关联
)。@frnbt22将我的答案标记为解决方案是表示感谢的一种方式:)