使用 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的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft SQL 查询 - 从第二个表返回最后一条记录