我有一个表名学生(studentId,StudentName,Address,PhoneNo)
我提供了一个过滤器供用户从Combobox中仅选择StudentId以获取学生的详细信息...并生成报告。
我写了以下查询来获取学生详细信息:
(select * from Students where StudentId = stdId)
这里stdId是我从代码
传递的参数如果我选择单个studentId,它可以正常工作....但是在用户选择Comobobox中我还提供了"ALL"
如果用户从组合框中选择All
我想要显示所有学生的详细信息
那么如果用户选择stdId
,我应该在All
传递什么?
我在C#中使用了内联查询(不使用SQL存储过程)
答案 0 :(得分:6)
如果用户选择全部,请将NULL
传递给@StudentId
并将您的查询更改为:
select *
from Students
where (StudentId=@StudentId OR @StudentId IS NULL)
答案 1 :(得分:6)
你可以这样做。
SELECT * from Students s
WHERE s.studentId = ISNULL(@StudentId,s.studentId)
当"所有"在组合框中选择@studentid参数中的传递null。如果你不能在参数中传递null然后传递-1或你的combox选项中不能包含的任何东西,并按照这样做:(如果-1 =全部)
SELECT * from Students s
WHERE s.studentId = @StudentId or @StudentId=-1
您也可以尝试Curt给出的答案。
答案 2 :(得分:4)
在存储过程标头中,更改@StudentId的定义,以便它可以作为NULL传递。
ALTER PROCEDURE dbo.WhateverYourProcedureIsCalled( @StudentId int = null )
然后按如下所示更改WHERE子句
...
SELECT * from Students
WHERE @StudentId IS NULL OR StudentId = @StudentId
从代码中,如果传递了ALL,则可以省略设置@StudentId参数值的部分。如果未传递,SQL Server将使用默认值。
答案 3 :(得分:1)
如果查询中包含where子句,您还需要提供有效的参数值,因此当包含where子句时,不可能让所有学生都接受。
您需要根据组合框中选择的值来区分查询。您可以执行以下操作。
int studentId = 0;
//Where selectedValue comes from your combobox
Int32.TryParse(selectedValue, out studentId);
var query = "select * from Students";
if (studentId > 0)
{
query = query + " where StudentId = @StudentId";
//Remember to add studentId as parameter value
}