我知道这些问题已在这些论坛和互联网上多次被问及回答,但我正在努力解决这个问题。我无法准确理解关系如何与SQL数据库中的主键和外键一起使用。说我有一个名为"员工"主键名为" employeeID"然后是另一个表名"地址"主键名为" addressID"我会在" Addresses"中创建一个外键。表名为" employeeID"那么创建Employees表和Addresses表之间的关系是否正确?
我有一个包含员工,地址,紧急联系人等的数据库......我从各种来源阅读和理解的内容都是正确创建的。所以在我的应用程序vb.net中使用Azure SQL DB我试图在datagridview中显示员工及其地址。很明显,datagridview一次只能显示一个表中的信息,因此我尝试创建一个新数据集,该数据集将从两个表中收集信息并在gatagrid视图中将其显示为一个。当数据网格视图显示此信息时,它们全部混淆并且关系不受尊重。对于employee表中的每个条目,它在地址表中三次列出每个人的每个条目。
以下是我正在使用的数据集代码的副本:
Dim connectionstring As String = My.Settings.MacroQualityConnectionString
Dim sqlemp As String = "SELECT * FROM Employee_Names, Addresses"
Dim connection As New SqlConnection(connectionstring)
Dim dataadapter As New SqlDataAdapter(sqlemp, connection)
connection.Open()
dataadapter.Fill(dsemployees, "Employee_Names")
connection.Close()
DataGridView1.DataSource = dsemployees.Tables(0)
我知道它可能不正确,但我不确定如何让应用程序尊重数据库中的关系?最终我需要能够从多个表中收集信息才能在datagridview中正确显示,但不幸的是我的SQL技能在我的大多数其他技能中都相当薄弱!也许我的大多数问题都回到了我的数据库的设计和设置上?任何输入都非常感谢每个人,因为我已经在这几周挣扎了! :(
提前谢谢大家!
答案 0 :(得分:1)
您可以使用JOIN
子句在查询中显式定义关系。像这样:
SELECT *
FROM Employee_Names
INNER JOIN Addresses
ON Employee_Names.employeeID = Addresses.employeeID
这告诉查询明确遵循该关键关系(它可能足够聪明,可以根据RDBMS自行确定简单关系,但显式使代码更清晰。)
这会产生 "一个表"从某种意义上说,结果是一组记录。但是,如果Employee_Names
表中的任何给定记录在Addresses
表中有多个关联记录,那么从逻辑上考虑这意味着什么。将它们展平为一个结果表,这样就意味着会有重复的Employee_Names
个记录。
这就是表格数据的本质。如果单个网格显示两个维度的数据,则必须将它们展平,从而产生一些重复的数据。
基本上你需要问自己究竟是什么"记录"在DataGridView
应该代表。目前,它代表Employee_Names
和Addresses
的唯一组合。无论重复如何,它都将显示每种组合。
相反,如果您希望每条记录代表唯一的Employee_Names
记录,那么您就不希望在查询中执行JOIN
。相反,您希望使用该外键关系来指示父/子记录,并将DataGridView
绑定到多个表(而不是查询中的单个结果表)。
我没有太多使用该工具的经验,但this似乎是一个合理的起点。我们的想法是DataGridView
将显示Employee_Names
表中的记录,然后单击任何给定记录的可扩展区域将显示子网格中Addresses
表的关联记录。