Меню

Ошибка cannot perform this operation on a closed dataset

If you run your application Delphi will restore the open or closed state that the dataset had in the Delphi form designer.

If there is an error Delphi can quitly drop this and close the dataset.
Also it’s possible that you accidently closed the dataset in the designer, after with it no longer auto-opens on ptogram start.
When it’s time to use the dataset you will get this error because the dataset is closed.

One option is to explicitly open the dataset in the FormCreate event and add error handling code there, this will allow you to see the error message and debug from there.

procedure TForm1.FormCreate(sender: TObject);
begin
  try
    MyDBFTable.Open;
  except on exception e do 
    WriteErrorToLogFile('Cannot open MyDBFTable, error is: ' + e.message);
    // or 
    //ShowMessage('Cannot open MyDBFTable, error is: ' + e.message);
  end; {try}
end;

I always do opening of datasets explicitly in FormCreate because this allows me to log any errors. If a client app has an exception it gets emailed to me automatically.

Проблема: При нажатии на кнопку в программе появляется сообщение об ошибке.

Cannot perform this operation on a closed DataSet

Технические детали: На форме есть DataSet (если вы используете компоненты  ADO, тогда это будет ADOQuery, ADOTable, Если UniDac — UniQuery, UniTable… В прочем это не играет большой роли для текущей ситуации). На кнопке был код, который обрабатывал некие данные находящиеся в DataSet’е, при обращении к нему появилась ошибка:

Cannot perform this operation on a closed DataSet


Инструментарий: Delphi XE
Решение: Проблема в том что мы пытаемся обратится к закрытому набору данных DataSet’а, для того чтобы решить данную проблемы пере обращением его нужно открыть.
DataSet.Active
Я к примеру использую процедуру для обновления DataSet’a, если DataSet открыт — обновляем, иначе открываем. Это не универсальное решение, но его можно использовать в большинстве случаев.
procedure RefreshDataSet(DataSet: TDataSet);
begin
if DataSet.Active then
DataSet.Refresh
else
DataSet.Open;
end;

Пример использования:
RefreshDataSet(ADOQuery1);
RefreshDataSet(UniQuery1);

Программная ошибка

ds87
Автор темы
ds87
Автор темы
Репутация: 0
Сообщения: 13
Зарегистрирован: 25.10.2014
С нами: 8 лет 3 месяца
Профессия: инженер

Здравствуйте.
ПО АРМ Орион 1.0 КД, управляющее ОПС и СКУД на объекте. Отработала 3 года. Система «зависла», после перезагрузки компьютера и запуска «Оперативной задачи» вылетает ошибка «tblEvent: Cannot perform this operation on a closed dataset» и, соответственно, «ОЗ» запускается некорректно — управление невозможно. При запуске «Администратора базы данных» выскакивает путь к файлу «eventlog.db», «АБД» при этом тоже не работает. Удаление прошедших событий через «Мастер системы» не помогло. Что делать?
Спасибо.



Mixail 51 M
Активный участник
Активный участник
Аватара
Mixail 51 M
Активный участник
Активный участник
Возраст: 41
Репутация: 102
Сообщения: 2810
Зарегистрирован: 21.03.2015
С нами: 7 лет 10 месяцев
Профессия: инженер по ПБ
Откуда: г. Мурманск

Непрочитанное сообщение #3 Mixail 51 » 22.10.2015, 17:10

Я так понимаю что в системе еще один ПК, или я не прав?

Не ошибается только тот кто не работает.


ds87
Автор темы
ds87
Автор темы
Репутация: 0
Сообщения: 13
Зарегистрирован: 25.10.2014
С нами: 8 лет 3 месяца
Профессия: инженер

ds87
Автор темы
ds87
Автор темы
Репутация: 0
Сообщения: 13
Зарегистрирован: 25.10.2014
С нами: 8 лет 3 месяца
Профессия: инженер

Непрочитанное сообщение #5 ds87 » 26.10.2015, 14:56

Болид ответил: «Выполните проверку БД, через Мастер системы. По результатам проверки выполните Лечение/Модернизацию БД.»
Решение проблемы заняло 1 минуту.
:te_ma-clo_se:



  • 1
    1291

    google
    Перейти к последнему сообщению
    25.02.2019, 09:17
  • 12
    3655

    DruG
    Перейти к последнему сообщению
    11.04.2022, 17:54
  • 1
    868

    Shym
    Перейти к последнему сообщению
    31.01.2020, 19:55
  • 1
    1441

    MadHacker
    Перейти к последнему сообщению
    11.05.2018, 16:52
  • 0
    2064

    graunf
    Перейти к последнему сообщению
    08.11.2018, 16:30
  • 1
    551

    DruG
    Перейти к последнему сообщению
    12.05.2020, 06:36
  • 3
    445

    DruG
    Перейти к последнему сообщению
    21.12.2021, 17:31
  • 0
    67

    deadbeat321
    Перейти к последнему сообщению
    16.12.2022, 17:00
  • 4
    2024

    triiks
    Перейти к последнему сообщению
    20.10.2018, 00:12
  • 2
    48

    zaets75
    Перейти к последнему сообщению
    18.01.2023, 16:17

Вернуться в «АРМ Орион»

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    >
    Cannot perform this operation on a closed dataset!

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    03.04.09, 05:31

      Добрый день! Пишу небольшую базу данных на делфи! вроде все делаю правильно , но постоянно выходит ошибка Cannot perform this operation on a closed dataset! Работаю с компонентом kmemtable (позволяет создавать таблицу в памяти, выгружать и загружать). Вот сам код

      ExpandedWrap disabled

        if od.Execute then

        begin

        sfCSV.CSVQuote:='»‘;

        sfCSV.CSVRecordDelimiter:=’,’;

        showmessage(‘1’);

        bdcomp1.Active:=true;

        bdcomp1.Open;

        if bdcomp1.Active then showmessage(‘îòêðûòà’);

        bdcomp1.LoadFromFileViaFormat(‘c:1.csv’,sfCSV);

        showmessage(‘îòêðûò111à’);

        dsbdcomp.DataSet:=bdcomp1;

        bdcomp1.Active:=true;

        end;

      Не смотрите что код кривой, просто я уже проверки делаю на активность базы. А ошибка выходит на строчке bdcomp1.LoadFromFileViaFormat(‘c:1.csv’,sfCSV);
      кто что может подсказать, а то у меня вариантов не осталось!

      Сообщение отредактировано: Bas — 03.04.09, 05:39


      Ahil



      Сообщ.
      #2

      ,
      03.04.09, 05:50

        Full Member

        ***

        Рейтинг (т): 9

        Прежде чем стото делать с данными их надо открыть. (open or active=true). Компонент мне неизвестен. Что делает загрузка из файла?


        ximik666



        Сообщ.
        #3

        ,
        03.04.09, 05:52

          так в том то и дело, что таблица открыта! Загрузка делает загрузку из специального файла! и добавление строчки проходит нормально!

          Сообщение отредактировано: ximik666 — 03.04.09, 05:53


          Frees



          Сообщ.
          #4

          ,
          03.04.09, 05:53

            под дебагом зайди в процедуру LoadFromFileViaFormat и посмотри на чем он ломается


            ximik666



            Сообщ.
            #5

            ,
            03.04.09, 05:53

              если несекрет как под дебагерром посмотреть?


              Frees



              Сообщ.
              #6

              ,
              03.04.09, 05:55

                поставь курсор на эту строку и нажми F5
                запусти прогу нажим F7 и ты зайдеш в эту процедуру и смотри что за код там написан и что происходи


                ximik666



                Сообщ.
                #7

                ,
                03.04.09, 06:00

                  че то пока не могу разобраться! но ведь по идее таблица у меня открыта, почему может быть такая ошибка?
                  жму ф7 сначала раннинг а потом сразу стоп! почему?

                  Сообщение отредактировано: ximik666 — 03.04.09, 06:02


                  Ahil



                  Сообщ.
                  #8

                  ,
                  03.04.09, 06:11

                    Full Member

                    ***

                    Рейтинг (т): 9

                    Ели bdcomp1 это набор данных то вам достаточно сделать опен. Потом посмотрите есть ли у этого компонента свойство reqwestlife (както так) и сделайте его труе.

                    ExpandedWrap disabled

                      if od.Execute then

                      begin

                      sfCSV.CSVQuote:='»‘;

                      sfCSV.CSVRecordDelimiter:=’,’;

                      showmessage(‘1’);

                      bdcomp1.Open;

                      bdcomp1.reqwestlife:=true;

                      //if bdcomp1.Active then showmessage(‘îòêðûòà’);

                      bdcomp1.LoadFromFileViaFormat(‘c:1.csv’,sfCSV);

                      showmessage(‘îòêðûò111à’);

                      //dsbdcomp.DataSet:=bdcomp1;

                      //bdcomp1.Active:=true;

                      end;

                    Добавлено 03.04.09, 06:12
                    requestlive


                    ximik666



                    Сообщ.
                    #9

                    ,
                    03.04.09, 06:16

                      такого сойства у него нет! смое главное что добавление с помощью дбнавигатора проходит нормально


                      Ahil



                      Сообщ.
                      #10

                      ,
                      03.04.09, 06:38

                        Full Member

                        ***

                        Рейтинг (т): 9

                        Значит проблем в загрузке из файла.


                        ximik666



                        Сообщ.
                        #11

                        ,
                        03.04.09, 06:40

                          укороче даже на чистой программе котороя ниже тоже выдает ошибку!

                          ExpandedWrap disabled

                            procedure TForm1.FormCreate(Sender: TObject);

                            begin

                            with mem do

                                  begin

                                    Active := False;  // òàáëèöà äîëæíà áûòü çàêðûòà

                                     // òåïåðü îïðåäåëÿåì ïîëÿ

                                        with FieldDefs do

                                           begin

                                              Clear;

                                              Add(‘fio’, ftString, 60, True);

                                        end;

                                         CreateTable;

                                  end;

                            end;

                            procedure TForm1.sBitBtn1Click(Sender: TObject);

                            begin

                                    sfCSV.CSVQuote:='»‘;

                                    sfCSV.CSVRecordDelimiter:=’,’;

                                    mem.Open;

                                     mem.LoadFromFileViaFormat(‘c:1.csv’,sfCSV);

                                    mem.Active:=true;

                            end;

                            end.

                          Сообщение отредактировано: Bas — 03.04.09, 06:55


                          Демо



                          Сообщ.
                          #12

                          ,
                          03.04.09, 06:50

                            Что же всё-таки такое LoadFromFileViaFormat?


                            ximik666



                            Сообщ.
                            #13

                            ,
                            03.04.09, 07:00

                              это процедура компонента kmemtable, которая позволяет загрузить файл определеннго формата! ну короче в этом файле хранится вся конфигурация и данные о виртуальной базе


                              ximik666



                              Сообщ.
                              #14

                              ,
                              06.04.09, 05:44

                                Все всем спасибо вопрос решен! Теперь вопрос не по теме где можно посмотреть дизайны программ? ну для сравнения и чтобы для себя что нибудь взять!

                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                0 пользователей:

                                • Предыдущая тема
                                • Delphi: Базы данных
                                • Следующая тема

                                Рейтинг@Mail.ru

                                [ Script execution time: 0,0977 ]   [ 16 queries used ]   [ Generated: 30.01.23, 01:18 GMT ]  

                                 
                                Andriy Tysh
                                 
                                (2004-05-22 10:49)
                                [0]

                                Из-за чего может вылетать ошибка в ClientDataSet: «Cannot perform this operation on a closed dataset», если учесть, что после каждого едита или инсерта корректно стоит пост? Использую грид DBGridEh.


                                 
                                Алхимик ©
                                 
                                (2004-05-22 11:01)
                                [1]

                                «Cannot perform this operation on a closed dataset»
                                «Не могу выполнить эту операцию на закрытом наборе данных»


                                 
                                Andriy Tysh
                                 
                                (2004-05-22 14:25)
                                [2]


                                > Алхимик ©   (22.05.04 11:01) [1]
                                > «Cannot perform this operation on a closed dataset»
                                > «Не могу выполнить эту операцию на закрытом наборе данных»

                                Сенкс за транслейт!
                                🙂
                                Но у меня с этим нет проблемы, а с клиентдатасетом. Он открывается на Шов формы, а закрывается на Клоус.


                                 
                                Anatoly Podgoretsky ©
                                 
                                (2004-05-22 14:35)
                                [3]

                                Из за чего угодно, но в момент выполнения операции набор данных закрыт, хочешь выполнять то сначала открой его.


                                 
                                Andriy Tysh
                                 
                                (2004-05-24 10:29)
                                [4]


                                > Anatoly Podgoretsky ©   (22.05.04 14:35) [3]
                                > Из за чего угодно, но в момент выполнения операции набор
                                > данных закрыт, хочешь выполнять то сначала открой его.

                                Я это прекрасно понимаю. Вот и ставлю вопрос, что может кроме меня его закрыть. Может DBGridEh, или что-то ещё. Так как я точно не закрываю!


                                 
                                Sergey13 ©
                                 
                                (2004-05-24 10:39)
                                [5]

                                2Andriy Tysh   (24.05.04 10:29) [4]
                                Ну повесь на ОнКлозе месадж и посмотри когда закрывается.


                                 
                                31512 ©
                                 
                                (2004-05-24 11:13)
                                [6]

                                А в каком контексте возикает такая ошибка? Можно привести кусок кода?


                                 
                                Andriy Tysh
                                 
                                (2004-05-24 11:37)
                                [7]

                                Только-что доследил где точно вылетает.
                                Есть одна функция, которая удалает записи по условию:
                                function DeleteByFilter(AClient: TDataSet; AFilter: String): Integer;
                                var ATmpClient: TClientDataSet;
                                begin
                                 if not AClient.Active then
                                   Result:=0
                                 else
                                 try
                                   ATmpClient:=TClientDataSet.Create(nil);
                                   try
                                     with ATmpClient do
                                     begin
                                3        PacketRecords:=0;
                                       CloneCursor(TClientDataSet(AClient), True);
                                       Filter:=AFilter;
                                       Filtered:=True;
                                       Result:=RecordCount;
                                       First;
                                       while not Eof do
                                         Delete;
                                     end;
                                   finally
                                     FreeAndNil(ATmpClient);
                                   end;
                                 except
                                   Result:=0;
                                 end;
                                end;

                                Ставлю её на поп-ап меню. Выполняю, соответственно удаляються записи, которые относятся к номеру заказа, напр., 37002.
                                Потом пробую добавить снова номер 37002:
                                Client.Append;//State dsBrowse не переходит почему в dsInsert, а остаётся тем же
                                Client.FieldByName("...").As...:=...;//Здесь и вылетает ошибка
                                ...
                                Client.Post;

                                P.S.: Если не вызывать в процессе работы этой ф-ии, то всё ОК


                                 
                                31512 ©
                                 
                                (2004-05-24 11:45)
                                [8]

                                ATmpClient:=TClientDataSet.Create(nil) — Вижу

                                ATmpClient.Open или ATmpClient.Active := True — не вижу.


                                 
                                Andriy Tysh
                                 
                                (2004-05-24 11:49)
                                [9]


                                > 31512 ©   (24.05.04 11:45) [8]
                                > ATmpClient:=TClientDataSet.Create(nil) — Вижу
                                >
                                > ATmpClient.Open или ATmpClient.Active := True — не вижу.

                                Действительно нет. Но только-что добавил-эффекта нет. Тот же результат.


                                 
                                Vlad ©
                                 
                                (2004-05-24 11:54)
                                [10]


                                > Andriy Tysh   (24.05.04 11:49) [9]

                                А чего же ты хочешь, если у тебя FreeAndNil происходит ?


                                 
                                31512 ©
                                 
                                (2004-05-24 12:05)
                                [11]


                                > Andriy Tysh   (24.05.04 11:49) [9]

                                Равно как не установлен источник данных для ATmpClient.
                                Смотри внимательнее!


                                 
                                sniknik ©
                                 
                                (2004-05-24 12:10)
                                [12]

                                попробуй его закрыть, перед уничтожением. (лишним не будет)

                                а сам метод мне чегото не нравится, сам по другому бы сделал, без дублей.


                                 
                                31512 ©
                                 
                                (2004-05-24 12:30)
                                [13]

                                Если в AClient передаётся TClientDataSet то предлагаю написать так:

                                function DeleteByFilter(AClient: TDataSet; AFilter: String): Integer;
                                begin
                                with (AClient as TClientDataSet) do
                                begin
                                if not Active then Result:=0
                                else
                                try
                                 PacketRecords:=0;
                                 Filter:=AFilter;
                                 Filtered:=True;
                                 Result:=RecordCount;
                                 First;
                                 while not Eof do
                                   Delete; // тут пожоже надо ещё кое - что типа Next
                                except
                                  Result:=0;
                                end;
                                end;
                                end;

                                А вообще-то вместо TDataSet можно и TClientDataSet. И никаких as уже не надо.


                                 
                                Vlad ©
                                 
                                (2004-05-24 12:41)
                                [14]


                                > 31512 ©   (24.05.04 12:30) [13]


                                >  while not Eof do
                                >    Delete; // тут пожоже надо ещё кое - что типа Next

                                Ничего типа Next там не надо, все итак верно


                                 
                                31512 ©
                                 
                                (2004-05-24 12:48)
                                [15]


                                > Vlad ©   (24.05.04 12:41) [14]

                                Значит я ошибся.


                                 
                                sniknik ©
                                 
                                (2004-05-24 13:23)
                                [16]

                                попробуй так, если не пройдет значит дело не в этой процедуре

                                function DeleteByFilter(AClient: TDataSet; AFilter: String): Integer;
                                var RNo: integer;
                                begin
                                 Result:= 0;
                                 if not AClient.Active then Exit;

                                 with AClient do begin
                                   DisableControls;
                                   try
                                     try
                                       RNo:= RecNo;
                                       Filter:= AFilter;
                                       Filtered:= True;
                                       Result:= RecordCount;
                                       while not Eof do Delete;
                                       Filtered:= False;
                                       if RNo <= RecordCount then RecNo:= RNo
                                                             else RecNo:= RecordCount;
                                     except
                                       Result:= 0;
                                     end;
                                   finally
                                     Filtered:= False;
                                     EnableControls;
                                   end;
                                 end;
                                end;


                                 
                                sniknik ©
                                 
                                (2004-05-24 13:35)
                                [17]

                                заменить, чтобы на пустой не ругалось, мало ли, может последнюю удаляем

                                 if not isEmpty then
                                   if RNo <= RecordCount then RecNo:= RNo
                                                         else RecNo:= RecordCount;


                                 
                                Andriy Tysh
                                 
                                (2004-05-24 14:23)
                                [18]

                                Спасибо, сейчас попробую.

                                P.S.: Если вместо аппенд поставить инсерт — всё алес гут.


                                 
                                Andriy Tysh
                                 
                                (2004-05-24 15:57)
                                [19]

                                Лучше работает, чем моя ф-ия. Но всё же на протяжении 5 минут тестирования один раз такой же глюк произошёл. Может случайно Ещё я доследил: если после аппенд написать едит, то всё нормально.


                                0 0 голоса
                                Рейтинг статьи
                                Подписаться
                                Уведомить о
                                guest

                                0 комментариев
                                Старые
                                Новые Популярные
                                Межтекстовые Отзывы
                                Посмотреть все комментарии

                                А вот еще интересные материалы:

                              • Яшка сломя голову остановился исправьте ошибки
                              • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
                              • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
                              • Ошибка cannot open file fsgame ltx check your working folder что делать
                              • Ошибка cannot open file fsgame ltx check your working folder тень чернобыля