我需要使用 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()
.要获得答案,您必须使用
SqlCommand.ExecuteScalar() 方法
然后它会留下来
注意:“类型”变量应该在 using 之外定义
没关系,只需要改变一件事
我想为这个有趣的问题提供的非常好的答案提供另一种选择。
如果我们想使用
ExecuteNonQuery()
,我们可以使用参数out
,以便SQL Server/Express在该参数中返回一个结果给我们。然后我们应该在存储过程中再包含一个参数,但指定它是一个输出参数(
out
):在
SELECT
其中,我们必须将查询结果分配给输出参数:@id_tipo_usuario = ID_TIPO_USUARIO
所以VB.NET中的代码可能是:
如您所见,我将
Try
englobing放在Using
,因为在我看来,相反的方式是错误的。你可以把你的 sp el
SET NOCOUNT OFF
,所以executeNoQuery()
它返回受影响的行数