Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在vb.net应用程序中显示连接表中的记录?_Vb.net - Fatal编程技术网

如何在vb.net应用程序中显示连接表中的记录?

如何在vb.net应用程序中显示连接表中的记录?,vb.net,Vb.net,我有两个表,主题和部门,具有多对多关系。连接表称为部门\科目\连接。我使用SQLServerDBMS Subjects: subjects_id(primary key) subject_name Departments: department_id(primary key) department_name Departments_Subjects_junction: subject_id(primary key) department_id(primary key) 我能够在所有三个表

我有两个表,主题和部门,具有多对多关系。连接表称为部门\科目\连接。我使用SQLServerDBMS

Subjects:
subjects_id(primary key)
subject_name


Departments:
department_id(primary key)
department_name

Departments_Subjects_junction:
subject_id(primary key)
department_id(primary key)
我能够在所有三个表中存储数据

现在,我想显示记录供用户查看。 例如,用户必须查看每个部门的所有主题列表。 大概是这样的:

DepartmentA- Subject1, subject2, subject3, Subject4
DepartmentB- subject2, subject3, subject5
DeparmtentC- subject1, subject3, subject6.

如何以最佳方式实现这一点?使用datagrid、listview或其他东西?请帮忙。谢谢。

无论您使用何种控件来显示数据,无论是datagrid还是listview,都可以正常工作,这取决于您希望它们的外观。所以我冒昧地说,您的问题实际上是针对不同的表查询数据并将其显示在列表中。这纯粹是SQL

您的表
Departments\u Subjects\u junction
下不能有两个字段作为主键,因为在我看来,它是定义某个部门的主题的表。所以它应该是

Departments_Subjects_junction
department_id(primary key)
subject_id
然后可以使用此SQL语句进行查询

SELECT T2.department_name, T3.subject_name
FROM Departments_Subjects_junction T1
INNER JOIN Departments T2
ON T1.department_id=T2.department_id
INNER JOIN Subjects T3
ON T1.subject_id=T3.subject_id;
好的,这是你要做的

1) 将
ListView
控件添加到表单中

2) 在设计时添加一列

3) 将ListView的
视图
属性设置为
详细信息

4) 将此代码添加到任意位置并调用它

Private Sub displaydata()
    Dim item As ListViewItem
    Dim dt As New DataTable

    dt.Clear()
    ListView1.Groups.Clear()
    da = New SqlDataAdapter("SELECT department_name FROM Departments", con) 
    da.Fill(dt)
    For x = 0 To dt.Rows.Count - 1
        ListView1.Groups.Add(dt.Rows(x).Item("department_name"), dt.Rows(x).Item("department_name"))
    Next x

    dt.Clear()
    ListView1.Items.Clear()
    da = New SqlDataAdapter("SELECT T2.department_name, T3.subject_name FROM Departments_Subjects_junction T1 INNER JOIN Departments T2 ON T1.department_id=T2.department_id INNER JOIN Subjects T3 ON T1.subject_id=T3.subject_id ", con) 
    da.Fill(dt)
    For x = 0 To dt.Rows.Count - 1
        item = New ListViewItem
        item.Text = dt.Rows(x).Item("subject_name")
        item.Group = ListView1.Groups(dt.Rows(x).Item("department_name"))
        ListView1.Items.Add(item)
    Next x
    dt.Clear()
End Sub   

这应该行。

谢谢。这是一种多对多的关系。一个部门有几个科目。同时,一些科目对所有部门都是通用的。您可以相应地更改查询吗?我明白了,请先尝试SQL语句。它的工作原理是一样的:)它确实工作,但不是我想要的方式。在输出中,部门名称会重复,这是我不想要的。部门名称必须只显示一次,就像我在我的问题中发布的那样。你能发布一个实际结果的屏幕截图吗?你想要的产量是多少?如果我看到您当前的实际结果,将更容易解决您的问题。因此,是否要显示所有部门名称?或者您选择部门名称,然后主题就出来了?我已经有一段时间没有使用SQL了,但我记得有一个
for XML PATH
语句,它允许您动态地将结果反规范化为字符串,就像上面所说的那样。看看这个: