Ошибка операция не допускается если

daviddraiman

0 / 0 / 0

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

Сообщений: 33

1

Ошибка авторизации «Операция не допускается, если объект открыт»

01.03.2016, 15:11. Показов 4523. Ответов 11

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


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

В бд хранятся пользователи и пароли.Для авторизации в приложении использую код :

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
    ADOQuery1.Close;
    ADOQuery1.SQL.Text:='SELECT * FROM Сотрудники WHERE Логин = :p_login AND Пароль = :p_passw';
  if (Form2.Edit1.Text <> '') and (Form2.Edit2.Text <> '')
  then
  begin
    ADOQuery1.Parameters.ParamByName('p_login').Value := Form2.Edit1.Text;
    ADOQuery1.Parameters.ParamByName('p_passw').Value := Form2.Edit2.Text;
    try
      ADOQuery1.Open;
    Except
      ShowMessage('Не удалось открыть таблицу пользователей');
      Exit;
    end;
    if ADOQuery1.RecordCount > 0
    then
    begin
      ShowMessage('Вход успешно выполнен');
      Form2.Close;
      Form1.Show;
    end
    else
    begin
      ShowMessage('Неверный логин или пароль.Повторите ввод');
      Form2.Edit1.Text := '';
      Form2.Edit2.Text := '';
    end;
  end
  else
    ShowMessage('Пустые поля логнпароль не допускаются');
end;

Если попытка входа осуществляется не с первой попытки, то появляется ошибка
«Операция не допускается, если объект открыт»
Подскажите пожалуйста в чем ошибка. И ещё , Form1.Show; — форма показывается на секунду и сразу закрывается. Как нужно правильно написать.



0



Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

01.03.2016, 15:11

11

5095 / 4106 / 1029

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

Сообщений: 26,054

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

01.03.2016, 15:20

2

полный код покажите



0



daviddraiman

0 / 0 / 0

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

Сообщений: 33

01.03.2016, 15:26

 [ТС]

3

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
unit Unit2;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Data.Win.ADODB, Vcl.StdCtrls;
 
type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
 
 
implementation
    uses unit1;
{$R *.dfm}
 
procedure TForm2.Button1Click(Sender: TObject);
begin
 ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; '+
                              'Persist Security Info=False; Data Source='+
   ExtractFilePath(Application.ExeName)+'db1.mdb';
 
    ADOQuery1.Close;
    ADOQuery1.SQL.Text:='SELECT * FROM Сотрудники WHERE Логин = :p_login AND Пароль = :p_passw';
  if (Form2.Edit1.Text <> '') and (Form2.Edit2.Text <> '')
  then
  begin
    ADOQuery1.Parameters.ParamByName('p_login').Value := Form2.Edit1.Text;
    ADOQuery1.Parameters.ParamByName('p_passw').Value := Form2.Edit2.Text;
    try
      ADOQuery1.Open;
    Except
 
      ShowMessage('Не удалось открыть таблицу пользователей');
      Exit;
    end;
    if ADOQuery1.RecordCount > 0
    then
    begin
      ShowMessage('Вход успешно выполнен');
      Form2.Close;
      Form1.show;
    end
    else
    begin
 
      ShowMessage('Неверный логин или пароль.Повторите ввод');
      Form2.Edit1.Text := '';
      Form2.Edit2.Text := '';
 
    end;
  end
  else
 
    ShowMessage('Пустые поля логинпароль не допускаются');
 
end;
 
end.

Я понял что форма закрывалась потому что главная форма у меня была form2. При закрытии главной и другая форма закрывалась.



0



пофигист широкого профиля

4662 / 3096 / 855

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

Сообщений: 17,857

01.03.2016, 15:38

4

Лучший ответ Сообщение было отмечено daviddraiman как решение

Решение

35-38 строчки убери отсюда в более подходящее место.



1



0 / 0 / 0

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

Сообщений: 33

01.03.2016, 15:44

 [ТС]

5

Спасибо) всё заработало



0



5095 / 4106 / 1029

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

Сообщений: 26,054

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

01.03.2016, 15:45

6

ошибка «Операция не допускается, если объект открыт» осталась?



0



