2015-03-25 47 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

相关问题