我打开的DataReader在哪里?

时间:2014-09-26 07:33:18

标签: c# sqldatareader datareader

我有这个功能:

public void Change_Reservation(string pDataAreaId, string pSalesId, string pCustNum, string pNom, SqlConnection Conn)
    {
        try
        {
            ADV_CdeRAVCollection myColl = new ADV_CdeRAVCollection();
            using (SqlCommand Com = Conn.CreateCommand())
            {
                Com.CommandText = ADV_CdeRAV._SQL_Select_If_Reserve;
                Com.Parameters.AddWithValue("@DataAreaId", pDataAreaId);
                using (SqlDataReader rs = Com.ExecuteReader())
                {
                    while (rs.Read())
                    {
                        ADV_CdeRAV myObj = new ADV_CdeRAV();
                        myObj.AddFromRecordSet_SelectRAV(rs);
                        if (myObj.Nom == null)
                        {
                            res = "null to nom";
                        }
                        else if (myObj.Nom.Trim() == pNom)
                        {
                            res = "nom to null";
                        }
                        myColl.Add(myObj);
                    }
                    Com.Dispose();
                    rs.Close();
                    rs.Dispose();
                }
            }

            if (res == "nom to null")
            {
                //UPDATE NOM TO NULL
                using (SqlCommand Com2 = Conn.CreateCommand())
                {
                    Com2.CommandText = ADV_CdeRAV._SQL_Update_Nom_To_Null;
                    Com2.Parameters.AddWithValue("@DataAreaId", pDataAreaId);
                    Com2.ExecuteReader();
                    Com2.Dispose(); 
                }
            }
            else if (res == "null to nom")
            {
                //UPDATE NULL TO NOM
                using (SqlCommand Com3 = Conn.CreateCommand())
                {
                    Com3.CommandText = ADV_CdeRAV._SQL_Update_Null_To_Nom;
                    Com3.Parameters.AddWithValue("@DataAreaId", pDataAreaId);
                    Com3.ExecuteReader();
                    Com3.Dispose();
                }
            }
            if (myColl.Count == 0)
            {
                //INSERT
                using (SqlCommand Com4 = Conn.CreateCommand())
                {
                    Com4.CommandText = ADV_CdeRAV._SQL_Insert_Reservation;
                    Com4.Parameters.AddWithValue("@DataAreaId", pDataAreaId);
                    Com4.ExecuteReader();
                    Com4.Dispose();
                }
            }
        }
        catch (System.Exception)
        {
            throw;
        }
    }

但我也遇到了这个错误:

  

"已经有一个与此命令关联的开放式数据加载器"。

但我的代码(rs)中的DataReader用于"使用"阻止所以它不能保持打开状态。 我使用"使用"块,将MARS设置为true等等。但是我无法解决这个问题而且我是C#/ ASP.NET的新手。

1 个答案:

答案 0 :(得分:2)

让我们试一试。如果你使用ExecuteNonQuery而不是ExecuteReader进行插入和更新怎么样? 请用**查看下面的代码。

请让我知道结果。

 public void Change_Reservation(string pDataAreaId, string pSalesId, string pCustNum, string pNom, SqlConnection Conn)
        {
            try
            {
                ADV_CdeRAVCollection myColl = new ADV_CdeRAVCollection();
                using (SqlCommand Com = Conn.CreateCommand())
                {
                    Com.CommandText = ADV_CdeRAV._SQL_Select_If_Reserve;
                    Com.Parameters.AddWithValue("@DataAreaId", pDataAreaId);
                    using (SqlDataReader rs = Com.ExecuteReader())
                    {
                        while (rs.Read())
                        {
                            ADV_CdeRAV myObj = new ADV_CdeRAV();
                            myObj.AddFromRecordSet_SelectRAV(rs);
                            if (myObj.Nom == null)
                            {
                                res = "null to nom";
                            }
                            else if (myObj.Nom.Trim() == pNom)
                            {
                                res = "nom to null";
                            }
                            myColl.Add(myObj);
                        }
                        Com.Dispose();
                        rs.Close();
                        rs.Dispose();
                    }
                }

                if (res == "nom to null")
                {
                    //UPDATE NOM TO NULL
                    using (SqlCommand Com2 = Conn.CreateCommand())
                    {
                        Com2.CommandText = ADV_CdeRAV._SQL_Update_Nom_To_Null;
                        Com2.Parameters.AddWithValue("@DataAreaId", pDataAreaId);
                        **Com2.ExecuteNonQuery();**
                        Com2.Dispose(); 
                    }
                }
                else if (res == "null to nom")
                {
                    //UPDATE NULL TO NOM
                    using (SqlCommand Com3 = Conn.CreateCommand())
                    {
                        Com3.CommandText = ADV_CdeRAV._SQL_Update_Null_To_Nom;
                        Com3.Parameters.AddWithValue("@DataAreaId", pDataAreaId);
                        **Com3.ExecuteNonQuery();**
                        Com3.Dispose();
                    }
                }
                if (myColl.Count == 0)
                {
                    //INSERT
                    using (SqlCommand Com4 = Conn.CreateCommand())
                    {
                        Com4.CommandText = ADV_CdeRAV._SQL_Insert_Reservation;
                        Com4.Parameters.AddWithValue("@DataAreaId", pDataAreaId);
                        **Com4.ExecuteNonQuery();**
                        Com4.Dispose();
                    }
                }
            }
            catch (System.Exception)
            {
                throw;
            }
        }