如何使用Dapper将字符串作为NULL发送到SQLServer?

时间:2014-02-07 15:14:26

标签: c# sql-server dapper

我有一个场景,其中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 vs DBNull问题是造成混淆的常见原因;但是,通常如果人们在C#中说null他们在SQL中打算null。这是小巧玲珑采用的方法。

这让我相信,当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#中NULL可以string,我怎样才能使用Dapper将null发送到SQLServer?


重要

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

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

2 个答案:

答案 0 :(得分:11)

是的,dapper知道只要看到它就用null替换引用 - DBNull.Value。因为DBNull是我的主要问题,如果我在申请代码中再也看不到它(库代码不同),我会更加快乐。

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

答案 1 :(得分:4)

您可以选择不发送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