Несколько ВНУТРЕННИХ СОЕДИНЕНИЙ SQL Server Compact Edition
Я пытаюсь сделать несколько объединений в одном запросе в SQL Server CE. Я знаю, что SQL Server CE не поддерживает несколько SELECT, но я не могу найти информацию о нескольких INNER JOIN. Я продолжаю получать ошибки токена на ProjectItemMaster
(после ОТ) и первого ВНУТРЕННЕГО СОЕДИНЕНИЯ. Предупреждение, это большой уродливый запрос, используемый для генерации отчетов.
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 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.
1 ответ
По-видимому, SQL Compact не нравится, когда вы задаете параметры запроса, для которых явно не указан тип и длина. Запрос продолжал пытаться преобразовать CustomerID
который был "987654" в цифровом виде. Я понял это, потому что жесткое кодирование значений в запросе заставило его работать нормально, но когда я использовал @CustomerID, программа вызвала ожидание. Таким образом, переключение с параметров.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 за помощь