Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1

Передача в Recordset результата работы Хранимой процедуры (SQL Server 2012)

08.02.2016, 12:53. Показов 3544. Ответов 9
Метки нет (Все метки)

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

Не получается вернуть в Recordset результат из Хранимой процедуры, которая была создана на SQL Server 2012.

Подскажите, пожалуйста, как правильно сделать?

Вот код ХП:

T-SQL
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
CREATE PROCEDURE PROC_SELECT_VBOBJKT_v2
@TRANZK NVARCHAR (30), -- Транзакция
@ADRS NVARCHAR (100), -- Адреc запуска, то есть из какой формы запускается транзакция
@SYSUSER NVARCHAR (50), -- Пользователь создавший объект
@SYSUSERID NVARCHAR (30) -- ID запуска операции под пользователем
AS
begin
--SET NOCOUNT ON
        --Удаляем старый лог
            DELETE FROM dbo.BAPIRET WHERE SYSUSER = @SYSUSER AND SYSUSERID = @SYSUSERID
            --Проверяем наличие транзакции
            IF EXISTS(SELECT OBJKT FROM dbo.VBOBJKT WHERE TRANZK = @TRANZK AND ADRS = @ADRS)
                --Транзакция найдена. В таблицу логов пишем тип сообщения I, то есть I значит успешно
                BEGIN
                    INSERT INTO dbo.BAPIRET(BAPI_MTYPE, SYSUSER, SYSUSERID)
                    VALUES ('I', @SYSUSER, @SYSUSERID)
                    SELECT * FROM dbo.BAPIRET WHERE SYSUSER = @SYSUSER AND SYSUSERID = @SYSUSERID
                    RETURN
                END
            
            ELSE --Транзакция не найдена
                BEGIN
                    --В таблицу логов записываем сообщение с типом E, то есть Error
                    EXEC PROC_BAPIRET_GET 'S#', '343', @TRANZK, @SYSUSER, @SYSUSERID
                    SELECT * FROM dbo.BAPIRET WHERE SYSUSER = @SYSUSER AND SYSUSERID = @SYSUSERID
                    
                END
                    RETURN  
--SET NOCOUNT OFF;
end
На стороне VB такой код:


Visual Basic
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
Function AddSCAddObject(lv_frm, lv_objct) As Variant    'Открытие форм
 
cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "PROC_SELECT_VBOBJKT_v2"
cmd.Parameters.Append cmd.CreateParameter("@TRANZK", adVarWChar, adParamInput, 30, lv_objct)
cmd.Parameters.Append cmd.CreateParameter("@ADRS", adVarWChar, adParamInput, 100, lv_frm)
cmd.Parameters.Append cmd.CreateParameter("@SYSUSER", adVarWChar, adParamInput, 30, frmMDI.lblUser.Caption)
cmd.Parameters.Append cmd.CreateParameter("@SYSUSERID", adVarWChar, adParamInput, 100, frmMDI.lblIDUser.Caption)
'cmd.Prepared = True
 
   Set rsOpenForm = Nothing
   rsOpenForm.ActiveConnection = conn
   rsOpenForm.CursorType = adOpenKeyset
   rsOpenForm.CursorLocation = adUseServer
   Set rsOpenForm = cmd.Execute()
 
 
   If Not rsOpenForm.EOF And Not rsOpenForm.BOF Then ' запись возвращена. Для возврата ХП RecordCount использовать нельзя.
        MsgBox rsOpenForm.Fields("BAPI_MTYPE").Value
   Else
         MsgBox "Ничего не найдено"
   End If
 
End Function

Функцию вызываю посредством нажатия на кнопку и передаю параметры (Public rsOpenForm As New ADODB.Recordset объявлен в Модуле):

Visual Basic
1
2
3
Private Sub Command1_Click()
    Call AddSCAddObject("frmMDI", "OX02")
End Sub
При нажатии на кнопку, VB выдает сообщение, которая показана на скрине Err1.

Далее нажав на кнопку Debug, переходим в отладчик и видим где возникает ошибка (см.скрин Err_code).

Навел стрелку на строку

Visual Basic
1
If Not rsOpenForm.EOF And Not rsOpenForm.BOF Then
и VB выдала сообщение, что: rsOpenForm.EOF = <Операция не допускается, если объект закрыт>.

