2013-04-05 37 views
0

我試圖在vb.net中執行此選擇查詢,但它引發了給定值爲一個或多個必需參數的錯誤。我不斷重新檢查我的代碼,但看不到有什麼問題。沒有賦予一個或多個必需參數的值,使用子選擇查詢

SELECT語句中使用DailyDelivery表,其中roundID = selectedID

Command.CommandText = 
"SELECT customerid, 
     productid, 
     quantity, 
     (SELECT houseno 
     FROM customer 
     WHERE customer.customerid = dailydelivery.customerid) AS HouseNo, 
     (SELECT housename 
     FROM customer 
     WHERE customer.customerid = dailydelivery.customerid) AS HouseName, 
     (SELECT street 
     FROM customer 
     WHERE customer.customerid = dailydelivery.customerid) AS Street, 
     (SELECT sequenceno 
     FROM customer 
     WHERE customer.customerid = dailydelivery.customerid) AS SequenceNo, 
     (SELECT roundid 
     FROM customer 
     WHERE customer.customerid = dailydelivery.customerid) AS RoundID, 
     (SELECT productname 
     FROM product 
     WHERE product.productid = dailydelivery.productid) AS ProductName 
FROM dailydelivery 
WHERE issuedate = @TodaysDate 
     AND roundid = @SelectedID 
ORDER BY sequenceno, 
      street, 
      houseno, 
      housename" 

'Add parameter for command (TodaysDate being today's date) 
    `Command.Parameters.AddWithValue("@TodaysDate", Today.Date)` 

'Add parameter for command (SelectedID being the current roundID) 
    `Command.Parameters.AddWithValue("@SelectedID", SelectedID)` 

在此之後,命令使用數據適配器來填充表叫拉的HouseNo,housename,街道,產品名稱,sequenceno和數量在數據集中。

'Open connection to the database 
dbConnection.Open() 

'Set command's connection as dbconnection 
Command.Connection = dbConnection 

'Set the data adapter's select command as command 
DataAdpt.SelectCommand = Command 

'Fill ActualDelivery table in selectedDataset with the results of query, using the data adapter 
DataAdpt.Fill(SelectedDataset, "ActualDelivery") 

'Close connection to the database 
dbConnection.Close() 

錯誤發生在DataAdapt.Fill行。我正在使用VB Express 2008和Access 2013.

+0

我覺得很難相信Access 2013的SQL不支持'JOIN' - 哦,[它](http://msdn.microsoft.com/en-us/library/office/ff197346。 aspx) - 你可以在其他任何事情之前大大簡化這個查詢。 – 2013-04-05 14:22:53

+0

什麼類型的命令對象是'Command'?你能爲此展示宣言/作業嗎? – 2013-04-05 14:29:17

+0

'Command'在模塊中使用'Public Command As New OleDb.OleDbCommand'進行聲明 – Jamie 2013-04-05 14:32:58

回答

0

也許我錯了,但我無法測試查詢。 我想你可以使用JOIN

"SELECT d.customerid, d.productid, d.quantity, c.HouseNo, c.HouseName, " + 
"c.Street, c.SequenceNo, c.RoundID, p.ProductName " + 
"FROM (customer AS c INNER JOIN dailydelivery AS d ON c.customerid = d.customerid) " + 
"INNER JOIN product AS p ON p.productid = d.productid " + 
"WHERE d.issuedate = @TodaysDate AND c.roundid = @SelectedID " + 
"ORDER BY c.sequenceno, c.street, c.houseno, c.housename" 

在查詢再次尋找重構該查詢。您是否在dailydelivery表上有一個名爲roundid的字段?或者是客戶表的roundid?現在您需要在dailydelivery表上有該字段,否則它將被解釋爲參數的名稱

+0

roundID現在位於客戶表 – Jamie 2013-04-05 15:31:17

+0

因此,讓我們更改上面的查詢並嘗試一下。 (順便嘗試在Access中) – Steve 2013-04-05 15:35:27

+0

我在JOIN上收到語法錯誤,我很抱歉,我之前沒有使用JOIN ... – Jamie 2013-04-05 15:43:10

0

您只需使用?問號指定參數,並確保將參數添加到Parameters以正確順序收集。或者僅僅引用文檔:

的OLE DB .NET提供程序不支持命名參數,將參數傳遞到SQL語句或由調用時CommandType設置爲文本的存儲過程。在這種情況下,必須使用問號(?)佔位符。例如:

SELECT * FROM Customers WHERE CustomerID = ? 

因此,在這種OleDbParameter對象添加到OleDbParameterCollection的順序必須直接對應於問號佔位符在命令文本的參數的位置。

相關問題