【发布时间】: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