DropDownList value =“”没有从数据库中检索

时间:2012-02-09 14:58:13

标签: asp.net sql

我有一个包含以下选项的下拉列表:

                                    <asp:DropDownList ID="ddlTaxStatus" runat="server" OnPreRender="ddlContainerStatus_PreRender">
                                    <asp:ListItem Text="--Select--" Value="-1"></asp:ListItem>
                                    <asp:ListItem Value="" Text="'' - Not closed"></asp:ListItem>
                                    <asp:ListItem Value="R" Text="R - Ready to pay"></asp:ListItem>
                                    <asp:ListItem Value="X" Text="X - Paid"></asp:ListItem>
                                    <asp:ListItem Value="C" Text="C - Cancel"></asp:ListItem>
                                    <asp:ListItem Value="O" Text="O - Original"></asp:ListItem>
                                    <asp:ListItem Value="D" Text="D - Delete"></asp:ListItem>
                                </asp:DropDownList>

根据用户选择的选项,我在我的数据库中发送所选的搜索选项,并检索在相关字段中具有所选值的记录。我的Sql usp看起来像这样:

 ALTER PROCEDURE [dbo].[uspGetContainerSummaryRecordsForSearch] (
      @fkJobID varchar(8),
      @csmTaxStatus varchar(3)
 )
AS
  BEGIN
      SET TRANSACTION ISOLATION LEVEL SNAPSHOT
      SET NOCOUNT ON;

            SELECT fkJobID,
                      csmContainerID,
                      csmDisplayContainerID,
                      csmTaxStatus

               FROM   ContainerSummaryRecord
               where  fkJobID = @fkJobID
                      AND ( @csmTaxStatus IS NULL
                             OR csmTaxStatus = @csmTaxStatus )

  END 

现在我的问题是,当用户选择Value =“”和Text =“'' - 未关闭”的选项时,我没有得到所需的结果。这是因为value =“”实际上在DB中存储为null。 在查询中我比较where子句中的输入参数,如@csmTaxStatus IS NULL 因为如果用户没有选择含义Text =“ - Select--”Value =“ - 1”的任何选项,则不应用过滤器并返回所有结果(这是此选项的所需行为)。但这与在数据库中存储为null的Value =“”发生冲突。请帮助。

2 个答案:

答案 0 :(得分:1)

将条件更改为

只需使用isnull()即可轻松解决问题,将空格替换为空白,如下所示

where  fkJobID = @fkJobID                       
AND ( @csmTaxStatus IS NULL                              
     OR isnull(csmTaxStatus,'') = @csmTaxStatus ) 

答案 1 :(得分:0)

有几种方法可以解决这个问题,但您可以更改SQL语句以处理csmTaxStatus中的NULL并将其转换为空字符串。如果您将@csmTaxStatus作为空字符串传递,那么您可以使用ISNULL。

ISNULL( csmTaxStatus, '' ) = @csmTaxStatus 

完整的SQL语句

SELECT fkJobID,
    csmContainerID,
    csmDisplayContainerID,
    csmTaxStatus
FROM   
    ContainerSummaryRecord
WHERE
    fkJobID = @fkJobID
    AND ISNULL( csmTaxStatus, '' ) = @csmTaxStatus