C# 如何使用Dapper将字符串作为NULL发送到SQLServer?
我有一个场景,C中的字符串可以C# 如何使用Dapper将字符串作为NULL发送到SQLServer?,c#,sql-server,dapper,C#,Sql Server,Dapper,我有一个场景,C中的字符串可以null。我需要它在SQLServer上为NULL 我使用Dapper将其发送到SQLServer,并使用如下查询: connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), new { StartDate: startDate }, commandType: CommandType.StoredProcedure); 当它为NULL时,它返回所有记录。我已通过S
null
。我需要它在SQLServer上为NULL
我使用Dapper将其发送到SQLServer,并使用如下查询:
connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), new
{
StartDate: startDate
}, commandType: CommandType.StoredProcedure);
当它为NULL
时,它返回所有记录。我已通过SSMS确认此行为有效
我读到Marc Gravell的文章说:
null vs DBNull问题一直是引起混淆的原因;然而,一般来说,如果人们在C#中说null
,那么他们打算在SQL中说null
。这是dapper采用的方法
这使我相信当字符串设置为null
时,它应该将DBNull.Value
发送到SQLServer
然而,情况似乎并非如此。当发送null
字符串时,我从SQLServer返回0条记录。这似乎表明发送了一个空字符串,而不是DBNull.Value
此外,我不能直接发送DBNull.Value
:
connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), new
{
StartDate: DBNull.Value
}, commandType: CommandType.StoredProcedure);
connection.Query(“[dbo].[sp_mystoredprocesdure]”),新建
{
StartDate:DBNull.Value
},commandType:commandType.StoredProcess);
这会在Dapper中产生一个异常:
System.DBNull类型的成员StartDate不能用作参数值
问题:
当我有一个C语言中的字符串可以是NULL
时,如何使用Dapper将NULL
发送到SQLServer
重要的
当字符串为NULL
时,Dapper确实发送NULL
。基于错误的信息,我的这一假设是错误的。尽管如此,这个问题可能有助于其他做出同样错误假设的人
此外,接受的答案为处理可选或条件参数提供了良好的机制。您可以选择不发送StartDate
例如:
dynamic parameters = new {
};
if (!string.IsNullOrWhiteSpace(startDate))
{
parameters.StartDate = startDate;
}
connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), parameters, commandType: CommandType.StoredProcedure);
是的,dapper知道,只要看到引用-null
,就会用DBNull.Value
替换它。因为DBNull
是我的死敌,如果我再也没有在我的应用程序代码中看到它(库代码不同),我会死得更快乐一些
另请参见:为什么否决?+1。在我看来,这个问题对SO来说很有道理。不要担心否决票,我想有人在过一个糟糕的星期五。@crush,链接上写着,所以我必须将代码改为:if(contact.IsActive.HasValue)p.Add(“@IsActive”,contact.IsActive.Value);因此,我必须将代码更改为:if(contact.IsActive.HasValue)p.Add(“@IsActive”,contact.IsActive.Value);因此,只有当参数有值时,它才会添加该参数。
因此,只有当参数有值时,才需要添加该参数value@crush,这是一个很好的问题,我想请您留下它,而不是删除它,这可能会对未来的访问者有所帮助。你可以添加你自己的答案,指出错误。这是一个很好的答案,但我的问题是基于不正确的信息。当string
为空时,Dapper确实发送NULL
。尽管如此,这是解决我的问题的一个很好的方法,我可能会用它。谢谢你的回答!非常同意,这是一个很好的答案。早些时候发现的。感谢您在Dapper上的出色工作。这是天赐之物
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