Как сохранять данные о консультации в процедуре, хранившейся с VisualBasic. Net?

Я нуждаюсь в том, чтобы создать 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

Хранившаяся процедура работает без ошибок, но не, как захватывание реестра консультации

8
задан 14.04.2017, 08:12
4 ответа

Обрати внимание, что ты используешь ExecuteNonQuery, то, что подразумевает, что ты выполняешь консультацию, которая не будет возвращать результат.

Легко ты можешь получать результат ее консультировавший, используя например ExecuteScalar(), что будет возвращать тебя прямо ID_TIPO_USUARIO.

Или если ты хочешь получить полный результат, ты был бы должен использовать ExecuteReader().

4
ответ дан 24.11.2019, 13:23
  • 1
    Очень внимательная твой ответ habr и # 237; у которого спрашивать, что тип разрешений conexi и # 243; n он имеет. Quiz и # 225; s только смоги выполнять STORE_PROCEDURES поэтому он не реализует действительно SELECT. Если ты сосредотачиваешься на части, которую он говорит " обязательно с процедурами, хранившимися в SQL Server. и quot; – Agustin M. 14.09.2016, 20:38
  • 2
    ты вы говорите, что у него есть только разрешения выполнения и не чтения? редкий, если он может выполнять SP, смоги читать результат. Я теряюсь чего-то? – gbianchi♦ 14.09.2016, 20:44
  • 3
    Я верю в то, что est и # 225; s в верном, так как исследуя немного м и # 225; s он возможно, что SP возвращает ему результат. Не sab и # 237; в, когда бы то ни было hab и # 237; в попробованный. – Agustin M. 14.09.2016, 20:52

Чтобы получать ответ ты должен использовать

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

2
ответ дан 24.11.2019, 13:23

Мне хотелось бы приносить еще одну альтернативу в очень хорошие ответы, у которой был этот интересный вопрос.

Если мы хотим использовать 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, потому что мне кажется, что он наоборот неправильный.

0
ответ дан 24.11.2019, 13:23

puededes помещать твой sp SET NOCOUNT OFF, так executeNoQuery() возвращает тебе количество поврежденных rows

-1
ответ дан 24.11.2019, 13:23

Теги

Похожие вопросы