从 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
当然,密码是用盐散列存储的。
我正在为我正在处理的应用程序创建一个登录表单。我已将我的应用程序设置为正确连接到数据库以及 运行 数据库上的存储过程和查询。
但是我不确定如何将消息从数据库发送到我的 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
当然,密码是用盐散列存储的。