这个在asp.net中的查询出了什么问题?

时间:2013-05-30 15:05:43

标签: asp.net database

我正在尝试进行以下操作的查询:我的Items数据库中有列,这些列称为Title,AuthorName和ItemType。我想在我的查询中执行以下操作:用户输入AuthorName,Title并从下拉列表中选择ItemType。用户可以将AuthorName或Title框留空。即使他例如没有填写AuthorName部分,如果找到具有指定ItemType的项目并且指定了Title我在结果中显示它。类似地,Title可以留空,在这种情况下,具有指定AuthorName的项目列在结果列表中。这是我的疑问:

SELECT  *
FROM    [Items]
WHERE   ( ( ( [Title] LIKE '%' + @Title + '%' )
            AND ( [ItemType] = @ItemType )
          )
          OR ( ( [AuthorName] LIKE '%' + @AuthorName + '%' )
               AND ( [ItemType] = @ItemType )
             )
        )

但是当AuthorName或Title留空时,找不到任何结果。有人可以帮忙吗?

由于

4 个答案:

答案 0 :(得分:2)

Select ...
From Items
Where ( @Title Is Null Or Title Like '%' + @Title + '%' )
    And ( @AuthorName Is Null Or AuthorName Like '%' + @AuthorName + '%' )
    And ItemType = @ItemType

在ASP.NET中,您应该针对string.IsNullOrEmpty检查表单值,如果为true,则将DBNull.Value发送到参数化查询而不是空字符串。

如果你坚持为参数传递一个空字符串(这不是首选),那么查询需要检查空字符串:

Select ...
From Items
Where ( Len(@Title) = 0 Or Title Like '%' + @Title + '%' )
    And ( Len(@AuthorName) = 0 Or AuthorName Like '%' + @AuthorName + '%' )
    And ItemType = @ItemType

在SQL Server中,Len函数将忽略空格。如果你真的想发疯并在查询中进行所有检查(同样不推荐),那么你会想要将你的参数作为空字符串,所有空格或空值来说明:

Select ...
From Items
Where ( Len(Coalesce(@Title,'')) = 0 Or Title Like '%' + @Title + '%' )
    And ( Len(Coalesce(@AuthorName,'')) = 0 Or AuthorName Like '%' + @AuthorName + '%' )
    And ItemType = @ItemType

答案 1 :(得分:1)

尝试这样的事情:

SELECT  *
FROM    [Items]
WHERE   ([ItemType] = @ItemType)
        AND ([Title] LIKE '%' + @Title + '%' OR @Title IS NULL)
        AND ([AuthorName] LIKE '%' + @AuthorName + '%' OR @AuthorName IS NULL)

NULLAuthorName为空时,请确保传入Title值(System.DBNull.Value)。

<强>更新

假设AuthorNameTitle在“未选中”时作为空字符串传递给您的代码隐藏,您可以执行以下操作(其中authorName和{{1}字符串传递给你的代码隐藏了:

VB:

title

C#:

cmd.Parameters.Add("AuthorName", SqlDbType.VarChar, 50).Value = IIf(authorName.length > 0, authorName, System.DBNull.Value)
cmd.Parameters.Add("Title", SqlDbType.VarChar, 50).Value = IIf(title.length > 0, title, System.DBNull.Value)

答案 2 :(得分:1)

我在code.scottshipp.com的代码博客中写了一篇关于此内容的完整教程。可以完整下载该教程中的代码。它显示了如何将其设置为存储过程,但也详细介绍了如何在查询中构造where子句。所以它涵盖了两个实例。您可能更容易进入存储过程路线,因此您可能想要读取它。

要记住的是,有各种方法可以做到这一点,但有一些“问题”也会使你的代码在某些情况下工作,而不是其他人,如果你使用类似ISNULL函数的东西。

相反,一般来说,我会建议如下:

将以下代码段添加到您希望有时为空白的where子句的任何部分:

    OR SomeParam IS NULL

此外,将括号括在整个事物中是可读的。对于您认为某些参数可能为空的每个参数执行此操作。这意味着,例如,您的select语句将变为:

SELECT  *
FROM    [Items]
WHERE   ( ( ( [Title] LIKE '%' + @Title + '%' OR [Title] IS NULL )
        AND ( [ItemType] = @ItemType OR [ItemType] IS NULL )
      )
      OR ( ( [AuthorName] LIKE '%' + @AuthorName + '%' OR [AuthorName] IS NULL)
           AND ( [ItemType] = @ItemType OR [ItemType] IS NULL )
         )
    )

答案 3 :(得分:1)

请试试这个

  SELECT  *
FROM    [Items]
WHERE   ( ( ( [Title] LIKE CASE WHEN ISNULL(@Title,'')='' THEN [Title] ELSE '%' + @Title + '%' END )
            AND ( [ItemType] = @ItemType )
          )
          OR ( ( [AuthorName] LIKE CASE ISNULL(@AuthorName,'')='' THEN [AuthorName] ELSE '%' + @AuthorName + '%' END)
               AND ( [ItemType] = @ItemType )
             )
        )

这会有所帮助。即使您没有通过Title或Authorname,这也会运行。