ADODB Operation is not allowed when the object is closed.

1. pavlo 21.08.20 14:52 Сейчас в теме
Уважаемые, кто нибудь сталкивался и знает как победить? :(
С студии скуля само собой все работает.

    Соединение = Новый COMОбъект("ADODB.Connection");
    Соединение.ConnectionString = СтрокаСоединения;
    Соединение.Open();
    
    Команда = Новый COMОбъект("ADODB.Command");
    Команда.ActiveConnection = Соединение;
    Команда.CommandText = ТекстЗапроса;

    Выборка = Новый COMОбъект("ADODB.RecordSet");
    Выборка = Команда.Execute();

    Если Выборка.EOF() Тогда //тут падает Operation is not allowed when the object is closed.
Показать


Сам запрос вот такой:

ТекстЗапроса = "
    |SET NOCOUNT ON
    |-- Список проблемных заданий
    |USE MSDB
    |;WITH CTE_MostRecentJobRun AS
    |(
    |-- For each job get the most recent run (this will be the one where Rnk=1)
    |SELECT job_id,run_status,run_date,run_time
    |,RANK() OVER (PARTITION BY job_id ORDER BY run_date DESC,run_time DESC) AS Rnk
    |FROM sysjobhistory
    |WHERE step_id=0
    |)
    |SELECT
    |name  AS [JobName],
    |CONVERT(VARCHAR,DATEADD(S,(run_time/10000)*60*60 /* hours */
    |    +((run_time - (run_time/10000) * 10000)/100) * 60 /* mins */
    |    + (run_time - (run_time/100) * 100)  /* secs */,
    |    CONVERT(DATETIME,RTRIM(run_date),113)),100) AS [TimeRun],
    |CASE WHEN enabled=1 THEN 'Enabled'
    |    ELSE 'Disabled'
    |    END AS [JobStatus]
    |FROM CTE_MostRecentJobRun MRJR
    |    JOIN sysjobs SJ ON MRJR.job_id=sj.job_id
    |WHERE Rnk = 1
    |    AND run_status = 0 -- i.e. failed
    |ORDER BY name
    |";
Показать


Такой запрос тоже падает:

	ТекстЗапроса = "
	|SET NOCOUNT ON
	|USE MSDB
	|SELECT name AS [JobName]
	|,CONVERT(VARCHAR,DATEADD(S,(run_time/10000)*60*60 /* hours */
	|	+((run_time - (run_time/10000) * 10000)/100) * 60 /* mins */
	|	+ (run_time - (run_time/100) * 100)  /* secs */
	|	,CONVERT(DATETIME,RTRIM(run_date),113)),100) AS [TimeRun]
	|	,CASE WHEN enabled=1 THEN 'Enabled'
	|	ELSE 'Disabled'
	|END [JobStatus]
	|,CASE WHEN SJH.run_status=0 THEN 'Failed'
	|	WHEN SJH.run_status=1 THEN 'Succeeded'
	|	WHEN SJH.run_status=2 THEN 'Retry'
	|	WHEN SJH.run_status=3 THEN 'Cancelled'
	|	ELSE 'Unknown'
	|END [JobOutcome]
	|
	|FROM   sysjobhistory SJH
	|JOIN   sysjobs SJ ON SJH.job_id=sj.job_id
	|WHERE  step_id=0 
	|	AND run_date Between CONVERT(varchar, GETDATE(), 112)-7 and CONVERT(varchar, GETDATE(), 112)
	|ORDER BY name,run_date,run_time
	|";

Показать
Найденные решения
4. pavlo 21.08.20 20:08 Сейчас в теме
(2) но всё же не статья, а больше вы натолкнули на мысль еще раз глянуть в запрос. :)
Похоже пакетные запросы сильно не парят ADODB, но вот USE MSDB парит убрал его и переписал типа msdb.dbo.sysjobs и стало работать :)
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user958326 21.08.20 15:57 Сейчас в теме
3. pavlo 21.08.20 19:35 Сейчас в теме
(2) Я читал, а чем поможет?
Второй запрос у меня не имеет никаких пакетных запросов по сути, но так же не работает
Зато вот такой где по факту 3 пакета, прекрасно работает :( И не понятно что не так в тех.

	ТекстЗапроса = "
	|SET NOCOUNT ON
	|
	|IF OBJECT_ID('tempdb.dbo.#RunningJobs') IS NOT NULL
	|DR OP   TABLE #RunningJobs
	|
	|CRE ATE   TABLE #RunningJobs (
	|	Job_ID UNIQUEIDENTIFIER,
	|	Last_Run_Date INT,
	|	Last_Run_Time INT,
	|	Next_Run_Date INT,
	|	Next_Run_Time INT,
	|	Next_Run_Schedule_ID INT,
	|	Requested_To_Run INT,
	|	Request_Source INT,
	|	Request_Source_ID VARCHAR(100),
	|	Running INT,
	|	Current_Step INT,
	|	Current_Retry_Attempt INT,
	|	State INT )
	|INS ERT IN TO #RunningJobs EXEC master.dbo.xp_sqlagent_enum_jobs 1,garbage
	|
	|SELECT
	|	name AS [JobName]
	|	,CASE WHEN next_run_date=0 THEN '[Not scheduled]' ELSE
	|	CONVERT(VARCHAR,DATEADD(S,(next_run_time/10000)*60*60 /* hours */
	|	+((next_run_time - (next_run_time/10000) * 10000)/100) * 60 /* mins */
	|	+ (next_run_time - (next_run_time/100) * 100)  /* secs */,
	|	CONVERT(DATETIME,RTRIM(next_run_date),112)),100) END AS [StartTime]
	|FROM #RunningJobs JSR
	|	JOIN msdb.dbo.sysjobs ON JSR.Job_ID=sysjobs.job_id
	|WHERE Running=1 -- i.e. still running
	|ORDER BY name,next_run_date,next_run_time
	|";

Показать


пробелы в командах это форум корявит
4. pavlo 21.08.20 20:08 Сейчас в теме
(2) но всё же не статья, а больше вы натолкнули на мысль еще раз глянуть в запрос. :)
Похоже пакетные запросы сильно не парят ADODB, но вот USE MSDB парит убрал его и переписал типа msdb.dbo.sysjobs и стало работать :)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот