Cannot perform this operation on a closed dataset как исправить

При выполнении следующего кода:

procedure TForm4.Timer1Timer(Sender: TObject);
var
  a: Integer;
begin
  a := DM.ADOQuery9.RecNo;
  user := LoggedOnUserNameEx(3);
  DM.ADOQuery9.Active := False;
  DM.ADOQuery9.SQL.Clear;
  DM.ADOQuery9.SQL.Text := 'Select * from Application where (Status=' +
    QuotedStr('Открыта') + ' or Status=' + QuotedStr('В процессе') + ')' +
    ' and (Account=' + QuotedStr(user) + ')';
  DM.ADOQuery9.Active := true;
  DM.ADOQuery9.RecNo := a;
end;
end.

выскакивает ошибка:

ADOQuery9. cannot perform this operation on a closed dataset

Так и не нашел места в коде, где я должен открыть набор данных для редактирования, или я вообще не туда копаю?

Kromster's user avatar

Kromster

13.5k12 золотых знаков43 серебряных знака72 бронзовых знака

задан 8 июн 2018 в 9:59

e.khamidullin's user avatar

9

Попробуй

  form1.ADOQuery1.Close;
  form1.ADOQuery1.SQL.Clear;
  form1.ADOQuery1.SQL.Add('Select * from Application where (Status=' +
QuotedStr('Открыта') + ' or Status=' + QuotedStr('В процессе') + ')' +
' and (Account=' + QuotedStr(user) + ');
  form1.ADOQuery1.Open;
  form1.ClientDataSet1.Refresh;

ответ дан 10 июн 2018 в 19:33

Program_Casual's user avatar

1

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

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);

Через поиск в абд попробовал найти сотрудника. В строке поиска ввёл саба и на экране появилось предупреждение:недопустимое имя столбца саба. Я нажал ок и на экране новое предупреждение Cannot perform this operation on a closed dataset”. До этого все работало хорошо. Сталкивались ли с подобным и как решали? 

1 год 8 месяцев назад

avatar

#ссылка

1 ответ

Помогла простая перезагрузка

1 год 8 месяцев назад

avatar

#ссылка

Добавить ответ

Для добавления сообщений на форуме вам необходимо зарегистрироваться и указать мобильный телефон в своем профиле (зачем?)

ЗАДАН

1 год 8 месяцев назад

По каждому вопросу/ответу можно добавлять комментарии. Комментарии предназначены для уточнения вопроса/ответа.

SashaBucheR

0 / 0 / 0

Регистрация: 11.07.2013

Сообщений: 7

1

11.07.2013, 12:07. Показов 52993. Ответов 11

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день! Есть такая проблемка: в наследство досталась программа, которая связывается с SQL сервером. Поставил вместо старого sql 2005 b поменял в ADOConnection путь. Теперь выдает ошибку: cannot perform this operation on a closed dataset (сама программа загружается и данные отображаются, это только когда начинаешь редактировать). В коде есть вот такая ерунда:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
begin
  Application.ProcessMessages;
  sConnection := 'Provider=SQLOLEDB.1;' +
                    'Integrated Security=SSPI;' +
                   // 'Persist Security Info=False;'+
                  //  'User ID=sа;'+
                    'Initial Catalog='+ ConfigParams.FindParam('DATABASE').Value+';'+
                    'Data Source='+ ConfigParams.FindParam('SERVER-GETSQ').Value+';'+
                    'Use Procedure for Prepare=1;'+
                    'Auto Translate=True;'+
                    'Packet Size=4096;'+
                    'Workstation ID='+s+ ';'+
                    'Use Encryption for Data=False;'+
                    'Tag with column collation when possible=False';
end;

Пробовал и Integrated Security и через Юзера, толку нет. Самое интересное, что есть еще программа, которая работает с этой же базой, она работает полностью и редактировать данные можно. Где все-таки косяк? В Делфи или SQL (на сервере проверка подлинности стоит и Windows и SQl)?



0



478 / 391 / 112

Регистрация: 24.04.2012

Сообщений: 1,622

