2015-12-18 4 views
1

Что мне нужно сделать, это:VB- Использование INNER JOIN и отображения данных

  • Выберите .mdb файл
  • Дисплей на DataGrid 2 поля из Table1 и 1 поле от table2
  • Сохраните таблицу как новая база данных

Я застрял в точке 2, я не могу присоединиться к двум столам, я использовал INNER JOIN и LEFT JOIN.

В моем .mdb DB есть 2 стола, каждый из которых содержит Field1, Field2 и Field3. Я хочу показать Table1.Field1, Table1.Field2, Table2.Field3.

Мой код (на button_click события) является:

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() 

Используя этот код, в показывает только поля 1 и 2 из таблицы 1.

Но если я изменить это:

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

Для этого:

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

Это сработает!

Но почему?

Как я должен перенастроить свои поля на моем новом столе, если у моего реального MDB есть еще много таблиц и полей?

Благодаря

ответ

0

Я нашел решение. Моя проблема была в том, что я не знал, как именно должна работать INNER JOIN. Я объясню, если у кого-то будет такая же проблема, как у меня. для использования INNER JOIN для таблиц, к которым вы хотите присоединиться, должно иметь одно общее поле, обычно это идентификатор, но в моем случае у моей базы данных его нет.

Итак, решить мою проблему, мне нужно, чтобы создать поле идентификатора с этим кодом:

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" 

Спасибо

0

Попробуйте da.SelectCommand = cmd вместо da = New OleDbDataAdapter(cmd) и посмотреть, если это работает. Это единственное, о чем я могу думать. Ваш код выглядит хорошо.