0 / 0 / 0

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

Сообщений: 33

01.03.2016, 15:49

 [ТС]

7

Нет. после того как указанные строчки поместил в FormCreate



0



5095 / 4106 / 1029

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

Сообщений: 26,054

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

01.03.2016, 15:55

8

вы Query не закрываете и при этом пытаетесь поменять свойства Connection

после того как обработали Query нужно делать Query.Close;



0



пофигист широкого профиля

4662 / 3096 / 855

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

Сообщений: 17,857

01.03.2016, 16:15

9

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

после того как обработали Query нужно делать Query.Close;

Как раз это делать не обязательно (с)
А вот многократно устанавливать свойство Connection совсем ни к чему.



0



5095 / 4106 / 1029

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

Сообщений: 26,054

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

01.03.2016, 16:25

10

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

Как раз это делать не обязательно (с)

в этом случае же обязательно

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

А вот многократно устанавливать свойство Connection совсем ни к чему.

почему?



0



пофигист широкого профиля

4662 / 3096 / 855

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

Сообщений: 17,857

01.03.2016, 16:59

11

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

в этом случае же обязательно

Только из-за того что была попытка повторно установить свойство ConnectionString.

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

почему?

Потому что незачем. Ничего же не изменилось.



0



5095 / 4106 / 1029

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

Сообщений: 26,054

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

01.03.2016, 17:04

12

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

Потому что незачем. Ничего же не изменилось.

а я подумал про какой-то секретный смысл
ну конечно подключение к бд лучше вынести из нажатия кнопки



0



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

Как-то не понятно почему, до этого использовал временные таблицы не было такого …

    
    // само левое соединение

    |    — Отобрать Outcome

    |    LEFT JOIN #MasterTransactionIdForOutcome        AS TraOt ON TraOt.MasterTransactionId    = Operations.MasterTransactionId

    |    — СОСТАВИТЬ СПИСОК MasterTransactionId С Outcome

    |    IF OBJECT_ID(‘tempdb..MasterTransactionIdForOutcome’) IS NOT NULL DROP TABLE #MasterTransactionIdForOutcome

    |    SELECT DISTINCT TraT.MasterTransactionId

    |    INTO     #MasterTransactionIdForOutcome

    |    FROM ski2db2017.dbo.MasterTransaction         AS Operations

    |        LEFT JOIN ski2db2017.dbo.TransactionDetail AS Tra ON Tra.MasterTransactionId = Operations.MasterTransactionId

    |                AND Tra.SuperAccountIdFrom = 2 AND Tra.SuperAccountIdTo IS NULL

    |            LEFT JOIN ski2db2017.dbo.TransactionDetail AS TraT ON TraT.MasterTransactionId = Tra.MasterTransactionId

    |                    AND TraT.SuperAccountIdFrom <> 2 AND TraT.SuperAccountIdFrom IS NOT NULL

    |                    AND TraT.SuperAccountIdTo = 2

    |    WHERE TraT.MasterTransactionId IS NOT NULL  —Operations.TransTime BETWEEN ‘20170202’ AND ‘20170203’

RecordSet = Новый COMОбъект(«ADODB.RecordSet»);

    RecordSet.Open(ТекстЗапроса, Connection);

    
    //перейдём в начало списка

    Если Не RecordSet.EOF Тогда

        RecordSet.MoveFirst();

    КонецЕсли;

    
    
    Попытка

        // для каждой полученной записи        

        Пока Не RecordSet.EOF Цикл     // ТУТ ОШИБКА ВЫЛЕТАТ ОБ Операция не допускается, если объект закрыт.

            ОбработкаПрерыванияПользователя();

            НоваяСтрока = ТаблицаРезультат.Добавить();

            
            // заполняем строку        

            Для каждого Колонка из ЭлементыФормы.ТаблицаРезультат.Колонки Цикл

                ОбработкаПрерыванияПользователя();

                ИмяКолонки = Колонка.Имя;

                Если ИмяКолонки = «НомерСтроки» ИЛИ ИмяКолонки = «ДатаБезВремени» Тогда

                     Продолжить;

                КонецЕсли;        

                
                Значение = RecordSet.Fields.Item(ИмяКолонки).Value;

                Если значение <> Null Тогда

                    НоваяСтрока[ИмяКолонки] = СокрЛП(Значение);

                    Если Найти(ИмяКолонки, «Id») Тогда

                        НоваяСтрока[ИмяКолонки] = СтрЗаменить(НоваяСтрока[ИмяКолонки], » «, «»);

                    КонецЕсли;                                    

                КонецЕсли;            

            КонецЦикла;        

            // переходим к сл. строке        

            RecordSet.MoveNext();        

        КонецЦикла;

    Исключение

        //Предупреждение(«База Скибарс занята. Повторите попытку подключения позже.»);

        Сообщить(ОписаниеОшибки());

    КонецПопытки;

    ЭтаФорма.Заголовок = «Количество строк: » + ТаблицаРезультат.Количество()

        + «, времени затрачено: » + (ТекущаяДата() — ДатаНачалаДляВремени) + » секунд»;