Записей в блоге: 3

11.07.2013, 12:31

2

Цитата
Сообщение от SashaBucheR
Посмотреть сообщение

cannot perform this operation on a closed dataset

“невозможно выполнить операцию при закрытом наборе данных”, т.е. при редактировании идет обращение к DataSet’у, а он в свою очерез закрыт. А этот код скорее всего с ошибкой никак не связян, т.к. это строка подключения к БД.
Ищи DataSet



0



0 / 0 / 0

Регистрация: 11.07.2013

Сообщений: 7

11.07.2013, 13:37

 [ТС]

3

Я понял, что это строка подключения. Просто думал, что он подключается как-то с ограниченным доступом… Сейчас гляну DataSet. Вот только я слабоват… Нашел где DataSet, а что там проверить, прописать, чтобы он был открыт)
DataSet.Open;?



0



968 / 643 / 97

Регистрация: 01.11.2012

Сообщений: 1,447

11.07.2013, 15:01

4

SashaBucheR, попробуйте у всех Датасетов (ADOTable, ADODataSet, ADOQuery), которые были подключены к вашему ADOConnection изменить свойство Active на значение True.



0



0 / 0 / 0

Регистрация: 11.07.2013

Сообщений: 7

11.07.2013, 15:24

 [ТС]

5

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

Это во время CreateForm



0



0 / 0 / 0

Регистрация: 11.07.2013

Сообщений: 7

11.07.2013, 15:46

 [ТС]

6

Когда подключаюсь под sa сначала выдает такие две картинки.

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

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

А потом опять “cannot perform this operation on a closed dataset”



0



478 / 391 / 112

Регистрация: 24.04.2012

Сообщений: 1,622

Записей в блоге: 3

12.07.2013, 05:12

7

Картинки это конечно хорошо, но еще бы и код немешало бы посмотреть, который их вызывает.



0



SashaBucheR

0 / 0 / 0

Регистрация: 11.07.2013

Сообщений: 7

12.07.2013, 08:45

 [ТС]

8

Выбивает на строке OpenADOTables

Delphi
1
2
3
4
5
6
7
procedure TDM.DataModuleCreate(Sender: TObject);
begin
    ConfigParams := TParams.Create;
    LoadConfig(ExtractFilePath(Application.ExeName)+'config.ini');
    BuildConnection;
    OpenADOTables
end;

Добавлено через 36 минут
cannot perform this operation on a closed dataset например выбивает при создании новой карточки, вот код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
procedure TfrmCardsIn.NewInvoiceIn;
var
    mR : integer;
