vb net-database有两个表,检索记录

时间:2013-12-29 14:15:57

标签: database join

我的问题如下:

我在访问中创建了2个表,并在vb net中创建了一个表单。 第一个表包括:Id(主键),名字,姓氏。 第二个表包含访问,它包括:visitID,DateOfVisit。 我的问题是如何连接这两个表,以便第一个表中的每个ID在选中时显示第二个表中的correspodind行。

例如,一个ID可以包含姓氏和姓氏以及存储在第二个表中的一个或多个日期..

当我搜索名称时,它只填充名字和姓氏,但不填充日期。这是我卡住的地方。我希望当我搜索名称时也填写对应的文本框或在网格中显示日期所选记录有。

感谢。

3 个答案:

答案 0 :(得分:0)

Imports System.Data.OleDb

Public Class Form1
    Dim provider As String

    Dim dataFile As String

    Dim connString As String

    Public myConnection As OleDbConnection = New OleDbConnection

    Public dr As OleDbDataReader
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'DoctorDataSet.Table1' table. You can move, or remove it, as needed.
        Me.Table1TableAdapter.Fill(Me.DoctorDataSet.Table1)
        provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ="

        dataFile = "C:\Users\Desktop\Desktop\doctor.accdb" ' Change it to your Access Database location

        connString = provider & dataFile

        myConnection.ConnectionString = connString
    End Sub

    Private Sub FindButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FindButton.Click
        myConnection.Open()

        FirstnameTextBox.Clear()

        LastnameTextBox.Clear()

        VisitsTextBox.Clear()

        Dim str As String

        str = "SELECT * FROM table1 WHERE (Firstname = '" & CodeText.Text & "')"

        Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)

        dr = cmd.ExecuteReader

        While dr.Read()

            FirstnameTextBox.Text = dr("Firstname").ToString

            LastnameTextBox.Text = dr("Lastname").ToString

            VisitsTextBox.Text = dr("Visits").ToString

        End While

        myConnection.Close()
    End Sub

    Private Sub Table1BindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Table1BindingNavigatorSaveItem.Click
        Me.Validate()
        Me.Table1BindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.DoctorDataSet)

    End Sub

    Private Sub BindingNavigatorMovePreviousItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMovePreviousItem.Click

    End Sub
End Class

我附上了完整的代码以及数据库和来自prgoramm的截图。当我搜索时,一切正常,但是你可以看到我还有一个表(table2),其中包含每个id的约会数量从table1.Thats我卡住了,我不能让它工作..例如来自table1的id除了名称和姓氏的信息也显示和访问次数。

我希望我现在更清楚......:)

ps:我是vbnet的新手,几天前才用这种语言编程。

答案 1 :(得分:0)

好吧,忘了我写的东西,我会尝试用另一种方式......

这是我的2张桌子: 对于客户的表1,第一列是每个唯一的id的id,然后是firstname和second name。 ID名字SecondName 1约翰琼斯 2詹姆斯詹姆森 3尼克帕特里克 4尼基萨默斯

表2用于存储访问日期。来自table1的每个ID可以有0个或更多个访问。在这种情况下,只有第三个(Nick Patrick)为null。 ID Visit_Date 1 1/1/2010 2 5/1/2012 3 - 4 7/1/2014

我已经在访问中创建了数据库,并将其加载到我在Visual Studio中的项目中。当我将数据源中的框从右列拖放到表单中时,我有一个用于id的文本框,一个用于firstname,一个用于第二个名字和一个访问日期。 导航栏位于顶部。当我按下下一个按钮时,除了始终显示第一条记录的visit_date文本框之外,所有字段都被填充。

答案 2 :(得分:0)

这应该是你问题的答案。

除非两个表都有公共字段,否则无法加入这两个表。所以你的第二个表也应该有一个ID字段,不应该是主键。然后你可以使用这个SQL语句。

"SELECT table1.ID, table1.firstname, table1.lastname, table2.visitID, table2.dateofvisit FROM table1 INNER JOIN table2 ON table1.ID=table2.ID WHERE table1.ID='" & ID & "'"

其中ID是保存人员ID的变量名称。您不应该将FirstName字段用于WHERE子句,因为人们可能具有相同的名字。在所有字段中使用唯一字段...在这种情况下是ID字段。