【发布时间】: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