使用 sql 语句从第二个 datagridview 填充 DataGridView

Posted

技术标签:

【中文标题】使用 sql 语句从第二个 datagridview 填充 DataGridView【英文标题】:Fill DataGridView from second datagridview with sql statment 【发布时间】:2021-04-30 12:06:37 【问题描述】:

我正在使用 Sql localdb,我想从当前行从 datagridview 获取数据到另一个 这是我的代码

     Private Sub FrmSales_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Dim dadasales As New SqlDataAdapter
            Dim dtsales As New DataTable
            dtsales.Clear()
            dadasales = New SqlDataAdapter("Select ItemsInfo.Category From ItemsInfo Group By ItemsInfo.Category Order By ItemsInfo.Category", con)
            dadasales.Fill(dtsales)
            DGVCategory.DataSource = dtsales
    
    
    
        End Sub
    
        Private Sub lbHome_Click(sender As Object, e As EventArgs) Handles lbHome.Click
            frmHome.Show()
            Me.Close()
        End Sub
    
        Private Sub DGVCategory_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DGVCategory.CellClick
    
            Dim pos = DGVCategory.CurrentRow.Index
            Dim category As String = DGVCategory.Rows(pos).Cells(0).Value
            Dim daItem As New SqlDataAdapter
            Dim dtItem As New DataTable
    
            daItem = New SqlDataAdapter("Select ItemsInfo.Item, ItemsInfo.Price From ItemsInfo Where ItemsInfo.Category = '" & category & "'   Order By ItemsInfo.Category", con)
    
            daItem.Fill(dtItem)
            DgvItems.DataSource = dtItem

datagridview 从数据库中获取数据 但是第二个 datagridview 得到空数据我不知道为什么?

            Dim pos = DGVCategory.CurrentRow.Index
            Dim category As String = DGVCategory.Rows(pos).Cells(0).Value
            Dim daItem As New SqlDataAdapter
            Dim dtItem As New DataTable
    
            daItem = New SqlDataAdapter("Select ItemsInfo.Item, ItemsInfo.Price From ItemsInfo Where ItemsInfo.Category = '" & category & "'   Order By ItemsInfo.Category", con)
    
            daItem.Fill(dtItem)
            DgvItems.DataSource = dtItem

我认为问题出在 Sql 语句上,但我不知道如何解决它

【问题讨论】:

好吧,我建议你的第一件事是,使用参数进行查询。只是让整个事情调试起来更愉快。我不确定 DGVCategory_CellClick 和您的第二个 sn-p 之间有什么区别,但看起来相同,假设 2nd sn-p 是您提到的第二个查询,您确定 pos 的值是正确的并且没有在某处重置?你做了什么调试?第二个查询是否返回数据? 第二个查询返回没有数据的空datagridview 是的,了解 dvg 没有显示数据,您是否通过调试检查了查询结果以确保返回预期的数据 是的数据返回问题我猜这里Dim pos = DGVCategory.CurrentRow.Index Dim category As String = DGVCategory.Rows(pos).Cells(0).Value Where ItemsInfo.Category = '" & category & "' 【参考方案1】:

我将数据库代码与用户界面代码分开。这样更容易维护。

如果您打算让您的DataAdapter 超出范围,那么使用一个没有多大意义。只需使用阅读器加载Datatable

dtsales.Clear()

清除你刚刚在上一行创建的DataTable 有点傻。

需要释放连接、命令和数据读取器。 Using...End Using 块即使有错误也会这样做。这就是为什么需要在使用它们的方法中声明连接,而不是在表单级别。

当您只处理单个表时,无需在CommandText 中的每个字段中重复表名。

Group By 子句没有任何理由。我相信你想要的是Distinct。这将为您提供每个类别的单个实例。

Private ConStr As String = "Your connection string"

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Try
        DGVCategory.DataSource = GetSalesData()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

Private Function GetSalesData() As DataTable
    Dim dtsales As New DataTable
    Using con As New SqlConnection(ConStr),
            cmd As New SqlCommand("Select Distinct Category From ItemsInfo Order By Category;", con)
        con.Open()
        Using reader = cmd.ExecuteReader
            dtsales.Load(reader)
        End Using
    End Using
    Return dtsales
End Function

Private Sub DGVCategory_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DGVCategory.CellClick
    Dim pos = DGVCategory.CurrentRow.Index
    Dim category As String = DGVCategory.Rows(pos).Cells(0).Value.ToString
    Debug.Print(category) 'Check if you are passing what you expect
    Try
        DgvItems.DataSource = GetCategoryData(category)
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

Private Function GetCategoryData(category As String) As DataTable
    Dim dtItem As New DataTable
    Using con As New SqlConnection(ConStr),
            cmd As New SqlCommand("Select Item, Price From ItemsInfo Where Category = @Category Order By Category", con)
        cmd.Parameters.Add("@Category", SqlDbType.VarChar).Value = category
        con.Open()
        Using reader = cmd.ExecuteReader
            dtItem.Load(reader)
        End Using
    End Using
    Return dtItem
End Function

您可能希望使用 ListBox 或 ComboBox 来显示类别。尝试为每个用户交互选择适当的控件。

还有一件事。为此和您的所有代码打开 Option Strict。

【讨论】:

同样的问题,第一个 datagridview 的类别获取数据,但第二个空的只是列名 没关系,我错了 SqlDbType.VarChar 我把它改成 SqlDbType.NVarChar 一切都很好非常感谢你的帮助

以上是关于使用 sql 语句从第二个 datagridview 填充 DataGridView的主要内容,如果未能解决你的问题,请参考以下文章

SQL 最近从第二个表注册的 Id

Microsoft SQL 查询 - 从第二个表返回最后一条记录

在Oracle数据库条件查询语句中使用'%%','_%%'这两个有啥区别

在不借助 PL/SQL 的情况下从第二个表中查找相关值

使用第一个表的输出从第二个表中选择特定数据

OracleDataReader reader.Read() 从第二个记录行开始读取行,跳过第一行记录