2015-03-25 68 views
0

我有一個查詢:爲什麼ASP.NET不會執行SQL Server Management Studio所執行的查詢?

SELECT BookID, BookName, Author, Price, PublishYear, b.categoryName AS Category 
FROM BOOKS a JOIN category b ON a.categoryID = b.categoryID 
WHERE b.categoryID = @category 
ORDER BY a.BookID 

隨着@category = myDropDownList.SelectedValue.ToString(); 我有時也想顯示不同類別的一些書,有時我想在所有類別中顯示所有圖書。當我嘗試在1類別中顯示時,它確實執行查詢,但是當我嘗試顯示所有內容時,我嘗試給@category一個等於「b.categoryID」的值(它也來自DropDownList),現在我的查詢是:

SELECT BookID, BookName, Author, Price, PublishYear, b.categoryName AS Category 
FROM BOOKS a JOIN category b ON a.categoryID = b.categoryID 
WHERE b.categoryID = b.categoryID 
ORDER BY a.BookID 

我試着在SSMS中運行這個查詢,它執行。但在ASP.NET中,它沒有。任何人都有解決方案嗎?

回答

1

這是因爲你沒有得到你認爲你得到的查詢。 您實際從ASP.Net獲得的條件是WHERE b.categoryID = 'b.categoryID'。顯然這不會正確執行。

試試這個:

SELECT BookID, BookName, Author, Price, PublishYear, b.categoryName AS Category 
FROM BOOKS a JOIN category b ON a.categoryID = b.categoryID 
WHERE b.categoryID = 
    CASE WHEN @category = 'b.categoryID' 
     THEN b.categoryID 
     ELSE @category 
    END 
ORDER BY a.BookID 
0

的問題是,如果你設置@category字符串「b.categoryID」,那麼它會導致類似Where b.categoryID = 'b.categoryID'查詢。基本上你不能通過參數傳遞列或表的名字。相反,您可以使查詢動態。

string query = "SELECT BookID, BookName, Author, Price, PublishYear, b.categoryName AS Category " + 
       "FROM BOOKS a JOIN category b ON a.categoryID = b.categoryID " + 
       (filter ? "WHERE b.categoryID = @category " : "") + 
       "ORDER BY a.BookID"; 

filterbool變量,確定是否要包括where子句。您還應該在代碼周圍放置if(filter),該代碼創建並將@category參數添加到SqlCommand

+0

您假定select語句是c#代碼的一部分。 雖然你的解決方案將工作,如果是這樣的話,OP沒有指定,它可能是它是一個存儲過程,C#只是執行。我的解決方案適用於這兩種情況。 – 2015-03-25 11:55:28

相關問題