多个内部联接SQL Server Compact Edition
我正在尝试在SQLServerCE中的单个查询中执行多个联接。我知道SQL Server CE不支持多个选择,但我找不到有关多个内部联接的任何信息。我在多个内部联接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
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]
。经过一些研究,问题似乎来自于模式不匹配或空值。您列出的异常感觉有点模糊-我会检查所有比较列是否都是相同的数据类型。我重复检查,所有比较列都是相同的数据类型和精度。自最初编写查询以来,已添加了一些列,但未包括这些列。可能是问题的原因吗?不,查询不关心其他列(它无法判断您是否因为不需要这些列而不包括这些列,或者这些列当时不存在)。我们需要一个更具体的例外。。。