Я нуждаюсь в том, чтобы создать Login с типами пользователей обязательно с процедурами, хранившимися в SQL Server. Мне не удалось захватить id типа пользователя.
Типы пользователей:
1 = Administrador
2 = Secretaria
3 = Profesional
Хранившаяся процедура:
create procedure ident (@rut varchar(10), @contrasena varchar(30))
as
begin
select ID_TIPO_USUARIO from USUARIO
where RUT_USUARIO = @rut and CONTRASENA = @contrasena
end
И в VisualBasic у меня есть следующее
Dim rut, contrasena As String
rut = tbxRut.Text
contrasena = tbxContraseña.Text
Using cnn As SqlConnection = New SqlConnection("Initial Catalog=CONSULTORIO;" & _
"Data Source=DESKTOP-LGTPUJM\SQLEXPRESS;Integrated Security=SSPI;")
Try
cnn.Open()
cmd = New SqlCommand("ident", cnn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@rut", rut)
cmd.Parameters.AddWithValue("@contrasena", contrasena)
cmd.ExecuteNonQuery()
Catch ex As Exception
MsgBox("Error")
End Try
End Using
Хранившаяся процедура работает без ошибок, но не, как захватывание реестра консультации
Обрати внимание, что ты используешь ExecuteNonQuery
, то, что подразумевает, что ты выполняешь консультацию, которая не будет возвращать результат.
Легко ты можешь получать результат ее консультировавший, используя например ExecuteScalar()
, что будет возвращать тебя прямо ID_TIPO_USUARIO
.
Или если ты хочешь получить полный результат, ты был бы должен использовать ExecuteReader()
.
Чтобы получать ответ ты должен использовать
MГ©todo SqlCommand. ExecuteScalar ()
тогда остался бы Общеизвестными
cmd = New SqlCommand("ident", cnn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@rut", rut)
cmd.Parameters.AddWithValue("@contrasena", contrasena)
Dim tipo As Integer = Convert.ToInt32(cmd.ExecuteNonQuery())
: переменная "тип" ты был бы должен определять ее снаружи using
Мне хотелось бы приносить еще одну альтернативу в очень хорошие ответы, у которой был этот интересный вопрос.
Если мы хотим использовать ExecuteNonQuery()
, мы можем использовать параметры out
, для того, чтобы SQL Server/Express возвратил нам результат в вышеупомянутом параметре.
Тогда мы были бы должны включать еще один параметр в хранившуюся процедуру, но определяя, что говорится о параметре вывода (out
):
create procedure ident (@rut varchar(10), @contrasena varchar(30), @id_tipo_usuario int out)
as
begin
select @id_tipo_usuario = ID_TIPO_USUARIO from USUARIO
where RUT_USUARIO = @rut and CONTRASENA = @contrasena
end
В SELECT
мы должны распределять результат консультации в параметр вывода: @id_tipo_usuario = ID_TIPO_USUARIO
Тогда код в VB.NET мог бы быть:
Dim rut, contrasena As String
rut = tbxRut.Text
contrasena = tbxContraseña.Text
Try
Using cnn As New SqlConnection("Initial Catalog=CONSULTORIO;" & _
"Data Source=DESKTOP-LGTPUJM\SQLEXPRESS;" & _
"Integrated Security=SSPI;")
cnn.Open()
Using cmd As New SqlCommand("ident", cnn) With {.CommandType = CommandType.StoredProcedure}
cmd.Parameters.AddWithValue("@rut", rut)
cmd.Parameters.AddWithValue("@contrasena", contrasena)
' Agregamos el parámetro de salida para SQL Server/Express, usando la propiedad Direction.
cmd.Parameters.Add("@id_tipo_usuario", SqlDbType.Int).Direction = ParameterDirection.Output
' También se puede usar .AddWithValue(), pero quise ahorrar una variable.
cmd.ExecuteNonQuery()
' El resultado que devuelva el procedimiento almacenado en su parámetro de salida, se guardará en la colección Parameters.
MsgBox("id_tipo_usuario = " & cmd.Parameters("@id_tipo_usuario").Value.ToString)
' Aquí se nota que tal vez sería mejor el uso de una variable.
End Using
End Using
Catch ex As Exception
MsgBox(ex.ToString, MsgBoxStyle.Critical, "Error")
End Try
Поскольку возможно видеть, я поместил Try
включая в Using
, потому что мне кажется, что он наоборот неправильный.