Номер телефона пуст

Чаще всего эта ситуация встречается, при работе с файлом Excel. В вопросах и ответах есть объяснения причин этого:

  • Почему некоторые номера телефонов в программе пустые, хотя в документе Excel они заполнены?
  • Почему программа звонит по отсутствующим номерам в пустых ячейках Excel?

Ещё одной причиной может быть неправильно выбранное поле базы данных (столбец) с номером телефона на странице выбора полей с данными.

Невозможно записать сделанные изменения, поскольку введенное значение противоречит параметрам, заданным для этой таблицы или списка

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

Возникла ошибка в записи результатов звонка

Запрос для записи в базу данных результатов работы не может быть выполнен. Возможно, вы выбрали другой источник данных на странице записи результатов или, если используется собственный SQL-запрос, сделали в нём ошибку. В первом случае достаточно указать правильные поля для записи, во втором обязательно проверьте, работает ли запрос при нажатии на кнопку «Проверить».

Операция не допускается, если объект закрыт

Источник данных, из которого необходимо получить или в который надо записать данные в настоящий момент недоступен. Проверьте возможность подключения к источнику данных. Возможно, он используется каким-то приложением, в том числе запущенной или некорректно закрытой копией Call Office. Во втором случае нужно завершить в диспетчере процессов все процессы mshta.exe.

Ошибка загрузки страницы. Разрешение отклонено

Проверьте, есть ли у вас доступ к базе данных. Если есть, то ваши операционные системы конфликтуют друг с другом, такое встречается, например, при попытке Windows XP получить доступ к базе данных в более старшей версии Windows. Установите ODBC-драйвер доступа к этой базе данных или перенесите базу данных на локальный компьютер, где установлен Call Office.

BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись

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

Ошибка получения данных для обзвона

После запуска сценария программа пытается получить данные с номерами телефонов, суммами задолженностей и так далее. Если данные не могут быть получены, возникает эта ошибка. Попробуйте заново указать источник данных и выбрать необходимые для работы сценария поля. Возможно, была изменена структура таблицы или базы данных, с которой вы работаете. Например, удалён лист из файла Excel, переименованы названия колонок и так далее.

Отсутствует значение для одного или нескольких требуемых параметров

Ошибка может возникать в связи с тем, что формат столбца в базе является числовым, а данные для записи имеют текстовый формат. Попробуйте изменить форматы столбцов для записи на текстовый или числовой. Столбец с датой должен иметь формат даты.

Объект не найден ядром базы данных

Ошибка может возникать из-за неправильного указания имени таблицы в выбранной базе данных. Проверьте корректность указанной таблицы.

Потеряна связь с Microsoft Excel для просмотра присоединенных листов

Такая ошибка чаще всего возникает, если вы открыли документ Excel, затем запустили Call Office использующий этот же документ и после этого закрыли документ Excel. В этом случае ODBC-драйвер для работы с документами Excel теряет связь с открытым документом и возникает эта ошибка.
Мы рекомендуем не открывать документ Excel перед работой Call Office.

В процессе записи результата возникла ошибка: недопустимое имя

Такая ошибка возникает при вызове SQL-запроса, когда имя таблицы указана не верно или указана с ошибкой. Проверьте корректность имени таблицы.

