2012-02-21 165 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-零的帮助