begin
    SetEnebledControl(ATYPE);
    DM.tblInvoiceIn.Append;
    DM.tblInvoiceIn['TYPE'] := ATYPE;
    case ATYPE of
    0:
    begin
        DM.tblInvoiceIn['XDSTID']:= '99999';
        DM.tblInvoiceIn['XSRCID']:= '0';
        DM.tblInvoiceIn.FieldByName('GUID').Value := DM.tblInvoiceMax.FieldByName('AMAX').AsInteger + 1;
        DM.tblInvoiceIn.FieldByName('SERIES').Value := DM.tblMaxNumber.FieldByName('SERIES').AsString ;
        DM.tblInvoiceIn.FieldByName('ANUMBER1').Value := DM.tblMaxNumber.FieldByName('ANUMBER').AsInteger  + 1;
        DM.tblInvoiceIn.FieldByName('ANUMBER2').Value := DM.tblMaxNumber.FieldByName('ANUMBER').AsInteger  + 1;
        DM.tblInvoiceIn.FieldByName('ADATE').Value := StrToDate(DM.ConfigParams.FindParam('WorkDate').Value);
        DM.tblInvoiceIn.FieldByName('DSTAMOUNT').Value := 0;
        DM.tblInvoiceIn.FieldByName('SRCAMOUNT').Value := 0;
    end;
    1:
    begin
        DM.tblInvoiceIn['XDSTID']:= '0';
        DM.tblInvoiceIn['XSRCID']:= '0';
        DM.tblInvoiceIn.FieldByName('GUID').Value := DM.tblInvoiceMax.FieldByName('AMAX').AsInteger + 1;
        DM.tblInvoiceIn.FieldByName('SERIES').Value := DM.tblMaxNumber.FieldByName('SERIES').AsString ;
        DM.tblInvoiceIn.FieldByName('ANUMBER1').Value := DM.tblMaxNumber.FieldByName('ANUMBER').AsInteger  + 1;
        DM.tblInvoiceIn.FieldByName('ANUMBER2').Value := DM.tblMaxNumber.FieldByName('ANUMBER').AsInteger  + 1;
        DM.tblInvoiceIn.FieldByName('ADATE').Value := StrToDate(DM.ConfigParams.FindParam('WorkDate').Value);
        DM.tblInvoiceIn.FieldByName('DSTAMOUNT').Value := 0;
        DM.tblInvoiceIn.FieldByName('SRCAMOUNT').Value := 0;
 
        DM.tblMinNumber.Parameters.ParamByName('@SELFDIRID').Value := DM.tblInvoiceIn.FieldByName('XDSTID').AsString;
        DM.tblMinNumber.Open;
        DM.tblInvoiceIn.FieldByName('SERIES').AsString := DM.tblMinNumber.FieldByName('SERIES').AsString;
        DM.tblInvoiceIn.FieldByName('ANUMBER1').AsInteger := DM.tblMinNumber.FieldByName('ANUMBER').AsInteger;
        DM.tblInvoiceIn.FieldByName('ANUMBER2').AsInteger := DM.tblMinNumber.FieldByName('ANUMBER').AsInteger;
        DM.tblMinNumber.Close
    end;
    2:
    begin
        DM.tblInvoiceIn['XDSTID']:= '0';
        DM.tblInvoiceIn['XSRCID']:= '99999';
        DM.tblInvoiceIn.FieldByName('GUID').Value := DM.tblInvoiceMax.FieldByName('AMAX').AsInteger + 1;
        DM.tblInvoiceIn.FieldByName('SERIES').Value := DM.tblMaxNumber.FieldByName('SERIES').AsString ;
        DM.tblInvoiceIn.FieldByName('ANUMBER1').Value := 0;//DM.tblMaxNumber.FieldByName('ANUMBER').AsInteger  + 1;
        DM.tblInvoiceIn.FieldByName('ANUMBER2').Value := 0;//DM.tblMaxNumber.FieldByName('ANUMBER').AsInteger  + 1;
        DM.tblInvoiceIn.FieldByName('ADATE').Value := StrToDate(DM.ConfigParams.FindParam('WorkDate').Value);
        DM.tblInvoiceIn.FieldByName('DSTAMOUNT').Value := 0;
        DM.tblInvoiceIn.FieldByName('SRCAMOUNT').Value := 0;
 
    end;
    3:
    begin
        DM.tblInvoiceIn['XDSTID']:= '0';
        DM.tblInvoiceIn['XSRCID']:= '99999';
        DM.tblInvoiceIn.FieldByName('GUID').Value := DM.tblInvoiceMax.FieldByName('AMAX').AsInteger + 1;
        DM.tblInvoiceIn.FieldByName('SERIES').Value := DM.tblMaxNumber.FieldByName('SERIES').AsString ;
        DM.tblInvoiceIn.FieldByName('ANUMBER1').Value := 0;//DM.tblMaxNumber.FieldByName('ANUMBER').AsInteger  + 1;
        DM.tblInvoiceIn.FieldByName('ANUMBER2').Value := 0;//DM.tblMaxNumber.FieldByName('ANUMBER').AsInteger  + 1;
        DM.tblInvoiceIn.FieldByName('ADATE').Value := StrToDate(DM.ConfigParams.FindParam('WorkDate').Value);
        DM.tblInvoiceIn.FieldByName('DSTAMOUNT').Value := 0;
        DM.tblInvoiceIn.FieldByName('SRCAMOUNT').Value := 0;
 
    end;
 
    end;
 
 
    Mr := frmEditCard.ShowModal;
    if mR = mrOK then
    begin
        try
            DM.tblInvoiceIn.Post;
            case ATYPE of
            0: DM.qryInvoiceIn.Requery;
            1: DM.qryInvoiceReplace.Requery;
            2: DM.qryInvoiceRemove.Requery;
            3: DM.qryInvoiceSpoil.Requery;
            end;
            //(dsCards.DataSet).Refresh;
            dsCards.DataSet.Locate('GUID',DM.tblInvoiceIn['GUID'],[])
        except
            on E: Exception do
            begin
                ShowMessage(E.Message);
                DM.tblInvoiceIn.Cancel
            end
        end;
    end
    else DM.tblInvoiceIn.Cancel
