【问题标题】:Retrieve Messages from SQL Stored Procedure in VB.Net从 VB.Net 中的 SQL 存储过程中检索消息
【发布时间】:2018-09-19 15:23:14
【问题描述】:

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

但是我不确定如何将消息从数据库发送到我的 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

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

例如,我希望能够设置我的存储过程以登录到应用程序以返回“找不到用户名”或“密码不正确”消息,以便我可以向我的用户准确显示问题所在是,而不是仅仅返回一个通用的“登录信息不正确”消息,而不是在登录是否通过时只返回 true 或 false。

不幸的是,我不知道具体如何在任一端执行此操作。我不知道在 SQL Server 端设置什么让它在过程中吐出消息,而且我不知道在 VB.Net 中接收这些消息是热的。

【问题讨论】:

  • 您如何处理存储过程中的错误?您将使用 RAISERROR 或(理想情况下)TRY/CATCH 块根据错误发生的位置在存储过程中设置消息。您的 VB 看起来不错,除了您可能想捕获 SqlException 以获取特定于数据库的错误,而不是 Exception
  • I am unsure how to send messages from the database to my VB.Net Application. ,您要查找的内容称为Service Broker。如果您使用的 SQL 服务器版本 >= 2005,这是一个选项。
  • 使用一条登录失败消息有一些好处。它不提供可能用于暴力攻击的详细信息。此外,如果未找到用户名,则尝试隔离意味着您必须首先查询该用户是否存在。然后进行第二次查询以检查密码是否正确。或者一些额外的障碍。
  • @Codexer 虽然 100% 正确,但我认为这个问题中的“消息”更像是“一些文本和/或值”(主要是因为代码是标准的数据集填充)——而不是结构化的消息对象。仅将其放在这里以防 OP 掉入 Service Broker 兔子洞并迷路了 :)
  • @DaveBrown 同意,感谢您的意见!

标签: sql-server vb.net stored-procedures error-messaging


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-08-22
    • 2023-04-02
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2019-01-30
    • 2014-10-15
    • 2013-01-14
    • 2012-05-04
    相关资源
    最近更新 更多