【问题标题】:Cannot pass null to stored procedure无法将 null 传递给存储过程
【发布时间】:2014-08-29 18:13:12
【问题描述】:

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

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提示执行得很好.

【问题讨论】:

  • 尝试将employeeId转换为int

标签: c# sql sql-server


【解决方案1】:

您可以传递一个空值,但它必须是一个 DBNull。

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

希望这会有所帮助。

【讨论】:

  • 我其实不确定,但我隐约记得应该是 DBNull.Value。
  • 或者在 NULL 的情况下根本不传递任何东西,让默认值接管
  • 我意识到我忘记发布剩下的问题了,我会调查这个策略并回复你。
  • 好的,我修改了代码以在 id 为 null 的情况下传入 DBNull.Value 并且它让我通过了错误。谢谢!
  • @jokulmorder:如果你觉得这个答案帮助你解决了你的问题,那么请accept this answer。这将表达您对花费自己的时间帮助您的人们的感激之情。
猜你喜欢
  • 2011-02-13
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多