首页 > 解决方案 > 有没有办法根据 vb.net 中的 datagridview 选定值运行 for 循环查询?

问题描述

由于以下错误,无法获得异常结果

从字符串 " 到类型 'integer' 的转换无效'

我已经能够从产品表中加载值,将选定的值添加到选定的产品中,然后根据客户表搜索所有选定的产品,以了解有多少客户订购了这些产品。

Try
    Dim ListOfDiag As StringBuilder = New StringBuilder()
    For Each row As DataGridViewRow In SelectedDiagDGV.Rows
        ListOfDiag.Append(row.Cells(0).Value.ToString & "", "" & Environment.NewLine)
    Next

    Dim query As String = String.Empty
    Dim SegmentConnectionString As String = "Data Source=Test-PC;Initial Catalog=TestDB;Integrated Security=True"
    query = "SELECT Customers, ProductName from Customers WHERE ProductName in (" & ListOfDiag.ToString & ")"
    Dim dTable As DataTable = New DataTable()
    Dim dAdapter As SqlDataAdapter
    dAdapter = New SqlDataAdapter(query, SegmentConnectionString)
    dAdapter.Fill(dTable)
    DataGridView1.DataSource = dTable

    'Next
Catch ex As System. Exception
    MsgBox(ex.Message.ToString)
End Try

无法执行 for 循环搜索。一些值包含特殊字符,例如:Soft 'Drink';电脑桌)。

错误:从字符串 " 到类型 'Integer' 的转换无效。

标签: vb.netfor-loop

解决方案


ListOfDiag.Append(row.Cells(0).Value.ToString & "", "" & Environment.NewLine)

没有作为参数StringBuilder.Append的重载。(String, String)第一个字符串是row.Cells(0).Value.ToString & "",然后在参数之间有一个逗号,第二个字符串是"" & Environment.NewLine记住“”是一个空字符串,而不是转义字符。不确定您的意图是什么,但这行不通。

你有正确的方法;为该In子句构建一个字符串。我使用 aList(Of String)从行中获取数据,然后在循环之后我使用.Join带有逗号分隔符的 a 来获取In子句的值。

我将连接字符串直接传递给 Connection 的构造函数,并将 Select 语句和连接传递给 Command 的构造函数。对于我使用的 Select 语句和 Interpolated String(以 $ 开头的字符串)您还可以在旧版本的 Visual Studio 中使用 String.Format。

Using...End Using即使出现错误,这些块也可确保您的数据库对象已关闭和处置。

我认为唯一可能搞砸的特殊字符是产品名称中存在逗号。

Private Sub OPCode()
    Dim dTable As New DataTable
    Dim ListOfDiag As New List(Of String)
    For Each row As DataGridViewRow In SelectedDiagDGV.Rows
        ListOfDiag.Add(row.Cells(0).Value.ToString)
    Next
    Dim InData = String.Join(",", ListOfDiag)
    Using cn As New SqlConnection("Data Source=Test-PC;Initial Catalog=TestDB;Integrated Security=True")
        Using cmd As New SqlCommand($"SELECT Customers, ProductName from Customers WHERE ProductName in ({InData})", cn)
            cn.Open()
            dTable.Load(cmd.ExecuteReader)
        End Using
    End Using
    DataGridView1.DataSource = dTable
End Sub

推荐阅读