Неверная попытка вызвать Read, когда программа чтения закрыта, но неизвестно, что пошло не так.

Я просмотрел stackoverflow, но не могу найти ответ. Может быть, я пропускаю это. Это мой код. после первого, пока он продолжает возвращаться к циклу, и после того, как я закрываю читатель, он возвращается к пока (reader.read())

   public string VoegHoeveelheidToe(string HandmatigHoeveelheid, string ControleerBarcode)
      {
            string i = null;
            int Beginhoeveelheid;
            int ToeTeVoegenHoeveelheid;
            ToeTeVoegenHoeveelheid = Convert.ToInt32(HandmatigHoeveelheid);
            try
            {
                connectie.Open();
                OleDbDataReader reader = null;
                OleDbCommand command = new OleDbCommand("SELECT hoeveelheid from Voorraad,Product Where Voorraad.Barcode = Product.Barcode AND Voorraad.Barcode = '" + ControleerBarcode + "'", connectie);
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Beginhoeveelheid = reader.GetInt32(0);
                    ToeTeVoegenHoeveelheid = Beginhoeveelheid + Convert.ToInt32(HandmatigHoeveelheid);
                    if(ToeTeVoegenHoeveelheid < Beginhoeveelheid)
                    {
                        i = Convert.ToString(3);
                    }
                    else
                    {
                        connectie.Close();
                        try
                        {
                            connectie.Open();
                            OleDbCommand command1 = new OleDbCommand();
                            command1.Connection = connectie;
                            string query = "Update Voorraad set hoeveelheid = " + ToeTeVoegenHoeveelheid + " Where barcode='" + ControleerBarcode + "'";
                            command1.CommandText = query;
                            command1.ExecuteNonQuery();
                            i = Convert.ToString(1);
                            connectie.Close();                                
                        }
                        catch (Exception)
                        {
                            i = Convert.ToString(2);
                        }

                    }
                }

            }
            catch (Exception )
            {
                i = Convert.ToString(2);
            }
            connectie.Close(); return i;

person Qun    schedule 25.01.2015    source источник
comment
Я не понимаю этого после первого, пока он продолжает возвращаться к циклу while. Разве не так уже работает оператор while?   -  person Soner Gönül    schedule 25.01.2015


Ответы (1)


Вы закрываете соединение внутри while. Это неявно закроет всех читателей, отсюда и ошибка. В основном: не делайте этого. Я настоятельно рекомендую добавить операторы using вместо закрытия и try/catch, finally, а также выйти из цикла: break.

Я не уверен, почему у вас есть connectie.Close(); внутри цикла; возможно, вы добавили это из-за проблемы «несколько активных читателей на соединении». Если это так, вам нужно будет буферизовать информацию о том, что вы хотите сделать во время первого чтения, и выполнять ожидающие команды только после завершения чтения. Или используйте несколько подключений.

person Marc Gravell    schedule 25.01.2015
comment
@Qun: я согласен с замечаниями Марка по поводу конкретной ошибки здесь. Однако код кажется сломанным и в других отношениях. В частности: if(ToeTeVoegenHoeveelheid < Beginhoeveelheid), который проверяет неизменяемое условие для метода, т. е. результат сравнения полностью зависит от значения HandmatigHoeveelheid, которое никогда не меняется во время метода. Также странно, что HandmatigHoeveelheid не просто преобразуется в int один раз (или передается как один!), и что вы просите .NET преобразовать литералы int в экземпляры string (для i), в то время как литерал string работал бы так же хорошо. - person Peter Duniho; 25.01.2015