2014-11-14 21 views
0

我知道這些問題已經在這些論壇和互聯網上被多次詢問和回答,但我正在努力將自己的頭圍繞在它周圍。我無法準確理解這些關係如何與SQL數據庫中的主鍵和外鍵一起工作。假設我有一個名爲「Employees」的表,其中名爲「employeeID」的主鍵,然後是名爲「addressID」的主鍵的另一個表名爲「Addresses」。我將在「Addresses」表中創建一個名爲「employeeID」的外鍵,然後創建Employees表和Addresses表之間的關係是否正確?SQL數據庫關係和VB.Net應用程序

我有一個數據庫,有員工,地址,緊急聯繫人等......從我已閱讀和從各種來源理解正確創建。所以在我的應用程序vb.net使用Azure SQL數據庫,我試圖顯示在datagridview說員工和他們的地址。很顯然,datagridview一次只能顯示一張表中的信息,因此我試圖創建一個新的數據集,它將從兩個表中收集信息並在gatagrid視圖中將其顯示爲一個。當datagrid視圖顯示這些信息時,它全部混淆在一起,並且關係不被遵守。對於員工表中的每個條目,它會在地址表中爲每個人列出每個條目的三次。 enter image description here

下面是我使用的數據集的代碼的副本:

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

爲什麼在選擇語句中使用交叉連接而不是內部連接??????? – 2014-11-14 15:47:55

+0

我標記了這個問題,因爲它在另一個地方更好,因爲它詢問服務器中的關係。 – Codexer 2014-11-14 15:48:36

+0

大部分表格看起來應該是Emp表格上的列。一個員工有一個地址,電話等,所以列有點像屬性。 PK/FK關係可能會出現在「部門」 - 而Emp屬於一個部門,而一個部門可以有很多的emps。然後,Emp將有一個FK到Dept表(不是相反的方向) – Plutonix 2014-11-14 15:49:19

回答

1

您可以明確將其JOIN條款定義查詢的關係,事情是這樣的:。

SELECT * 
FROM Employee_Names 
INNER JOIN Addresses 
    ON Employee_Names.employeeID = Addresses.employeeID 

這告訴查詢明確遵循關鍵關係(它可能足夠聰明,可以根據RDBMS自行計算出簡單的關係,但明確表示會使代碼更清晰)

這是什麼產生的「結果是一組記錄」意義上的「一張表」。但是,如果Employee_Names表中的任何給定記錄在Addresses表中有多個關聯記錄,則邏輯上可以考慮這意味着什麼。將它們壓扁成單個結果表格,這意味着將會有重複的Employee_Names記錄。

這就是表格數據的本質。如果單個網格顯示兩個維度的數據,則必須將它們變平,從而產生一些重複的數據。

本質上你需要問自己究竟是什麼DataGridView應該代表「記錄」。目前它代表了Employee_NamesAddresses的獨特組合。無論重複,它都會顯示每個組合。

如果您希望每條記錄都代表一條獨特的Employee_Names記錄,那麼您不希望在查詢中執行JOIN。相反,您會希望使用該外鍵關係來指示父/子記錄,並將DataGridView綁定到多個表(而不是來自查詢的單個結果表)。

我沒有太多的工具經驗,但this似乎是一個合理的開始。想法是,DataGridView將顯示Employee_Names表中的記錄,並且單擊任何給定記錄的可擴展區域將顯示子網格中Addresses表的相關記錄。

+0

這正是我需要的!非常感謝!!我絕對需要觸摸我的SQL技能。 – 2014-11-14 16:10:04