C# 带有可为空的datetime参数的InRect语法

C# 带有可为空的datetime参数的InRect语法,c#,C#,我有一个查询,它验证了Date,即DateTime。这可以是带值的,也可以是空的。 我添加了如下所示的参数。然而,当试图添加到我的查询where子句时,我得到了异常 Parameters.Add(Context.CreateParameter("@VerifiedDate", 30, (object) Car.VerifiedDate ?? DBNull.Value, DbType.DateTime)); queryWhereClause = " AND VerifiedDate=@Verif

我有一个查询,它验证了Date,即DateTime。这可以是带值的,也可以是空的。 我添加了如下所示的参数。然而,当试图添加到我的查询where子句时,我得到了异常

Parameters.Add(Context.CreateParameter("@VerifiedDate", 30, (object) Car.VerifiedDate ?? DBNull.Value, DbType.DateTime));

queryWhereClause = " AND VerifiedDate=@VerifiedDate";
例外情况:

System.Data.SqlClient.SqlException: 'Incorrect syntax near '='.'
最终,SQL Server(在符合ANSI标准的模式下)需要不同的语法进行空匹配。坦率地说,就你的情况而言,我会:

if(Car.VerifiedDate.HasValue)
{
Parameters.Add(Context.CreateParameter(“@VerifiedDate”,30,Car.VerifiedDate.Value,DbType.DateTime));
queryWhereClause=“AND VerifiedDate=@VerifiedDate”;
}
其他的
{
queryWhereClause=“且验证日期为空”;
}
但是,您也可以执行以下操作:

AND(VerifiedDate=@VerifiedDate或(VerifiedDate为NULL且@VerifiedDate为NULL))
使用第一种方法,服务器通常工作得更好,因为它的条件和分支更少,如果存在索引,它可以最有效地利用索引。

最终,SQL server(在符合ANSI标准的模式下)需要不同的语法进行空值匹配。坦率地说,就你的情况而言,我会:

if(Car.VerifiedDate.HasValue)
{
Parameters.Add(Context.CreateParameter(“@VerifiedDate”,30,Car.VerifiedDate.Value,DbType.DateTime));
queryWhereClause=“AND VerifiedDate=@VerifiedDate”;
}
其他的
{
queryWhereClause=“且验证日期为空”;
}
但是,您也可以执行以下操作:

AND(VerifiedDate=@VerifiedDate或(VerifiedDate为NULL且@VerifiedDate为NULL))

使用第一种方法,服务器通常会工作得更好,因为它的条件和分支更少,并且如果存在索引,它可以最有效地使用。

我相信sqlexception有一个sql组件,因此您可以看到结果sql,您可以发布吗?(或其应位于其他位置)从MyTable中选择*,其中VerifiedDate=@VerifiedDate@sommmen很抱歉,这是我在WHERE中的错误,但是我没有得到两行,而是得到了0,我假设它是因为它在查询中应该为NULL,而不是=但是如何说何时有一个值put=以及何时dbnull在查询中为NULL?因为现在我假设当我的值为NULL时,它会像这样显示:VerifiedDate=NULLWell我主要使用EF,所以我只做了几次,如果Car.VerifiedData在代码中为NULL,你就不能在查询的其余部分添加QueryWhere子句字符串吗?@Arie:你的意思是这样吗?:
从MyTable中选择*,其中VerifiedDate=ISNULL(@VerifiedDate,VerifiedDate)
或者您希望如何使用参数?我相信sqlexception有一个sql组件,因此您可以看到结果sql,您可以发布它吗?(或者它应该在其他地方)从验证日期所在的MyTable中选择*=@VerifiedDate@sommmen很抱歉,这是我在WHERE中的错误,但是我没有得到两行,而是得到了0,我假设它是因为它在查询中应该是NULL,而不是=但是如何说什么时候有一个值put=以及何时dbnull在查询中是NULL?因为现在我假设当我的值为NULL时,它会像:VerifiedDate=NULLWell我主要使用EF,所以我只做了几次,如果Car.VerifiedData在代码中为null,您就不能在查询的其余部分添加querywhere子句字符串吗?@Arie:您的意思是这样吗?:
SELECT*FROM MyTable,其中VerifiedDate=ISNULL(@VerifiedDate,VerifiedDate)
或者您希望如何使用该参数?这更像我在上面的注释中写的:)这应该可以工作。第一种方法这更像我在上面的评论中写的:)这应该行得通。第一种方法