C# 使用DBValue.null将空值插入DateTime字段

C# 使用DBValue.null将空值插入DateTime字段,c#,sql-server,visual-studio,executescalar,C#,Sql Server,Visual Studio,Executescalar,下一个代码给了我一个异常: cmd.CommandText = @"insert Table "; cmd.CommandText += @"(StartTime, EndTime) values(@StartTime, @EndTime) SELECT CAST(scope_identity() AS int)"; cmd.Param

下一个代码给了我一个异常:

cmd.CommandText = @"insert Table ";
cmd.CommandText += @"(StartTime,
                      EndTime)
               values(@StartTime,
                      @EndTime)
                      SELECT CAST(scope_identity() AS int)";
cmd.Parameters.AddWithValue ( "@StartTime", DBNull.Value );
cmd.Parameters.AddWithValue ( "@EndTime", DBNull.Value );
cmd.ExecuteScalar();

我得到的例外是
必须声明'@StartTime'变量
,对于
@EndTime
也必须声明相同的内容。
DBNull.Value
不是用于这样的事情吗,我做错了什么?

我认为原因是您使用的是
AddWithValue
。 您可以看到,
AddWithValue
必须从值(以及元数据,如果存在)推断参数的数据类型。当您使用
DBNull.Value
和内联SQL(与存储过程类似)时,根本无法推断数据类型

AddWithValue
更改为
Add

cmd.Parameters.Add("@StartTime", SqlDbType.DateTime).Value = DBNull.Value;
cmd.Parameters.Add("@EndTime", SqlDbType.DateTime).Value = DBNull.Value

有关详细信息,可选择将

@Igor
读入
。您需要在表中插入
2。
(开始时间
结束时间)
@EndTime)之间没有空格,
选择`@ChetanRanpariya正如Zohar所说,
进入
是可选的。还有,我有这些空格,这只是真实代码的示例,所以这不是问题…我看不出上面的代码会如何抛出异常。您确定引发异常的版本是您在上面发布的编译代码吗?在您的实际代码中是否存在诸如
@StarTime
之类的错误输入单词?尝试使用
Sql Profiler
捕获与发送的参数一起执行的实际准备好的语句,以进行进一步调试。同意Zohar。您的查询是否生成为
“插入表(StartTime,EndTime)值(@StartTime,EndTime)选择强制转换(scope_identity()as int)”
?我在代码的另一部分中也做了同样的事情,它工作得非常好。正如我所说,这两个字段
@StartTime
@EndTime
DateTime
格式的边界。因此,
AddWithValue
适用于除
DateTime
之外的所有其他类型。不知道为什么,如果你阅读了链接中的文章,你会发现使用
AddWithValue
是不好的做法。试一试,如果没有帮助,在这里发表评论,这样我们就知道了。如果确实有用,您应该停止使用
AddWithValue
并接受这个答案。对于字符串值,我更喜欢使用
command.Parameters.Add(新的SqlParameter(“@comments”,SqlDbType.VarChar){value=(comments=”)?(object)DBNull.value:comments})
如果字符串变量
备注
是空字符串,那么这将在您的数据库中放置NULL而不是空的varchar。我个人倾向于至少阅读并尝试具有40k rep的人抛出的答案。通常那些有那么多代表性的人对他们的建议有很好的把握。@niksrb为什么你认为我比你强?我只是在这里呆了一段时间。。。正如我在写给user2366842的信中所说,声誉并不是stackoverflow中唯一需要寻找的东西。在您发布的图像中,您正在将
@startDate
@endDate
添加到另一个命令-您可以执行
cmdrtrbizdayinftin
但使用
参数。在
cmdRtrBizDayInf
上添加
。。。