2012-02-21 76 views
1

我想在SQL Server CE中的單個查詢中執行多個連接。我知道SQL Server CE不支持多個SELECT,但我無法在多個INNER JOIN上找到任何信息。我在ProjectItemMaster(FROM之後)和第一個INNER JOIN上不斷收到令牌錯誤。警告這是一個用於生成報告的嚴重醜陋查詢。多個INNER JOINs SQL Server精簡版

GetCutSheetDataByCustPnumTagQuery定義爲:

SELECT ReportCalculations.ItemNumber, ReportCalculations.PartNumber, 
     ReportCalculations.calcWidth, ReportCalculations.calcHeight, 
     ReportCalculations.calcQuantity, ReportCalculations.Description, 
     ReportCalculations.PrintonCutSheet, ProjectItemMaster.Quantity, 
     ProjectItemMaster.HingeDirection, ProjectItemMaster.ItemDescription, 
     ProjectItemMaster.MetalFinish, ProjectItemMaster.Width, 
     ProjectItemMaster.Height, ProjectItemMaster.CustomerID, 
     CustomerMaster.CustomerId AS Id_CM, ProjectItemMaster.GlassType, 
     ProjectItemMaster.Tag AS Expr1, ReportCalculations.Tag, 
     ProjectItemMaster.ItemNumber AS Expr2, ReportCalculations.CalcX, 
     ReportCalculations.CalcY, ProjectItemMaster.OpeningWidth, 
     ProjectItemMaster.ReturnDirection, ProjectItemMaster.PanelDirection, 
     ProjectItemMaster.ReturnWidth, ProjectItemMaster.ButtressHeight, 
     ProjectItemMaster.ButtressWidth, ProjectItemMaster.AvailThickness, 
     ProjectItemMaster.PanelThickness, ProjectItemMaster.Image, 
     ProjectItemMaster.SoftwareVersion, ProjectItemMaster.DatabaseVersion, 
     ProdlineMaster.Series, ProdlineMaster.Report, ProjectItemMaster.Addons, 
     ProjectItemMaster.PanelWidth, CustomerMaster.CustomerName, 
     ProjectMaster.WO, ProjectMaster.PO, ProdlineMaster.SeriesName, 
     ReportCalculations.Series AS Expr3 
FROM ProjectItemMaster 
INNER JOIN CustomerMaster 
ON ProjectItemMaster.CustomerID = CustomerMaster.CustomerId 
INNER JOIN ReportCalculations 
ON ProjectItemMaster.Tag = ReportCalculations.Tag 
AND ProjectItemMaster.CustomerID = ReportCalculations.CustomerID 
AND ProjectItemMaster.ProjectNumber = ReportCalculations.ProjectNumber 
INNER JOIN ProdlineMaster 
ON ReportCalculations.Series = ProdlineMaster.Series 
INNER JOIN ProjectMaster 
ON CustomerMaster.CustomerId = ProjectMaster.CustomerId 
AND ProjectItemMaster.ProjectNumber = ProjectMaster.ProjectNumber 
WHERE (ReportCalculations.PrintonCutSheet = 'Y') 
AND (ProjectItemMaster.ProjectNumber = @ProjectNumber) 
AND (CustomerMaster.CustomerId = @CustomerID) 
AND (ProjectItemMaster.CustomerID = @CustomerID) 
AND (ProjectItemMaster.Tag = @TAG) 

這是在執行查詢在VB.NET上的SQL數據庫壓縮功能。