В результате ожидаю получить в Recordset выборку из таблицы BAPIRET (может быть одна или более записей), но не получается. На этом форуме находил примеры передачи из ХП в Recordset, сделал как написано, но ошибка выходит, якобы объект закрыт.

Так же пробовал и через rsOpenForm.Open, но без успешно.

Прошу помощи, как правильно передать результат работы ХП в Recordset (или чего у меня не хватает), чтобы корректно всё работало.
Миниатюры
Передача в Recordset результата работы Хранимой процедуры (SQL Server 2012)   Передача в Recordset результата работы Хранимой процедуры (SQL Server 2012)  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.02.2016, 12:53
Ответы с готовыми решениями:

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

Получение параметров Хранимой процедуры с SQL Server
Создал следующую ХП: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE proverich(@id_zal_dob int) AS

Создание столбца ADOTable на основе хранимой процедуры SQL Server
Здравствуйте! Вопрос такой: в базе данных в формате mdb имеется таблица P поставщиков со столбцами ID, NAME, CITY, STATUS. Имеется...

9
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
18.02.2016, 16:34
Цитата Сообщение от RCF Посмотреть сообщение
Set rsOpenForm = cmd.Execute()
- проверяй значения, походу пустой твой рекордсет.
0
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1
18.02.2016, 21:39  [ТС]
Цитата Сообщение от CRIDEL Посмотреть сообщение
походу пустой твой рекордсет.
В SQL Server'е обработка работает. Просто возврат в VB не идет.

Как имеешь ввиду проверить?
0
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
19.02.2016, 00:55
да хоть так: msgbox rsOpenForm.recordcount
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
19.02.2016, 02:23
RCF, уберите комменты с SET NOCOUNT ON
0
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1
22.02.2016, 21:31  [ТС]
Цитата Сообщение от mobile Посмотреть сообщение
уберите комменты с SET NOCOUNT ON
Хотите сказать, что если убрать комментарии, то всё заработает? )
0
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1
26.02.2016, 15:33  [ТС]
Цитата Сообщение от mobile Посмотреть сообщение
уберите комменты с SET NOCOUNT ON
Бесполезно
0
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1
26.02.2016, 16:04  [ТС]
Цитата Сообщение от mobile Посмотреть сообщение
уберите комменты с SET NOCOUNT ON
При первом запуске нормально отрабатывает. А если не выходя из VB нажимать кнопку еще раз, то возникает такая ошибка (см.скрин).

То есть, если два раза подряд нажимать кнопку возникает ошибка.


А если выходишь из режима выполнения в режим разработчика, а потом переходишь в режим выполнения и при первом нажатии на кнопку нормально работает, а при втором нажатии ошибка как на скрине.
Миниатюры
Передача в Recordset результата работы Хранимой процедуры (SQL Server 2012)  
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
26.02.2016, 18:35
Значит надо обновить твой рекордсет ищи в его классе чтото со словами Update Refresh
Или заново установи соединение
0
0 / 0 / 0
Регистрация: 16.05.2018
Сообщений: 105
24.05.2023, 16:35
RCF, приветствую ! Столкнулся с похожей проблемой, вам удалось решить тогда ? )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.05.2023, 16:35
Помогаю со студенческими работами здесь

Создание хранимой процедуры для записи изображения в БД MS SQL Server'a
Всем привет! В инете нашел вот такой пример у Photo тип varbinary(max) CREATE PROCEDURE . @FileName nvarchar(100) AS BEGIN ...

Вызов хранимой процедуры с параметров из SQL Server в VBA в ADP проект MS Access
Доброго времени суток. Такая проблемка, не знаю как исправить... Битый час туплю. Делаю поиск клиентов через процедуру с параметром,...

Как в Recordset взять результат работы SQL процедуры, если процедура содержит оператор SELECT???
Сохраненная процедура на SQL Server 6.5 содержит оператор SELECT, результаты которого нужно вернуть как Recordset в программу. Если просто...

Как заполнить recordset из хранимой процедуры?
Подскажите как заполнить recordset из хранимой процедуры. ... sSql='exec spGetFilds ' &amp; id rs.CursorLocation=adUseClient rs.Open...

Возврат результата Хранимой процедуры
Всем привет! Нужна помощь, никак не соображу, как правильно сделать. Вероятнее всего что-то не так делаю, прошу навести на путь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru