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
上添加。。。