ComboBox.SelectedText属性和数据库错误

问题描述 投票:0回答:1

此特定代码ComboBox2.SelectedItem查询对我的数据库有错误。我想我在此代码ComboBox2.SelectedItem中缺少了一些内容:

Private Sub UpdateCombo()
        ComboBox2.Items.Clear()

        SQLcon.Open()
        Dim Command As SqlClient.SqlCommand = SQLcon.CreateCommand()
        Command.CommandText = "Select productName From tblProductsStocks"
        Dim SQLReader As SqlClient.SqlDataReader = Command.ExecuteReader()
        While SQLReader.Read()
            ComboBox2.Items.Add(SQLReader.Item("productName"))
        End While
        SQLcon.Close()
    End Sub

Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox2.SelectedIndexChanged
SQLcon.Open()
        Dim Command As SqlClient.SqlCommand = SQLcon.CreateCommand()
        Command.CommandText = "Select * From tblProductsStocks WHERE productName=" & ComboBox2.SelectedItem
        Dim SQLReader As SqlClient.SqlDataReader = Command.ExecuteReader()
        SQLReader.Read()
        TextBox1.Text = SQLReader.Item("productType")
        TextBox2.Text = SQLReader.Item("productMass")
        SQLcon.Close()
    End Sub
vb.net ssms
1个回答
0
投票

请启用严格的选项。这是一个两部分的过程。首先针对当前项目-在解决方案资源管理器中,双击我的项目。选择左侧的编译。在Option Strict下拉菜单中,选择ON。第二个用于将来的项目-转到“工具”菜单->“选项”->“项目和解决方案”->“ VB默认值”。在Option Strict下拉菜单中,选择ON。这将使您免于运行时的错误。

需要处理连接并关闭它们,然后将其返回到连接池。如果有错误,您的代码甚至可能无法关闭连接。如果将数据库对象保留在本地,则可以控制它们是否已关闭和处置。即使有错误,Using...End Using块也会为您解决这一问题。在我的代码中,命令是Using块的一部分。请注意连接构造函数后的逗号。

您可以将连接字符串直接传递给连接的构造函数。同样,将命令文本和连接传递给命令构造函数。

使用参数。它不仅避免了连接字符串的错误,而且还避免了Sql注入。在您的代码中,所选项目应为字符串,但是您未能添加周围的单引号。使用参数时不需要。命令文本是服务器的可执行代码,恶意用户可以输入会破坏数据库的内容。服务器将参数视为值,而不是可执行代码,因此它们更安全。

在.Execute ...之前的最后可能的时刻打开连接。连接是宝贵的资源,需要尽快打开,关闭和处理。只要使用阅读器,连接就必须打开。因此,我将更新用户界面(文本框)移到了using块之外。

Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox2.SelectedIndexChanged
    Dim String1 As String = ""
    Dim String2 As String = ""
    Using SQLcon As New SqlConnection("Your connection string"),
        Command As New SqlCommand("Select * From tblProductsStocks WHERE productName= @producName", SQLcon)
        'Check your database for the actual datatype and field size
        Command.Parameters.Add("@productName", SqlDbType.VarChar, 100).Value = ComboBox2.SelectedItem.ToString
        SQLcon.Open()
        Dim SQLReader As SqlClient.SqlDataReader = Command.ExecuteReader()
        SQLReader.Read()
        String1 = SQLReader.Item("productType").ToString
        String2 = SQLReader.Item("productMass").ToString
    End Using 'closes and disposes the connection and command
    TextBox1.Text = String1
    TextBox2.Text = String2
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.