VB-使用INNER JOIN并显示数据

时间:2015-12-18 20:17:14

标签: vb.net ms-access join datagrid

我需要做的是:

  • 选择.mdb文件
  • DataGrid的{​​{1}} 2个字段和Table1
  • 的1个字段中显示
  • 将表另存为新数据库

我被困在第2点,我无法加入这两张桌子,我一直在使用table2INNER JOIN

我的LEFT JOIN数据库有2个表,每个表都有.mdbField1Field2。 我想显示Field3Table1.Field1Table1.Field2

我的代码(在Table2.Field3事件上)是:

button_click

使用此代码,仅显示表1中的字段1和。

但如果我改变了这个:

 Dim openFile As New OpenFileDialog()
    openFile.FileName = ""
    openFile.Filter = "Microsoft Access Application (*.mdb)|*.mdb"

    Dim res As System.Windows.Forms.DialogResult = openFile.ShowDialog()
    If res = System.Windows.Forms.DialogResult.Cancel Then
        Return
    End If

    Dim CONNECT_STRING As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + openFile.FileName
    Dim cnn As New OleDbConnection(CONNECT_STRING)
    cnn.Open()

    'PROBLEM HERE
    Dim Sql As String = "SELECT Tabla1.Campo1, Tabla1.Campo2, Tabla2.Campo3"
    Sql += " FROM Tabla1 LEFT JOIN Tabla2 ON Tabla1.Campo3 = Tabla2.Campo3"


    Dim cmd As New OleDbCommand(Sql, cnn)
    Dim da As New OleDb.OleDbDataAdapter(cmd)
    Dim ds As New DataSet
    da = New OleDbDataAdapter(cmd)
    da.Fill(ds, "joined")
    dGrid.DataSource = ds.Tables("joined")
    cnn.Close()

对此:

Dim Sql As String = "SELECT Tabla1.Campo1, Tabla1.Campo2, Tabla2.Campo3"
Sql += " FROM Tabla1 LEFT JOIN Tabla2 ON Tabla1.Campo3 = Tabla2.Campo3"

它会起作用!

但为什么?

如果真正的MDB有更多的表格和字段,我应该如何在我的新桌子上重新安排我的字段?

由于

2 个答案:

答案 0 :(得分:0)

尝试使用da.SelectCommand = cmd代替da = New OleDbDataAdapter(cmd) 并看看是否有效。这是我唯一能想到的事情。你的代码看起来不错。

答案 1 :(得分:0)

我找到了解决方案。 我的问题是我不知道INNER JOIN究竟应该如何工作。 如果有人遇到同样的问题,我会解释一下。 使用INNER JOIN要加入的表必须有1个共同字段,通常这是ID,但在我的情况下,我的数据库没有。

因此,在解决我的问题时,我需要使用以下代码创建一个ID字段:

 Dim oQuery As String = "ALTER TABLE FloatTable ADD COLUMN ID Identity(1,1)"
    Dim oComm = New OleDbCommand(oQuery, cnn)
        oComm.ExecuteNonQuery()

之后,我能够毫无问题地使用INNER JOIN:

Dim Sql As String = "SELECT FloatTable.DateAndTime, FloatTable.Millitm, FloatTable.TagIndex, FloatTable.Val, StringTable.TagIndex"
    Sql += " FROM FloatTable INNER JOIN StringTable ON FloatTable.ID = StringTable.ID"

谢谢