我有一个场景,其中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
。基于错误的信息,这个假设是我的错误。尽管如此,这个问题可能有助于帮助那些做出同样错误假设的其他人。
此外,接受的答案提供了处理可选或条件参数的良好机制。
答案 0 :(得分:11)
是的,dapper知道只要看到它就用null
替换引用 - DBNull.Value
。因为DBNull
是我的主要问题,如果我在申请代码中再也看不到它(库代码不同),我会更加快乐。
答案 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