【问题标题】:How to prevent certain data from being inserted into the database with If Else statements?如何防止使用 If Else 语句将某些数据插入数据库?
【发布时间】:2015-06-29 16:21:02
【问题描述】:

我有两个组合框,一个消息框和一个发送按钮。当应用程序启动时,我在组合框和消息框为空的情况下单击发送按钮,弹出一个框并显示"Select a client" 执行此操作后,我返回数据库并看到它已将新记录添加到那个表,即使我在点击“发送”按钮后没有输入任何数据。同样适用于当我拥有的三个控件之一有数据但其他两个没有,并且程序要求我在成功之前输入该数据时。但是,尽管有这些 If 语句,它仍然会添加记录。我究竟做错了什么?

我的代码:

Using con As New SqlConnection(ConfigurationManager.ConnectionStrings("conStr").ConnectionString)

    con.Open()

    Using cmd As New SqlCommand
        cmd.Connection = con
        cmd.CommandText = "insert into tblMyTable(Client, UserName, Message) values('" & cboClient.Text & "', '" & cboUser.Text & "', '" & rtfMessage.Text & "')"
        cmd.ExecuteNonQuery()
    End Using
    If cboClient.Text = "" Then
        MsgBox("Select a client")
    ElseIf cboUser.Text = "" Then
        MsgBox("Select a user")
    ElseIf rtfMessage.Text = "" Then
        MsgBox("Enter a message")
    Else
        MsgBox("Message Sent")
    End If
    con.Close()

End Using

【问题讨论】:

  • 您正在执行查询,然后要求用户验证数据?使用参数避免sql注入,顺便说一句。
  • 您在任何条件检查之前进行插入,这对 sql 命令无论如何都没有影响。
  • 当然它会获取新行。插入数据的唯一行是在 IF 语句之前。顺便说一句,您的代码是 sql 注入的教科书示例。您需要对该查询进行参数化。
  • 我该怎么做?
  • 使用参数化插入,你有SQL注入漏洞。

标签: sql sql-server vb.net


【解决方案1】:

我认为你想要这样的东西(注意这不解决参数化问题):

Using con As New SqlConnection(ConfigurationManager.ConnectionStrings("conStr").ConnectionString)


    If cboClient.Text = "" Then
        MsgBox("Select a client")
    ElseIf cboUser.Text = "" Then
        MsgBox("Select a user")
    ElseIf rtfMessage.Text = "" Then
        MsgBox("Enter a message")
    Else
        con.Open()
        Using cmd As New SqlCommand
          cmd.Connection = con
          cmd.CommandText = "insert into tblMyTable(Client, UserName, Message) values('" & cboClient.Text & "', '" & cboUser.Text & "', '" & rtfMessage.Text & "')"
          cmd.ExecuteNonQuery()
        End Using

        MsgBox("Message Sent")
    End If
    con.Close()

End Using

【讨论】:

  • 我想现在应该可以了。我会尝试参数化它。谢谢!
【解决方案2】:

@OldProgrammer 的类似解决方案,尝试参数化插入。

    Private Sub SendButton_Click(sender As System.Object, e As System.EventArgs) Handles SendButton.Click
        Try
            If writeMessage() Then
                MessageBox.Show("Message sent.", "Success")
            End If
        Catch ex As Exception
            MessageBox.Show(String.Concat("An error occurred sending this message:", ex.Message))
        End Try
    End Sub    

    Private Function writeMessage() As Boolean

        If isValidMessage() Then
            writeMessageInfo()
            Return True
        End If

        Return False

    End Function

    Private Sub writeMessageInfo()

        Using con As New SqlConnection(yourConnectionString)

            con.Open()

            Using cmd As New SqlCommand
                cmd.Connection = con
                cmd.Parameters.Add(New SqlParameter("clientValue", cboClient.Text))
                cmd.Parameters.Add(New SqlParameter("userValue", cboUser.Text))
                cmd.Parameters.Add(New SqlParameter("messageText", rtfMessage.Text))
                cmd.CommandText = "insert into tblMyTable(Client, UserName, Message) values(@clientValuem, @userValue, @messageText)"
                cmd.ExecuteNonQuery()
            End Using

            con.Close()

        End Using
    End Sub


    Private Function isValidMessage() As Boolean

        If cboClient.SelectedIndex = -1 Then
            MessageBox.Show("Please select a client.", "Missing info")
            cboClient.Focus()
            Return False
        End If

        If cboUser.SelectedIndex = -1 Then
            MessageBox.Show("Please select a user.", "Missing info")
            cboUser.Focus()
            Return False
        End If

        If rtfMessage.Text = String.Empty Then
            MessageBox.Show("Please enter a message.", "Missing info")
            rtfMessage.Focus()
            Return False
        End If

        Return True

    End Function

【讨论】:

  • 我这里有这个按钮:Private Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click MessageSent() End Sub 但是你在这里的东西对我不起作用。
  • 我也没有收到这些弹出消息。我多次单击该按钮,无论如何都会将数据添加到表格中。
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多