空字符串参数的System.Data.SqlTypes.SqlNullValueException

时间:2016-06-15 23:38:30

标签: c# sql

在我的查询中就是这一行

//query...
"AND (@4 = '' OR (p.FirstName + p.LastName LIKE '%' + @4 + '%') OR (eup.FirstName + eup.LastName LIKE '%' + @4 + '%')) " +
//more query...

这给了我一个Data is null例外。 Param @4即将""。当我把它改成

"AND (@4 IS NULL OR (p.FirstName + p.LastName LIKE '%' + @4 + '%') OR (eup.FirstName + eup.LastName LIKE '%' + @4 + '%')) " +

它不返回任何表中没有名字或姓氏的记录。

我该如何解决这个问题?如果param 4为空,我想返回所有记录,无论现有名称是否存在。

2 个答案:

答案 0 :(得分:1)

除非参数@4包含没有空格的第一个和最后一个名字,否则我怀疑您正在查找与@4匹配的任何名字或姓氏,如果@4为空然后返回一切。

AND (p.FirstName LIKE '%' ISNULL(@4,'') + '%'
    OR p.LastName LIKE '%' ISNULL(@4,'') + '%'
    OR eup.FirstName LIKE '%' ISNULL(@4,'') + '%'
    OR eup.LastName LIKE '%' ISNULL(@4,'') + '%'
    )

通过使用ISNULL(@4,''),它实际上会将您的名字和姓氏转换为完整的通配符搜索并返回所有内容,因为它仍会包含'%'之前和之后。我可能会建议改变这一点,只需要拥有'%'之后您可能会得到更适合人们查找的结果,但这取决于您。

p.FirstName + p.LastName LIKE的主要问题是Bob Smith将成为BOBSMITH LIKE ....虽然我认为如果您坚持使用% search string %,它仍然会返回您的结果这会导致您将@4切换为ISNULL(@4,'')并摆脱第一个@4 = ''

答案 1 :(得分:1)

我猜你的评论“两个表中都没有名字或姓氏”表示这些字段可以为空。
如果任何值为null,那么执行p.FirstName + p.Lastname之类的任何操作都会给出null结果,这反过来会导致谓词导致false。 此外,我个人不会在任何时候连接这两个字段,因为你的LIKE谓词可以匹配firstname末尾的字符和lastnmame的开头。

理想情况下,你将字段设置为NOT NULL,然后执行此操作..

"AND (@4 IS NULL 
  OR p.FirstName LIKE '%' + @4 +'%' 
  OR p.LastName LIKE '%' + @4 + '%'
  OR eup.FirstName LIKE '%' + @4 +'%'
  OR eup.LastName LIKE '%' + @4 + '%')) " +

如果字段必须保持可为空,请执行此操作。

"AND (@4 IS NULL 
  OR coalesce(p.FirstName,'') LIKE '%' + @4 +'%' 
  OR coalesce(p.LastName,'') LIKE '%' + @4 + '%'
  OR coalesce(eup.FirstName,'') LIKE '%' + @4 +'%'
  OR coalesce(eup.LastName,'') LIKE '%' + @4 + '%')) " +

这些 - 或者您的版本 - 都不会受益于对字段的索引,因此在大型表格上表现可能会很糟糕。