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

Retrieve Messages from SQL Stored Procedure in VB.Net

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

但是我不确定如何将消息从数据库发送到我的 VB.Net 应用程序。现在我基本上有两种方法可以为我的数据库执行代码:

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

这些函数确实可以正常工作,但对于错误处理来说却很糟糕。

例如,我希望能够设置我的存储过程以登录到 return "Username not found" 或 "Password incorrect" 消息的应用程序,以便我可以显示对我的用户来说,到底是什么问题,而不是仅 returning 一个通用的 "Login information incorrect" 消息,仅 returning true 或 false 在登录过程中是否通过。

不幸的是,我不知道如何在两端执行此操作。我不知道在 SQL 服务器端设置什么让它在程序中吐出消息,我不知道在 VB.Net.

中接收这些消息很热

您可以在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

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