Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个内部联接SQL Server Compact Edition_Sql_Vb.net_Inner Join_Multiple Tables - Fatal编程技术网

多个内部联接SQL Server Compact Edition

多个内部联接SQL Server Compact Edition,sql,vb.net,inner-join,multiple-tables,Sql,Vb.net,Inner Join,Multiple Tables,我正在尝试在SQLServerCE中的单个查询中执行多个联接。我知道SQL Server CE不支持多个选择,但我找不到有关多个内部联接的任何信息。我在ProjectItemMaster(在FROM之后)和第一个内部联接上不断收到令牌错误。警告:这是一个用于生成报告的大而丑陋的查询 getCutsheetDatabyCustomPNumTagQuery定义如下: SELECT ReportCalculations.ItemNumber, ReportCalculations.PartNumber

我正在尝试在SQLServerCE中的单个查询中执行多个联接。我知道SQL Server CE不支持多个选择,但我找不到有关多个内部联接的任何信息。我在
ProjectItemMaster
(在FROM之后)和第一个内部联接上不断收到令牌错误。警告:这是一个用于生成报告的大而丑陋的查询

getCutsheetDatabyCustomPNumTagQuery
定义如下:

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 Compact数据库执行查询的函数

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

如果我不能使用多个内部联接,我可以将查询分解为许多不同的查询,但我不希望这样。因此,更容易维护SQL Server CE和SQL Server版本的程序。

显然,当您提供的查询参数没有明确说明其类型和长度时,SQL Compact不喜欢它。查询一直试图将
CustomerID
(即“987654”)转换为数字。我明白了这一点,因为将值硬编码到查询中使其运行良好,但当我使用@CustomerID时,程序抛出了一个期望值。因此,从parameters.addwithvalue(名称、值)切换到parameters.add(名称、类型、长度)解决了这些问题

 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-Zero的帮助

快速浏览一下,您的声明看起来不错,尽管我对Compact了解不够,无法判断加入s(尽管我无法想象它们会是-您将禁用RDBMS的大部分原因…)。如果它抱怨
FROM
子句,请尝试删除单个选定列,直到它消失。我还建议将所有可能的内容都放在
JOIN
s中,而不要放在
WHERE
子句中;在@X-Zero重新排列查询后,保存您的
WHERE
子句,以限制
FROM
(或模拟
EXCEPTION
联接)引用的表。我不再在FROM标记上获得
SQLCeException
。我现在得到一个
SQLCeException
数据转换失败。[OLE DB状态值(如果已知)=0]
。经过一些研究,问题似乎来自于模式不匹配或空值。您列出的异常感觉有点模糊-我会检查所有比较列是否都是相同的数据类型。我重复检查,所有比较列都是相同的数据类型和精度。自最初编写查询以来,已添加了一些列,但未包括这些列。可能是问题的原因吗?不,查询不关心其他列(它无法判断您是否因为不需要这些列而不包括这些列,或者这些列当时不存在)。我们需要一个更具体的例外。。。