Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Dapper将字符串作为NULL发送到SQLServer?_C#_Sql Server_Dapper - Fatal编程技术网

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

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

我有一个场景,C中的字符串可以
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