Member 12750150 Ответов: 3

Как получить возвращаемое значение из хранимой процедуры с VB в качестве вызывающего кода


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

То, что постоянно возвращается в мою переменную, - это -1. Это происходит независимо от того, установлен ли NOCOUNT в положение ON или OFF.

Что я уже пробовал:

Хранимая процедура SQL Server:

Используйте [BEClientData]
ГО
/ * * * * * * Объект: StoredProcedure [dbo].[sprocAuthorizeLogin] Дата сценария: 20.09.2016 9: 35: 48 ******/
УСТАНОВИТЕ ANSI_NULLS ON
ГО
УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ГО
-- =============================================
-- Автор: Стэн Биббс
-- Дата создания: 18 сентября 2016 года
-- Описание: Проверьте отправку логина
-- =============================================
Изменить процедуру [dbo].[sprocAuthorizeLogin]
-- Добавьте параметры для хранимой процедуры здесь
@Username nvarchar(20) = 0,
@Password nvarchar(20) = 0

АС

НАЧАТЬ
-- Установить параметр nocount на добавленную предотвратить дополнительные результирующие наборы
-- вмешательство в операторы SELECT.
УСТАНОВИТЕ NOCOUNT ON;


-- Вставьте инструкции для процедуры здесь
Если существует(выберите имя пользователя, пароль
От ДБО.Подписываемый
Где Username = @Username и Password = @Password)

Возвращение 2

ЕЩЁ

Возврат 1

КОНЕЦ

Функция VB, вызывающая процедуру:

ValidateLogin государственной функции(strUsername бывал, как струна, strPassword бывал как строка) как целое число

Dim intExists как целое число

Дим CN, как новое sqlconnection(мой.Параметры.BEClientDataConnectionString)

Dim procName As String = " sprocAuthorizeLogin"
Dim cmd как новая SqlCommand(procName, cn)
С помощью cmd
.Свойство Commandtype = Значение Commandtype.Хранимая процедура
. CommandText = procName
.Parameters. Add ("@Username", SqlDbType.NVarChar, 20). Value = strUsername
.Parameters. Add ("@Password", SqlDbType.NVarChar, 20). Value = strPassword
Конец С

спицы.Открыть()

intExists = cmd.Метод executenonquery()

Вернуться intExists

3 Ответов

Рейтинг:
27

Karthik_Mahalingam

попробовать это

ALTER PROCEDURE [dbo].[sprocAuthorizeLogin] 
@Username nvarchar(20) = 0, 
@Password nvarchar(20) = 0
AS
BEGIN
IF EXISTS(SELECT Username, Password FROM dbo.SignInTable WHERE Username = @Username AND Password = @Password)
select 2 
ELSE 
select 1
END


intExists =  Convert.ToInt32(cmd.ExecuteScalar())

относиться Метод Executenonquery, Executescalar Так Против[^]


Member 12750150

Решение 3 сработало как заклинание. Простая настройка синтаксиса в моей хранимой процедуре решила эту проблему. Я пробовал ExecuteScalar с моим предыдущим синтаксисом, и он тоже не работал. Не проверял, но решение 2 выглядит как вариация на ту же тему, что и решение 3. Спасибо, Картик.

Karthik_Mahalingam

добро пожаловать :)

Рейтинг:
2

OriginalGriff

Насколько я знаю, нет прямого способа получить возвращаемое значение SP вне SSMS - ExecuteNonQuery этого не сделает - он возвращает количество затронутых строк, а не возвращаемое значение. И ExecuteScalar тоже не будет, если только результат не будет выбран.
Если вы можете изменить свой SP, чтобы выбрать значение вместо / , а также вернуть его, то все в порядке. Если нет их вам нужно создать второй SP чтобы сделать именно это:

CREATE PROCEDURE spGetTheRETURNValue
AS
BEGIN
   RETURN 666
END
CREATE PROCEDURE spGetTheActualValue
AS
BEGIN
   DECLARE @ret INT
   EXEC @ret = spGetTheReturnValue
   SELECT @ret
END
Затем вы можете вызвать новую процедуру с помощью ExecuteScalar и получить значение таким образом.


Рейтинг:
0

PeejayAdams

Вы используете ExecuteNonQuery для запроса. ExecuteNonQuery предназначен для вставки/удаления / обновления, поэтому возвращаемое значение - это количество затронутых строк.