end;



0



478 / 391 / 112

Регистрация: 24.04.2012

Сообщений: 1,622

Записей в блоге: 3

15.07.2013, 09:58

9

а код OpenADOTables?



0



SashaBucheR

0 / 0 / 0

Регистрация: 11.07.2013

Сообщений: 7

16.07.2013, 11:11

 [ТС]

10

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TDM.OpenADOTables;
var
    i : integer;
    Temp : TComponent;
begin
    if ADOConn.Connected then
        for i := ComponentCount - 1 downto 0 do
        begin
            Temp := Components[i];
            if Temp is TADOTable then
            begin
                (Temp as TADOTable).Close;
                (Temp as TADOTable).Open;
            end;
        end;
end;

В том коде, что открытие карточки, я поставил проверку состояния DataSet:

Delphi
1
2
3
4
    If dsCards.DataSet.State = dsInactive Then
      ShowMessage('Close!')
    else
      ShowMessage('Open!');

Выбивает Open, то есть, как бы Dataset активен…



0



Bit_Man

478 / 391 / 112

Регистрация: 24.04.2012

Сообщений: 1,622

Записей в блоге: 3

17.07.2013, 10:03

11

Цитата
Сообщение от SashaBucheR
Посмотреть сообщение

Выбивает на строке OpenADOTables

Если так то проверяй Таблицы после открытия

Delphi
1
(Temp as TADOTable).Open;

Цитата
Сообщение от SashaBucheR
Посмотреть сообщение

выбивает при создании новой карточки

Delphi
1
DM.tblInvoiceIn.Append;

Добавлено через 3 минуты

Delphi
1
DM.tblInvoiceIn.Active

??



0



0 / 0 / 0

Регистрация: 11.07.2013

Сообщений: 7

18.07.2013, 11:39

 [ТС]

12

Там действительно была проблема в таблицах. В ComboBox как-то DataSource сбились. Вот только теперь выдает “Exception class EDatabaseError with message: Circular datalinks are not allowed” при создании формы.

Добавлено через 2 часа 22 минуты
В DataSource не тот Table указал. Теперь все заработало! Спасибо!



0



Knowledge

NPrinting error: Cannot perform this operation on a closed dataset

Article Number: 000008074 | Last Modified: 2019/12/12

Description

The error message is shown by NPrinting Server, normally when you click on the “Monitoring tool” option.

Cause

The problem is due to a corruption in the schedules.xml file.

Resolution

This problem is due to a corrupted file.

To remove the corrupted file:

  • Open NPrinting Server and stop the service.
  • Open the folder C:ProgramDataNPrintingMonitor
  • Remove the file schedules.xml
  • Restart  the server.

Does this resolve the problem?

If not, within the NPrinting Management Console, stop the NPrinting Server service, remove the schedules.xml file from this directory and reinstall NPrinting Server service.  A new schedules.xml file will be generated.

Get Answers


Find Answers

Qlik Community

Collaborate with over 60,000 Qlik technologists and members around the world to get answers to your questions, and maximize success.

Join Us


Get Support

Have a Question?

Search Qlik’s Support Knowledge database or request assisted support for highly complex issues.

Submit a case


Talk with a Representative

Critical Issues

Experiencing a serious issue, please contact us by phone. For Data Integration related issues please refer to your onboarding documentation for current phone number.

Call Us

Добавить комментарий