У меня есть простая хранимая процедура, которая возвращает type_id (int) в качестве параметра OUTPUT, используя type_name (varchar (100)) в качестве входного параметра. Когда я выполняю хранимую процедуру в SqlServer, она работает нормально и возвращает соответствующий type_id.
CREATE PROCEDURE [dbo].[intake_types_select_by_type_name]
@type_name varchar(100),
@type_id integer OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON
SELECT @type_id = type_id
FROM intake_types
WHERE type_name = @type_name
END
Однако, когда я вызываю хранимую процедуру из функции в VisualStudio, параметр @type_id возвращает Nothing.
Public Shared Function sp_intake_types_select_by_type_name(ByVal conn As DBConnection, ByVal caseName As String) As Integer
Dim sp As SqlCommand = conn.GetStoredProcedure("intake_types_select_by_type_name")
With sp.Parameters
.Add("@type_name", SqlDbType.VarChar, ParameterDirection.Input).Value = caseName
.Add("@type_id", SqlDbType.Int)
.Item("@type_id").Direction = ParameterDirection.Output
End With
sp.ExecuteScalar()
If Not IsDBNull(sp.Parameters("@type_id").Value) Then
Return sp.Parameters("@type_id").Value
Else
Return Nothing
End If
End Function
Я часами искал в Интернете решение, но ничего не нашел. У меня есть аналогичная хранимая процедура и функция в другом проекте, который использует ту же кодировку и логику, и он отлично работает (однако возвращает varchar в качестве параметра OUTPUT). Я сравнил эти два проекта, чтобы увидеть, не упускаю ли я чего-то простого, но не радости.
Dim result = sp.ExecuteScalar()
? - person Fabio   schedule 15.02.2017TypeID = (Int32) sp.ExecuteScalar()
. Вы уверены, что в другом своем проекте вы просто звонитеsp.ExecuteScalar()
? - person Aaron Bertrand   schedule 15.02.2017.Item("@type_id").Direction = ParameterDirection.Output
, измените.Add("@type_id", SqlDbType.Int)
на.Add("@type_id", SqlDbType.Int, ParameterDirection.Output)
и изменитеExecuteScalar
наExecuteNonQuery()
. Не знаю, решит ли это вашу проблему, но попробовать стоит. - person Zohar Peled   schedule 15.02.2017ExecuteScalar
возвращает что-то ЕСЛИ у вас естьSELECT
в вашей хранимой процедуре, которая выбирает (и, таким образом, возвращает) ровно одну строку, один столбец. С другой стороны, вы присваиваете это значение выходному параметру - это НЕ будет возвращеноExecuteScalar
! - person marc_s   schedule 15.02.2017Option Strict On
отключает это. Множество мемов meta: Option Strict On. - person Andrew Morton   schedule 15.02.2017