caffrey_1 Ответов: 3

Проблема возврата значения из хранимой процедуры


У меня есть проблема с получением возвращаемого значения из хранимой процедуры, она просто возвращает dbnull, я проверил SP, и это работает нормально

хранимая процедура :-

alter PROCEDURE UPDATE_SiteVisitors2
	
@VPCode nvarchar(10),


AS

BEGIN

declare @Exists INT 

SET NOCOUNT ON;

IF EXISTS (select vpcode FROM SiteVisitors WHERE vpcode=@vpcode)

BEGIN

update sitevisitors

set

VSignOut = getdate()

where VPCode=@VPCode

		SET @Exists = 1

END

ELSE

BEGIN

		SET @Exists = 0
END

RETURN @Exists

END


ГЛ. :-


<pre>    Public Function updateVisitors(ByVal VPCode As String)

        Dim conn As New System.Data.SqlClient.SqlConnection(access.SQLstrconn)
        Dim sql As String = "UPDATE_SiteVisitors2 '" & VPCode & "'"
        Dim Cmd As New System.Data.SqlClient.SqlCommand(sql, conn)
        Dim Par As New System.Data.SqlClient.SqlParameter
        Cmd.Parameters.Add("@Exists", SqlDbType.Int)
        Cmd.Parameters("@Exists").Direction = ParameterDirection.Output

        conn.Open()
        Cmd.ExecuteNonQuery()

        SignIn.exists = Cmd.Parameters("@Exists").Value

        conn.Close()

'signin.exists is a public variable int

        MsgBox(SignIn.exists)

        Return SignIn.exists

    End Function


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

Попробовал несколько вещей, но просто получил DBNULL

CHill60

Действительно ли VSignOut обновляется?

caffrey_1

Да, это так, обновление работает нормально, просто @Exists просто возвращается как DBNULL

[no name]

cmd. CommandType = CommandType.Хранимая процедура

caffrey_1

Вызывает исключение не удалось найти хранимую процедуру ?

[no name]

Это происходит потому, что имя вашего SP-UPDATE_SiteVisitors2, а не UPDATE_SiteVisitors2 + someVPCode.

caffrey_1

Да, это действительно помогло, спасибо

3 Ответов

Рейтинг:
9

caffrey_1

Успешно справился. было благодаря

Cmd.CommandType = CommandType.StoredProcedure
указатель

Спасибо за помощь и указатели очень ценю

Новый кодекс

Public Function updateVisitors(ByVal VPCode As String)



       Dim conn As New System.Data.SqlClient.SqlConnection(access.SQLstrconn)


       'Dim sql As String = "UPDATE_SiteVisitors2 '" & VPCode & "'"
       Dim sql As String = "UPDATE_SiteVisitors2"
       Dim Cmd As New System.Data.SqlClient.SqlCommand(sql, conn)
       Cmd.CommandType = CommandType.StoredProcedure
       Cmd.Parameters.Add("@VPCode", SqlDbType.VarChar, 10, ParameterDirection.Input).Value = VPCode
       Cmd.Parameters.Add("@Exists", SqlDbType.Int)
       Cmd.Parameters("@Exists").Direction = ParameterDirection.Output
       conn.Open()

       Cmd.ExecuteNonQuery()

       SignIn.exists = Cmd.Parameters("@Exists").Value

       conn.Close()


       MsgBox(SignIn.exists)

       Return SignIn.exists

   End Function


SQL немного изменился
alter PROCEDURE UPDATE_SiteVisitors2
	
@VPCode nvarchar(10),
@Exists INT OUTPUT

AS

BEGIN

SET NOCOUNT ON;

--declare @Exists INT 

IF EXISTS (select vpcode FROM SiteVisitors WHERE vpcode=@vpcode)


BEGIN

update sitevisitors

set

VSignOut = getdate()

where VPCode=@VPCode


		set @Exists = 1
END
ELSE
BEGIN
		set @Exists = 0
END

RETURN @Exists
END


Рейтинг:
1

CHill60

@Exists - это не выходной параметр, а возвращаемое значение
Попробовать следующее:

Dim sql As String = "UPDATE_SiteVisitors2"
        Dim Cmd As New System.Data.SqlClient.SqlCommand(sql, conn)
        Cmd.Parameters.Add("@Exists", SqlDbType.Int)
        Cmd.Parameters("@Exists").Direction = ParameterDirection.ReturnValue
        Dim par As SqlParameter = Cmd.Parameters.Add("@VP", SqlDbType.NVarChar)
        par.Direction = ParameterDirection.Input
        par.Value = VPCode
...


Рейтинг:
1

ZurdoDev

Вам нужно объявить свою переменную в SQL в качестве вывода. Хороший пример здесь, Возврат данных с помощью выходных параметров[^].

Я предпочитаю не использовать выходные параметры. Вместо того чтобы вернуться в SQL вобще выберите @существует, как не существует

Затем в C#

String returnValue;
Object temp = cmd.ExecuteScalar();
if (temp!= null){
  returnValue = temp.ToString();
}


В любом случае, вы идете хорошо, пока вы делаете это правильно. ;)


caffrey_1

Я рассматривал возможность сделать это альтернативным способом и заполнить набор данных, если в нем нет строк и т. д. Просто пытаюсь сделать это более аккуратным способом!

ZurdoDev

Поскольку вы возвращаете только одно значение, я понимаю, что ExecuteScalar() более эффективен, чем выходной параметр.