DateTime以错误的格式发送到Sql Server 2014

时间:2015-06-10 12:12:53

标签: c# sql-server datetime sql-server-2014

我想在sql server 2014上执行存储过程.sql server是用德语设置的,用于连接sql server的用户也将German配置为语言。如果我尝试执行sql过程或原始sql,我总是得到错误

  

varchar无法转换为日期时间

即使我提供德国日期时间值。我发现如果我使用命令SET DATEFORMAT dmy预先添加sql文本,它就可以工作。

ADO .NET和Entity框架的问题是相同的。将线程和ui文化设置为德语也没有帮助。

C#SQL Connection似乎将文化设置为默认(英语),与线程文化,日期格式或SQL Server语言无关。

任何想法都非常感谢如何正确设置文化 - 这样我就不需要在真正的sql文本之前发送SET DATEFORMAT dmy

更新

这是我调用sql存储过程并使用c#sql参数传递日期的代码。

        SqlConnection sqlConnection = null;
        try
        {
            // open connection to the database
            sqlConnection = new SqlConnection(Convert.ToString(ConfigurationManager.ConnectionStrings[ProductivityAnalyzerDatabase.ConnectionStringName]));
            sqlConnection.Open();

            // setup command
            var sqlCommand = new SqlCommand("UpdateEmployeeBalances", sqlConnection);
            sqlCommand.CommandType = CommandType.StoredProcedure;

            sqlCommand.Parameters.Add(new SqlParameter("@employeeId", employeeId));
            sqlCommand.Parameters.Add(new SqlParameter("@startDate", startDate));
            sqlCommand.Parameters.Add(new SqlParameter("@endDate", endDate));

            sqlCommand.ExecuteNonQuery();
        }
        finally
        {
            if (sqlConnection != null && sqlConnection.State == ConnectionState.Open)
            {
                sqlConnection.Close();
            }
        }

2 个答案:

答案 0 :(得分:4)

Date values are not stored with their display format.
问题是您将日期作为字符串发送到Sql Server,从而强制SQL Server将字符串转换为日期值。除非您以ANSI-SQL格式(yyyy-mm-dd)发送日期,否则此播放可能会失败或产生意外结果(04/02/2015 4月2日或2月4日?)

正如他的评论中提到的Steve一样,正确的解决方案是使用c#的DateTime结构作为存储过程参数的值。 (不要使用ToString或类似的东西。)
请注意,该参数应在存储过程本身中声明为日期类型(datetimedatetime2date)。

答案 1 :(得分:1)

美好的一天,

您可以在此clog中阅读有关此问题的更多信息: http://ariely.info/Blog/tabid/83/EntryId/161/Date-displaying-format-vs-Date-storing-format.aspx

简而言之(来自上面的链接):

根据连接的语言或查询的整理来解释模糊日期格式的隐式转换。始终遵守并遵守规则,以使您的工作更加兼容。

我希望这很有用: - )