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

时间:2017-07-27 09:45:10

标签: asp.net-mvc entity-framework

我收到错误

  

将数据类型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)

3 个答案:

答案 0 :(得分:0)

现在我找到了你所遇到的问题的根本原因。

理想情况下,DateTime.Now.ToString()在分配给存储过程的@LastCorrespondanceOn参数时应该已转换为SQL Server Datetime数据类型,但它会引发异常。

原因是操作系统的日期时间格式设置。

当您在基于C#语言的客户端代码中执行DateTime.Now.ToString()时,它会从您的操作系统中获取日期时间格式的默认设置。查看当前在我的Windows 10框中设置的日期时间格式:

enter image description here

由于此设置,代码DateTime.Now.ToString()会发出27-07-2017 18:07:37。您看到的输出格式为dd-MM-yyyy

现在,SQL Server无法根据您的默认语言设置识别此dd-MM-yyyy日期格式。

当从客户端

作为字符串发送时,SQL Server可以识别两种日期时间格式
  1. 国际日期格式yyyy-MM-dd也称为ISO 8601。
  2. 日期格式由用户登录的dateformat设置控制。您可以运行dbcc useroptions命令来查看设置的值。对我而言,它设置为mdy
  3. 由于C#代码发送的日期时间格式不匹配(因为您的操作系统)以及SQL服务器可以解析的内容,因此您遇到了问题。

    当您date.ToString("yyyy-MM-dd");显式执行转换时,您只需将其与SQL Server支持的ISO 8601国际日期时间格式对齐,即可开始工作。

    SQL Server的默认日期时间格式(ISO 8601)是您当前使用的排序规则的配置,您可以在其中检入SQL Server实例属性,如下所示:

    enter image description here

    强烈建议您在this主题中提到的字符串格式传递SQL时​​,应始终使用SQL的日期时间格式。

    因此,您可以通过三种方式解决问题:

    1. 更改操作系统的默认日期格式,使其与SQL Server对齐(不推荐)。在运行应用程序的所有客户端计算机上永远不可行。
    2. 在调用ToString方法时使用自定义日期格式,因为您已将其与SQL Server支持的格式之一对齐。最佳格式是您使用的ISO 8601格式。
    3. 不要将其转换为字符串。只需按原样传递日期时间值。

      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日期时间列时不应使用字符串而是使用日期时间数据类型的更多详细信息here

答案 1 :(得分:0)

我通过在storedprocedure中使用MSSQL字符串格式化(dd-MM-yyyy)解决了这个问题

答案 2 :(得分:-1)

我通过做一些更改解决了这个问题。

<form>