2009-05-20 35 views
1

私はテーブルから2つのフィールドを選択し、第1テーブルと同じIDを持つ第2テーブルのフィールドのすべてのレコードよりも、内部結合選択ステートメントを実行しようとしました。内部結合を実行する

コードは以下のようになります。

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 

私は例外を取得:私は従うとして、それが見えるようにそれを取る場合は、[野菜Descriptions.DescID]

名の」無効なブラケットを

 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) 

「を表現しようサポートされていません」を取得私はネットからの例が、どこの失敗をfolowing試してみました。

答えて

4

ライン:

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) 

すべて単一の識別子は角括弧ではなく、すべての完全な名前になります。

ところで:スペースが入ったテーブル名は...まあ...彼らは私がやることではありません。 ;-)

EDIT:これは、目に簡単です(あなたが唯一の「非標準」の名前を持つテーブル識別子の角括弧を使用する必要がある、とあなたは別名を使用することができます):

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空白を含む表名の場合は避けてください。 –

+0

これはかなり涼しいです、ありがとう – Domitius

+0

d.VegeID = vegeIDは[Vegetables Descriptions]テーブルのそのidと等しいレコードを選択するだけですが、何らかの理由ですべての情報を取得します。 – Domitius

5

[Vegetables Descriptions.DescID]の代わりに[Vegetables Descriptions].[DescID]を使用してください。 「野菜の説明」にはスペースが含まれているため、[]の唯一の名前でなければなりません。読みやすくするためにラップ

0

挿入これを:

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)