2009-05-20 15 views
1

Ich habe versucht, eine innere Join-Select-Anweisung auszuführen, wobei ich zwei Felder aus einer Tabelle auswähle und dann alle Datensätze eines Feldes in einer zweiten Tabelle, die dieselbe ID wie die erste Tabelle haben.Ausführen einer inneren Verknüpfung

Der Code wie folgt aussieht:

Dim conn As OleDbConnection 
    Dim cmd As OleDbCommand 

    Public Sub openDB() 
     rsConn = New ADODB.Connection 
     rsConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\VFMS_DB.mdb;" & "Jet OLEDB:System Database=Security.mdw", "ADMIN", "1234") 
    End Sub 

    Public Function GetProdDetails(ByVal vegeID As Integer, ByRef dsTask As DataSet) As Integer 

     Dim retCode As New Integer 

     Dim da As OleDbDataAdapter 

     Try 
      Dim i As Integer = 0 

      openDB2() 

      da = New OleDbDataAdapter("SELECT [Vegetables Descriptions.Task], [Vegetables Descriptions.Description], [TasksOcc.When] FROM [Vegetables Descriptions] INNER JOIN [TasksOcc] ON [Vegetables Descriptions.DescID] = [TasksOcc.DescID] WHERE [Vegetables Descriptions.VegeID] = vegeID", conn) 
      da.Fill(dsTask) 

      retCode = 0 

      conn.Close() 
      Return retCode 
     Catch ex As Exception 
      MessageBox.Show(ex.ToString, ex.Message, MessageBoxButtons.OK) 
      retCode = 1 
      Return retCode 
     End Try 
    End Function 

erhalte ich eine Ausnahme: „ungültiges Klammerung von Name [Gemüse Descriptions.DescID]

wenn ich es herausnehmen, um es wie folgt aussehen I erhalten eine „Join Ausdruck nicht unterstützt“

 da = New OleDbDataAdapter("SELECT [Vegetables Descriptions.Task], [Vegetables Descriptions.Description], [TasksOcc.When] FROM [Vegetables Descriptions] INNER JOIN [TasksOcc] ON [DescID] = [DescID] WHERE [Vegetables Descriptions.VegeID] = vegeID", conn) 

ich habe versucht, Beispiele aus dem Netz folowing aber wo erfolglos.

Antwort

4

für Lesbarkeit eingewickelt Linien:

da = New OleDbDataAdapter(" 
    SELECT [Vegetables Descriptions].[Task], 
     [Vegetables Descriptions].[Description], 
     [TasksOcc].[When] 
    FROM [Vegetables Descriptions] INNER JOIN [TasksOcc] 
     ON [Vegetables Descriptions].[DescID] = [TasksOcc].[DescID] 
    WHERE [Vegetables Descriptions].[VegeID] = vegeID 
", conn) 

Jeder einzelne Kennung in eckigen Klammern geht, nicht jeder vollständigen Namen.

BTW: Tabellennamen mit Leerzeichen in ihnen sind ... Nun ... Sie sind nicht das, was ich tun würde. ;-)

EDIT: Das ist einfacher auf das Auge (nur eckigen Klammern für Tabellenbezeichner mit „non-standard“ Namen verwenden müssen, und Sie können Aliase):

da = New OleDbDataAdapter(" 
    SELECT d.Task, 
     d.Description, 
     t.When 
    FROM [Vegetables Descriptions] AS d INNER JOIN TasksOcc AS t 
     ON d.DescID = t.DescID 
    WHERE d.VegeID = vegeID 
", conn)   ''#^
       ''# | 
       ''# /----- Not sure what this does in this query, though. 
+0

+1 für Tabellennamen mit Leerzeichen - vermeiden, dass sie! –

+0

Das ist ziemlich cool, danke – Domitius

+0

die d.VegeID = vegeID ist sinnvoll, nur jene Datensätze auszuwählen, die dieser ID in der Tabelle [Vegetables Descriptions] entsprechen, aber aus irgendeinem Grund erhält es alle Informationen. – Domitius

5

Verwenden Sie [Vegetables Descriptions].[DescID] anstelle von [Vegetables Descriptions.DescID]. Da "Gemüsebeschreibungen" ein Leerzeichen enthält, muss es der einzige Name innerhalb [] sein.

0

Insert diese :

da = New OleDbDataAdapter("SELECT Descriptions.Task, Descriptions.Description, TasksOcc.When FROM Descriptions INNER JOIN TasksOcc ON TasksOcc.DescID = Descriptions.DescID WHERE Descriptions.VegeID = " & vegeID, conn)

Verwandte Themen