Страницы: 1
RSS
ADODB.Recordset- ошибка при доступе к таблице MS SQL, ошибка при длительном выполнении хранимой процедуры на MS SQL
 
Доброго первого дня  весны, уважаемые.
Прошу подсказать, как одолеть такую ошибку:
есть стандартный доступ к таблице MS SQL из Excel'я:
Код
Option Explicit
Public Conn As New ADODB.Connection
Public Cmd As ADODB.Command
Public RecSet As New ADODB.Recordset
...
Conn.ConnectionString = "PROVIDER=SQLOLEDB; SERVER=MKS; DATABASE=devel; TRUSTED_CONNECTION=NO; UID=user; PWD=password"
Conn.ConnectionTimeout = 3600
Conn.CommandTimeout = 3600
Conn.Open
Set Cmd = New ADODB.Command
Set Cmd.ActiveConnection = Conn
Cmd.CommandType = adCmdText
Cmd.CommandTimeout = 3600
Dim stroka As String
stroka = "MyProcedure"
Cmd.CommandText = stroka
Set RecSet = Cmd.Execute()
Range("A4").CopyFromRecordset RecSet
Set RecSet = Nothing
Set Cmd = Nothing
Set Conn = Nothing
, который нормально работает, если хранимая процедура "MyProcedure" возвращает набор строк быстро.
А стоит ей задуматься, то Excel (2010) радостно сообщает:
Error
ADODB.Recordset-->Операция не   допускается, если объект закрыт.
Тайм- ауты я всякие пробовал, не помогло..
 
Оптимизируйте процедуру  или получайте результат частями.
 
Тяжеловата процедура.. Хочется что- нить в объектах Connection,
Command и Recordset подкрутить.. Почему Recordset закрытым оказывается?
Изменено: naz - 01.03.2016 16:38:17
 
Цитата
naz написал: Почему Recordset закрытым оказывается?
Время отработки процедуры очень большое.
Похожую проблему я решил дробление результата на части.Общее время выполнения процедур у меня составило 4 минуты.
Раньше выполнялась минут 12.Записей 4 млн строк,вытягивалась сводная таблица
 
Похоже, дело не во времени выполнения процедуры, а в том, что в ней используется insert. Вот фрагмент процедуры:
Код
...
create table #StBudj
 (
     nrec  binary(8)     not null, 
     path  varchar(max)  not null, 
     name  varchar(max)  not null, 
     level int           not null, 
     scode varchar(max)  not null,
 );
insert into #StBudj(nrec, path, name, level, scode) select 0x11, 'path', 'name', 11;  -- На эту строку ошибка выдаётся
select * from #stbudj;
Если insert не использовать, ошибки нет.. Выполняется быстро.
Изменено: naz - 01.03.2016 16:23:37
 
Ошибки исправляете?
Небось такая ошибка
Список выбора для инструкции INSERT содержит меньшее число элементов,
чем список вставки. Число значений SELECT должно соответствовать числу столбцов INSERT.
 
Цитата
Doober написал:
Список выбора для инструкции INSERT содержит меньшее число элементов,
чем список вставки. Число значений SELECT должно соответствовать числу столбцов INSERT.
Нет, такой уже нет ошибки. Пробую разные варианты, может хранимку в функцию переделаю..
 
Вообщем так решил проблему. Может, кому пригодится.
Поскольку хранимая процедура скоропостижно закрывалась, не успев вернуть записи, заставил её записывать результат в специально сделанную таблицу (шлюз). Это делается первым вызовом recordset. А вторым вызовом вычёрпываем записи из "шлюза" в замечательный Excel.
Код
stroka = "MyProcedure"
Cmd.CommandText = stroka
Set RecSet = Cmd.Execute()

stroka = "select * from Table order by scode;"
Cmd.CommandText = stroka
Set RecSet = Cmd.Execute()
If RecSet.State <> adStateClosed Then
    Range("A3").CopyFromRecordset RecSet
    Else: MsgBox "RecSet закрыт. Это плохо.." & vbCrLf
End If

Страницы: 1
Читают тему
Наверх