【问题标题】:How can I send a string as NULL to SQLServer using Dapper?如何使用 Dapper 将字符串作为 NULL 发送到 SQLServer?
【发布时间】:2014-02-07 15:14:26
【问题描述】:

我有一个场景,C# 中的字符串可以是null。我需要它是 SQLServer 上的 NULL

我使用 Dapper 将其发送到 SQLServer,查询如下:

connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), new
{
    StartDate: startDate
}, commandType: CommandType.StoredProcedure);

其中startDate 是有时可以等于null 的字符串。

存储过程的参数是

@StartDate varchar(10) = NULL

当它是NULL 时,它返回所有记录。我已通过 SSMS 确认此行为有效。

我读到 Marc Gravell 的 this post 指出:

null 与 DBNull 问题一直是令人困惑的原因;但是,通常如果人们在 C# 中说 null,他们打算在 SQL 中使用 null。这是 dapper 采用的方法。

这让我相信当string 设置为null 时,它应该将DBNull.Value 发送到SQLServer。

但是,情况似乎并非如此。发送null 字符串时,我从SQLServer 取回0 条记录。这似乎表明发送的是空字符串,而不是DBNull.Value

另外,我不能直接发送DBNull.Value

connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), new
{
    StartDate: DBNull.Value
}, commandType: CommandType.StoredProcedure);

这会在 Dapper 中产生异常:

System.DBNull 类型的成员 StartDate 不能用作参数值

问题

当我在 C# 中有一个 string 可以是 null 时,如何使用 Dapper 将 NULL 发送到 SQLServer?


重要

当字符串为null 时,Dapper 确实会发送NULL。这个假设是我基于错误信息的错误。尽管如此,这个问题可能有助于其他做出同样错误假设的人。

此外,接受的答案为处理可选或条件参数提供了一个很好的机制。

【问题讨论】:

  • +1。在我看来,这个问题对 SO 非常有效。
  • +1。不用担心投反对票,我猜有人星期五过得不好。
  • @crush,链接上写着So I have to change my code to: if (contact.IsActive.HasValue) p.Add("@isActive",contact.IsActive.Value); So I have to change my code to: if (contact.IsActive.HasValue) p.Add("@isActive",contact.IsActive.Value); So that it only adds the parameter if it has a value.,所以只有当它有价值时才需要添加
  • 我需要删除这个问题。根据创建存储过程的 dba 提供给我的错误信息,我做出了不正确的假设。 /sigh 事实上,Dapper 正在发送NULL。有缺陷的是存储过程的逻辑。很遗憾我不能依赖 dba,不得不自己摸索找出缺陷。
  • @crush,这是一个很好的问题,我会要求您留下它而不是删除它,这可能对未来的访问者有所帮助。您可以添加自己的答案指出错误。

标签: c# sql-server dapper


【解决方案1】:

是的,dapper 知道只要看到它就会用DBNull.Value 替换reference-null。因为DBNull 是我的宿敌,如果我再也不会在我的应用程序代码中看到它(库代码不同),我会更快乐地死去。

另请参阅:https://stackoverflow.com/a/9632050/23354

【讨论】:

  • 不能再同意了,这是一个很好的答案。早发现了。感谢 Dapper 的出色工作。这是天赐之物
【解决方案2】:

您可以选择不发送 StartDate。

例子:

dynamic parameters = new {

};

if (!string.IsNullOrWhiteSpace(startDate)) 
{
   parameters.StartDate = startDate;
}

connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), parameters, commandType: CommandType.StoredProcedure);

编辑:

此外,您的存储过程必须接受空值。这是一个例子:

CREATE PROCEDURE [ExampleProc]
   @StartDate datetime = null
AS
   Select @StartDate

【讨论】:

  • 这是一个很好的答案,但我的问题是基于不正确的信息。 string 为空时,Dapper 确实发送NULL 尽管如此,这是解决我的问题的好方法,而且我可能还是会使用它。感谢您的回答!
猜你喜欢
  • 2012-08-10
  • 2022-07-16
  • 2015-04-18
  • 2020-11-29
  • 2011-08-19
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
相关资源
最近更新 更多