Public Function getCutSheetInfobyCustProdTag(ByRef customerID As String, 
              ByRef projectNumber As Integer, 
              ByVal tag As String) 
             As System.Data.DataTable 

    Dim mydata As New DataTable 
    GetCutSheetDataByCustPnumTagQuery.Parameters.Clear() 
    GetCutSheetDataByCustPnumTagQuery.Parameters.AddWithValue("@ProjectNumber", 
                   projectNumber) 
    GetCutSheetDataByCustPnumTagQuery.Parameters.AddWithValue("@CustomerID", 
                    customerID) 
    GetCutSheetDataByCustPnumTagQuery.Parameters.AddWithValue("@TAG", tag) 

    Try 
     splConnection.Open() 
     Dim reader As SqlCeDataReader = GetCutSheetDataByCustPnumTagQuery.ExecuteReader 
     mydata.Load(reader) 
    Catch ex As Exception 
     MessageBox.Show("Problem with reportcalculations table", "Error", 
         MessageBoxButtons.OK, MessageBoxIcon.Error) 
     ' Return False 
    Finally 
     splConnection.Close() 
    End Try 
    'Return True 
    Return mydata 

End Function 

如果我不能使用多個INNER JOIN我可以把查詢分解成許多不同的查詢,但我不想這樣做。所以維護一個SQL Server CE和一個SQL Server版本的程序更容易。

+0

快速瀏覽,您的發言_looks_很好,雖然我不知道有足夠的瞭解緊湊的判斷有關'JOIN's(雖然我可以」不要想象他們會 - 你會禁用RDBMS的大部分原因...)。如果它抱怨'FROM'子句,請嘗試刪除單個選定的列直到它消失。我還推薦在'JOIN's中放置__一切可能的東西,並且在'WHERE'子句中放入** not **;保存用於限制由FROM引用的表的WHERE子句(或模擬EXCEPTION連接) – 2012-02-21 16:55:10

+0

@ X-Zero重新排列查詢後,我不再在FROM標記上得到'SQLCeException'。我現在正在收到'SQLCeException''數據轉換失敗。 [OLE DB狀態值(如果已知)= 0]'。經過一番研究後,問題似乎來自架構不匹配或NULL值。 – Calidus 2012-02-21 17:44:25

+0

你列出的例外感覺有點模糊 - 我會檢查你所有的比較列是相同的數據類型。 – 2012-02-21 18:21:46

回答

2

顯然,當SQL查詢參數沒有明確聲明其類型和長度時,SQL Compact並不喜歡它。該查詢不斷試圖將「987654」的CustomerID轉換爲數字。我想通了,因爲硬編碼的價值觀查詢使它運行良好,但是當我使用@CustomerID該程序扔了一個期待。因此,從parameters.addwithvalue(Name,Value)切換到Parameters.add(Name,Type,Length)解決了這些問題。

Public Function getCutSheetInfobyCustProdTag(ByRef customerID As String, ByRef projectNumber As Integer, ByVal tag As String) As System.Data.DataTable 

     Dim mydata As New DataTable 
     GetCutSheetDataByCustPnumTagQuery.Parameters.Clear() 
     GetCutSheetDataByCustPnumTagQuery.Parameters.Add("@ProjectNumber", System.Data.SqlDbType.Int) 
     GetCutSheetDataByCustPnumTagQuery.Parameters("@ProjectNumber").Value = projectNumber 
     GetCutSheetDataByCustPnumTagQuery.Parameters.Add("@CustomerID", System.Data.SqlDbType.NVarChar, 25) 
     GetCutSheetDataByCustPnumTagQuery.Parameters("@CustomerID").Value = customerID 
     GetCutSheetDataByCustPnumTagQuery.Parameters.Add("@TAG", System.Data.SqlDbType.NVarChar, 50) 
     GetCutSheetDataByCustPnumTagQuery.Parameters("@TAG").Value = tag 

     Try 
      splConnection.Open() 
      Dim reader As SqlCeDataReader = GetCutSheetDataByCustPnumTagQuery.ExecuteReader 
      mydata.Load(reader) 
     Catch ex As Exception 
      MessageBox.Show("Problem with reportcalculations table", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 

     Finally 
      splConnection.Close() 
     End Try 

     Return mydata 
    End Function 

謝謝@ X-零的幫助