代码之家  ›  专栏  ›  技术社区  ›  Skitzafreak

从VB.Net中的SQL存储过程中检索消息

  •  0
  • Skitzafreak  · 技术社区  · 7 年前

    我正在为我正在处理的应用程序创建一个登录表单。我已将应用程序设置为正确连接到数据库,并在数据库上运行存储过程和查询。

    Public Function ExecuteCMD(ByRef CMD As SqlCommand) As DataTable
        Dim DS As New DataSet()
        Try
            OpenDBConnection()
            CMD.Connection = DB_CONNECTION
            If CMD.CommandText.Contains(" ") Then
                CMD.CommandType = CommandType.Text
            Else
                CMD.CommandType = CommandType.StoredProcedure
            End If
            Dim adapter As New SqlDataAdapter(CMD)
            adapter.SelectCommand.CommandTimeout = 300
            adapter.Fill(DS)
        Catch ex As Exception
            Throw New Exception("Database Error: " & ex.Message)
        Finally
            CloseDBConnection()
        End Try
        Return DS.Tables(0)
    End Function
    
    Public Function ExecuteCMDWithReturnValue(ByRef CMD As SqlCommand) As Boolean
        Try
            OpenDBConnection()
            CMD.Connection = DB_CONNECTION
            CMD.Parameters.Add("@ret", SqlDbType.Int).Direction = ParameterDirection.ReturnValue
            CMD.CommandType = CommandType.StoredProcedure
            CMD.ExecuteNonQuery()
            Dim result As Object = CMD.Parameters("@ret").Value
            Return If(Convert.ToInt32(result) = 1, False, True)
        Catch ex As Exception
            Throw New Exception("Database Error: " & ex.Message)
            Return False
        Finally
            CloseDBConnection()
        End Try
    End Function
    

    这些函数确实可以很好地工作,但是它们对于错误处理来说非常糟糕。

    例如,我希望能够设置登录应用程序的存储过程,以返回“找不到用户名”或“密码不正确”的消息,这样我就可以向我的用户确切地显示问题所在,而不是仅仅返回一个通用的“登录信息不正确”的消息,从只返回真或假的登录通过或不通过。

    不幸的是,我不知道到底该怎么做。我不知道在SQL Server端设置什么来让它在过程中吐出消息,也不知道如何在VB.Net中接收这些消息。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Mary    7 年前

    您可以在VB中验证您的用户权限。我认为告诉用户密码或用户名是否有误(或者两者都有误)不是一个好主意。如果此数据受密码保护,则应防止恶意登录。这将有助于黑客知道什么是错的。

    Private Function VerifyPassword(pword As String, uname As String) As Boolean
        Using cn As New SqlConnection(My.Settings.UsersConnectionString)
        Dim cmd As New SqlCommand("Select Count(*) From Users Where UserName = @UserName And UserPassword = @Password;", cn)
        cmd.Parameters.Add("@UserName", SqlDbType.VarChar, 100).Value = uname
        cmd.Parameters.Add("@Password", SqlDbType.VarChar, 100).Value = pword
    
            Try
                cn.Open()
                Dim i As Integer = CInt(cmd.ExecuteScalar())
                If i > 0 Then Return True
                Return False
            Catch ex As Exception
                Throw
            Finally
                cn.Close()
                cmd.Dispose()
            End Try
        End Using
    End Function
    

    当然,密码是用盐散列存储的。