Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Данные из хранимой процедуры / 10 сообщений из 10, страница 1 из 1
11.10.2007, 09:37
    #34862043
avtolik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные из хранимой процедуры
Народ, если не сложно растолкуйте такой вопрос.

Я из Excel-а пытаюсь выполнить хранимую процедуру. Оная должна вернуть данные в виде таблицы.
Проблема в том, что при выплнении программы (при обращении к Recordset для получения данных) возникает ошибка: "Run-time error '3704': Операция не допускается, если объект закрыт"

Я использовал разные примеры, которые находил в учебниках, что очень небогато, из встроенного хелпа. Все одно вылетает эта ошибка. Может хранимая поцедура должна иметь определенную структуру? Сейчас она требует один входящи параметр - дату. И выдает таблицу из 3-х полей и 3 записей
На всякий случай привожу простой код запроса

Dim cn As New ADODB.Connection
cn.ConnectionString = "Provider=SQLOLEDB.1;Password=pass;" & _
"Persist Security Info=True;User ID=sa;" _
& "Initial Catalog=Basa1;Data Source=Name_SQLServer"
cn.Open


Dim cmd As New ADODB.Command
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "bsl_sp_EXCEL_ShipmentAndOrder"
Set cmd.ActiveConnection = cn
cmd.Parameters.Refresh
cmd.Parameters(1) = "10.10.2007"

Dim rs As New ADODB.Recordset

'Set rs = cmd.Execute() ' либо так пробовал
rs.Open cmd ' либо так

Worksheets("Лист1").Cells(3, 3) = rs.Fields(0) ' а здесь и возникает эта ошибка
...
Рейтинг: 0 / 0
11.10.2007, 09:44
    #34862065
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные из хранимой процедуры
Лучше приведи код хранимой процедуры.
...
Рейтинг: 0 / 0
11.10.2007, 10:25
    #34862197
avtolik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные из хранимой процедуры
Вообще вся процедура довольно объемная, но на этапе отладки я ее упростил максимально. Привожу этот простой код. При запуске, скажем, в Query Analyzer все прекрасно работает

ALTER PROCEDURE [dbo].[bsl_sp_EXCEL_ShipmentAndOrder]
@date_current DATETIME
AS
BEGIN

DECLARE @sum_order float, @sum_fact float
CREATE TABLE #Result
(
s_name varchar(20),
s_order float,
s_fact float,
s_cod int
)

insert into #Result
exec BSL_SP_EXCEL_ORDERSHIPMENT @date_current

select
s_name,
s_fact,
s_order
from #Result
order by cod

END
...
Рейтинг: 0 / 0
11.10.2007, 11:31
    #34862506
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные из хранимой процедуры
в начале процедуры выставьте SET NOCOUNT ON

PS: если этого не указывать, то в рекордсет попадает служебная информация о выполнении ХП


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
11.10.2007, 11:58
    #34862654
avtolik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные из хранимой процедуры
Попробовал. Не прокатывает.
...
Рейтинг: 0 / 0
11.10.2007, 19:23
    #34864315
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные из хранимой процедуры
После rs.Open cmd проверь ощибки которые вернул сервер. Может у тебя прав на запуск процедуры не хватает?
Код: plaintext
1.
2.
3.
rs.Open cmd
for each e in cn.Errors ' cn - это твой ADODB.Connection объект
   debug.print e.description
next
...
Рейтинг: 0 / 0
12.10.2007, 14:17
    #34865111
avtolik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные из хранимой процедуры
Нее, не выдает никакой ошибки.
В общем я заметил следующее. Есле в процедуре стоит просто селект из любой таблицы, то все работает. Как только я этот селект делаю во временную таблицу, и только потом беру результат из временной таблицы, то все стопорится.
Т.е. так вот работает:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
SET NOCOUNT ON
go

ALTER PROCEDURE [dbo].[s_proс1]
AS
BEGIN
select field1, field2,field3
from table1
END

А вот так уже не работает:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
SET NOCOUNT ON
go

ALTER PROCEDURE [dbo].[s_proc2]
AS
BEGIN
CREATE TABLE #Result
(
field1 varchar(20),
field2 float,
field3 float
)
INSERT INTO #Result
select field1, field2,field3
from table1

select * from #Result
END

Что не так?
...
Рейтинг: 0 / 0
12.10.2007, 16:33
    #34865764
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные из хранимой процедуры
HandKotв начале процедуры выставьте SET NOCOUNT ON
avtolik , перед процедурой это не тоже самое, что и в начале процедуры. SET NOCOUNT ON должно стоять после begin.
...
Рейтинг: 0 / 0
12.10.2007, 17:21
    #34865957
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные из хранимой процедуры
Код: plaintext
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.
ALTER PROCEDURE [dbo].[bsl_sp_EXCEL_ShipmentAndOrder]
@date_current DATETIME
AS
BEGIN

DECLARE @sum_order float, @sum_fact float
CREATE TABLE #Result
(
s_name varchar( 20 ),
s_order float,
s_fact float,
s_cod int
)
SET NOCOUNT ON

insert into #Result
exec BSL_SP_EXCEL_ORDERSHIPMENT @date_current


select 
s_name,
s_fact,
s_order
from #Result
order by cod

END
...
Рейтинг: 0 / 0
15.10.2007, 07:35
    #34867807
avtolik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные из хранимой процедуры
Я подозревал, что туплю.
Спасибо за науку. Все заработало.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Данные из хранимой процедуры / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]