Asp.net mvc 在mvc实体框架中使用存储过程插入数据时出错

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("@

我犯了个错误

正在将数据类型nvarchar转换为datetime

我哪里做错了

 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 8601
  • 日期格式由用户登录的dateformat设置控制。您可以运行
    dbcc useroptions
    命令查看设置值。对我来说,它被设置为
    mdy
  • 由于您的C#代码发送的日期时间格式(由于您的操作系统)与SQL server可以解析的内容不匹配,因此您面临这个问题

    当您通过
    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我找到了你问题的根本原因。请看我的最新答案。