Reputation: 1414
I am trying to do multiple joins within a single query in SQL Server CE. I know that SQL Server CE doesn't support multiple SELECTs but I can't find any information on multiple INNER JOINs. I keep getting token errors on ProjectItemMaster
(after the FROM) and the first INNER JOIN. Warning this is a big ugly query used to generate reports.
GetCutSheetDataByCustPnumTagQuery
as defined as:
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)
This is the function that Is executing the Query in VB.NET on the SQL Compact Database.
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
If I can't uses multiple INNER JOINs I can I break the query down into a number of different queries but I would prefer not to. So it is easier to maintain a SQL Server CE and an SQL Server version of the program.
Upvotes: 1
Views: 3956
Reputation: 1414
Apparently SQL Compact doesn't like it when you give Query parameters that do not have their type and length explicitly stated. The query kept trying to convert the CustomerID
which was "987654" to a numeric. I figured this out because hard coding the values into the query made it run fine but when I used @CustomerID the program threw an expection. So switching from parameters.addwithvalue(Name, Value) to Parameters.add(Name, Type, Length) solved the problems.
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
Thank you @X-Zero for your help
Upvotes: 2