2017-07-27 40 views
-1

存储过程中插入数据我发现了一个错误获得一个错误,同时使用在MVC实体框架

数据类型为nvarchar转换成日期时间。

如果我做了错误?

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) 
+0

您需要修改的问题,以显示存储过程 – Alex

+0

的代码,我编辑查收。 –

+0

你为什么要调用'GETDATE(),'并传入一个日期? – Alex

回答

0

现在我得到了您面临的问题的根本原因。

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

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

的事情是,当你在你的C#语言基于客户端代码执行DateTime.Now.ToString()它从操作系统需要时间日期格式的默认设置。看看目前在我的Windows设置10中的日期时间格式:

enter image description here

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

现在这个dd-MM-yyyy日期格式不是由SQL Server按照您的默认语言设置识别。当作为字符串从客户端

  1. 国际日期格式yyyy-MM-dd也被称为ISO 8601发送

    SQL Server可以识别两个日期时间格式。

  2. 日期格式由用户登录的日期格式设置控制。您可以运行dbcc useroptions命令查看设置的值。对我来说,它被设置为mdy

由于这种不匹配的日期时间格式的(因为你的操作系统)的C#代码和SQL什么服务器发送可以解析,你所面临的问题。

当您date.ToString("yyyy-MM-dd");你只需对准它的ISO SQL Server支持所以它开始8601国际日期时间格式的工作做了明确的转换。

默认的日期时间格式(ISO 8601)的SQL Server是您正在使用目前,你可以在你的SQL Server实例属性中查看整理的配置如下图所示:

enter image description here

它强烈建议您在按照this线程中所述的字符串格式传递时始终使用SQL的日期时间格式。

所以,你可以在三个方面解决问题:

  1. 更改您的OS的默认日期格式,将其调整到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是最好的交易。更多细节here至于为什么你不应该使用字符串,而是在处理SQL Server日期时间列时使用日期时间数据类型。

+0

仍然是同样的错误。 –

+0

@razasarwar它不能是相同的错误 - 你有编辑BOTH C#和SP按照上述代码 – Alex

+0

是的!我改变了两个但仍然是相同的错误。 –

-1

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

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) 
       ); 
+0

你为什么要把'LastCorrespondanceOn'作为一个字符串存储在db!中? – Alex

+0

@Alex我相信'@ LastCorrespondanceOn'仍然会保存为'datetime'。即使是适当的日期时间格式的字符串也会转换为日期时间 – RBT

+0

@razasarwar我得到了问题的根源。请看我更新的答案。 – RBT

0

我用我的StoredProcedure的格式(DD-MM-YYYY)MSSQL字符串解决这个问题