无法将null传递给存储过程

时间:2014-07-08 20:57:44

标签: c# sql sql-server

我正在尝试执行这样定义的存储过程:

PROCEDURE [dbo].[SearchEmployees]
    @employeeId INT = NULL,
    @userName VARCHAR(50) = NULL,
    @firstName VARCHAR(50) = NULL,
    @lastName VARCHAR(50) = NULL

...
SELECT *
FROM Employee e
WHERE e.EmployeeId = @employeeId
    OR e.UserName LIKE(@userName)
    OR e.FirstName LIKE(@firstName)
    OR e.LastName LIKE(@lastName)

我从这样的代码中调用它:

//employeeId = null, userName = "b.evans", firstName = "Bob", lastName = "Evans"
...
command.Parameters.AddWithValue("@employeeId", employeeId);
command.Parameters.AddWithValue("@userName", userName);
command.Parameters.AddWithValue("@firstName", firstName);
command.Parameters.AddWithValue("@lastName", lastName);
try
{
    connection.Open();
    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            results.Add(mapper.Map(reader));
        }
    }
}
finally
{
    connection.Close();
}

但是我收到了这个错误:

  

参数化查询'(@ employeeId nvarchar(4000),@ userName nvarchar(7),@ firstName nva'需要参数'@employeeId',这是未提供的。

如果员工ID为空,为什么数据库会关心?

编辑:

我忘了提到一个非常重要的细节:即使填充了@employeeId,在这种情况下,让我们说值为54,它会抛出同样的抱怨,但它会执行得很好通过SQL提示符。

1 个答案:

答案 0 :(得分:6)

您可以传递null,但它必须是DBNull。

command.Parameters.AddWithValue("@employeeId", employeeId ?? DBNull.Value);

希望这有帮助。