Недостаточно системных ресурсов, при выполнении SQL запроса

CallOffice является 32-х битным приложением, и имеет ограниченный размер динамически выделяемой памяти в 2 GB. Данная ошибка возникает при достигнутом ограничении. Чаще всего это происходит при обзвоне в несколько циклов, с большой базой номеров. В таком случае мы рекомендуем установить в настройках количество циклов 1, а запуск в несколько циклов осуществлять с помощью bat файла

This function inserts a row into a SQL database and needs to return the identity number created:

Function WriteDatabase(backupTypeID, numImages, folderSize, success, errorMessage, strLogFileName)

    On Error Resume Next
    err.clear
    Set objConnection = CreateObject("ADODB.Connection")
    Set objRecordSet = CreateObject("ADODB.Recordset")
    objConnection.Open "Provider=SQLOLEDB;Data Source=x.x.x.x;Initial Catalog=DB;User ID=sa;Password=xxxxxx"
    sqlquery = "INSERT INTO tblImageCopies (BackupCopyDate, BackupCopyTypeID, NumImages, ImagesFolderSize, Success, ErrorMessage) VALUES (GETDATE(), " & backupTypeID & ", " & numImages & ", " & folderSize & ", " & success & ", " & errorMessage & "); SELECT scope_identity() AS ImageCopyID;" 
    objRecordSet.Open sqlquery,objConnection
    objRecordSet.MoveFirst
    WriteDatabase = objRecordSet("ImageCopyID")
    objRecordSet.Close
    objConnection.Close
    If err.number <> 0 Then
        WriteLog "Error writing to the EHN database - " & err.number & " " & err.description, strLogFileName
    End If

End Function

It successfully inserts the row, but I get the error message ‘3704 Operation is not allowed when the object is closed.’ when it tries to return the identity number in the record set. When I execute this sql query directly on the server, it works. Anyone able to help?

Добрый день. Подскажите пожалуйста, следующая проблема:

Код
Sub dd()
'...........................................Задаём переменные
stdateone = Sheets("set").Range("b1") '.....Начало года
stdatetwo = Sheets("set").Range("b2") '.....Месяца месяца
findate = Sheets("set").Range("b3")   '.....Конец Месяца

Sql_Query = Sheets("set").Range("b5")

    '.......................................Запись
    Dim oConn_Sql As New ADODB.Connection
    Dim rs_1 As New ADODB.Recordset
    
    '.......................................Подключение
    oConn_Sql.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=SMART_DM;Data Source=smart-db"
    oConn_Sql.CommandTimeout = 0
    oConn_Sql.Open
    
    '.......................................Замена
    Sql_Query = Replace(Sql_Query, "$stdateone", stdateone)
    Sql_Query = Replace(Sql_Query, "$stdatetwo", stdatetwo)
    Sql_Query = Replace(Sql_Query, "$findate", findate)

        '...................................Задаём команду
        Set Cmd1 = New ADODB.Command
        Cmd1.ActiveConnection = oConn_Sql
        Cmd1.CommandText = Sql_Query
        Cmd1.CommandTimeout = 30
        
            '...............................Открываем
            Debug.Print Sql_Query
            rs_1.Open Cmd1

'...........................................Вставка
lastRow = Sheets("db").Cells(Rows.Count, 1).End(xlUp).Row
Sheets("db").Cells(lastRow + 1, 1).CopyFromRecordset rs_1  '  !!!!!!!!!!!!!!!!!!!!!!! ОШИБКА ВОТ ЗДЕСЬ

MsgBox "Выполнено!"

End Sub

После подключения выскакивает ошибка (строка 36), якобы   «операция не допускается если объект закрыт «
При этом в MySQL  таблица нормально открывается.

P.s. Похожие темы читал, решения не  нашёл.

Понравилась статья? Поделить с друзьями:
  • Ошибка операция не была успешно завершена торрент
  • Ошибка операция временно недоступна повторите попытку позднее росбанк
  • Ошибка операция в процессе исполнения pin up
  • Ошибка операционной системы синий экран
  • Ошибка операционной системы при включении компьютера