Asp.net mvc 在mvc实体框架中使用存储过程插入数据时出错
我犯了个错误 正在将数据类型nvarchar转换为datetime 我哪里做错了Asp.net mvc 在mvc实体框架中使用存储过程插入数据时出错,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我犯了个错误 正在将数据类型nvarchar转换为datetime 我哪里做错了 var exec = db.Database.ExecuteSqlCommand("sp_InsertTicketChat @TicketId, @FullName, @Description, @LastCorrespondanceBy,@LastCorrespondanceOn", new SqlParameter("@
var exec = db.Database.ExecuteSqlCommand("sp_InsertTicketChat @TicketId,
@FullName, @Description,
@LastCorrespondanceBy,@LastCorrespondanceOn",
new SqlParameter("@TicketId", TicketId),
new SqlParameter("@FullName", FullName),
new SqlParameter("@Description", Description),
new SqlParameter("@LastCorrespondanceBy", FullName),
new SqlParameter("@LastCorrespondanceOn",
DateTime.Now.ToString())
);
这是我要插入数据的存储过程。我能做什么
INSERT INTO tblTicketChat
(
TicketId,
FullName,
[Description],
LastCorrespondanceOn,
LastCorrespondanceBy
)
VALUES
(
@TicketId,
@FullName,
@Description,
GETDATE(),
@LastCorrespondanceBy)
现在我知道了你所面临问题的根本原因 理想情况下,
DateTime.Now.ToString()
在分配给存储过程的@lastCorrespondenceon
参数时,应该已转换为SQL Server DateTime数据类型,但它引发了异常
原因是操作系统的日期时间格式设置
问题是,在基于C语言的客户端代码中执行DateTime.Now.ToString()
时,它会从操作系统中获取日期时间格式的默认设置。查看“我的windows 10”框中当前设置的日期时间格式:
由于此设置,代码DateTime.Now.ToString()
发出27-07-2017 18:07:37
。您看到的输出是dd-MM-yyyy
格式
现在,根据您的默认语言设置,SQL Server无法识别此日期格式
当从客户端以字符串形式发送时,SQL Server可以识别两种日期时间格式
yyyy-MM-dd
也称为ISO 8601dbcc useroptions
命令查看设置值。对我来说,它被设置为mdy
date.ToString(“yyyy-MM-dd”)显式地进行转换时代码>您只需将其与SQL Server支持的ISO 8601国际日期时间格式对齐,即可开始工作
SQL Server的默认日期时间格式(ISO 8601)是您当前使用的排序规则的配置,您可以按如下所示签入SQL Server实例属性:
强烈建议在以线程中提到的字符串格式传递SQL时,始终使用SQL的日期时间格式
因此,您可以通过三种方式解决问题:
更改操作系统的默认日期格式,使其与SQL Server对齐(不推荐)。在应用程序运行的所有客户端计算机上,这永远都不可行
调用ToString
方法时使用自定义日期格式,就像将其与SQL Server支持的格式之一对齐一样。最好的格式是您使用过的ISO8601格式
不要将其转换为字符串。只需按原样传递日期时间值
var exec = db.Database.ExecuteSqlCommand("sp_InsertTicketChat @TicketId,
@FullName, @Description,
@LastCorrespondanceBy,@LastCorrespondanceOn",
new SqlParameter("@TicketId", TicketId),
new SqlParameter("@FullName", FullName),
new SqlParameter("@Description", Description),
new SqlParameter("@LastCorrespondanceBy", FullName),
new SqlParameter("@LastCorrespondanceOn",
DateTime.Now) //Don't call .ToString here
);
方法3是最好的选择。有关在处理SQL Server日期时间列时不应使用字符串而应使用日期时间数据类型的更多详细信息
我通过做一些改变解决了这个问题
DateTime date = DateTime.Now;
string strDateTime = date.ToString("yyyy-MM-dd");
var exec = db.Database.ExecuteSqlCommand("sp_InsertTicketChat @TicketId, @FullName, @Description, @LastCorrespondanceOn, @LastCorrespondanceBy",
new SqlParameter("@TicketId", TicketId),
new SqlParameter("@FullName", FullName),
new SqlParameter("@Description", Description),
new SqlParameter("@LastCorrespondanceBy", "raza"),
new SqlParameter("@LastCorrespondanceOn", strDateTime)
);
我通过在我的StoredProcess中使用MSSQL字符串格式(dd-MM-yyyy)来解决此问题您需要编辑您的问题以显示存储过程的代码我编辑它请检查。为什么要调用GETDATE(),
并传入日期?因为如果我没有将日期作为错误传递。那么就不要将其作为参数传递。GETDATE正在提供value@razasarwar这不可能是同一个错误-您是否按照上述代码编辑了c#和SP谢谢大家!!我通过在我的StoredProcess中将日期格式化为dd-MM-yyyy解决了此问题。为什么要将lastCorrespondenceon
作为字符串存储在数据库中@Alex我相信@lastCorrespondenceon
仍将保存为datetime
。即使是适当日期时间格式的字符串也会转换为datetime@razasarwar我找到了你问题的根本原因。请看我的最新答案。