我想在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();
}
}
答案 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
或类似的东西。)
请注意,该参数应在存储过程本身中声明为日期类型(datetime
,datetime2
或date
)。
答案 1 :(得分:1)
美好的一天,
您可以在此clog中阅读有关此问题的更多信息: http://ariely.info/Blog/tabid/83/EntryId/161/Date-displaying-format-vs-Date-storing-format.aspx
简而言之(来自上面的链接):
根据连接的语言或查询的整理来解释模糊日期格式的隐式转换。始终遵守并遵守规则,以使您的工作更加兼容。
使用.Net,您应该使用正确映射到SQL Server类型的类型。请检查此链接:https://msdn.microsoft.com/en-us/library/cc716729%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
在DML查询中指定日期时,请始终使用常量 所有语言设置的解释方式都相同!
例如,使用格式yyyymmdd作为20160227,使用带有显式样式参数的显式CONVERT语句 ,在使用ADO,OLE DB或ODBC时使用escape子句。
请记住,这些只是显示格式。在数据库中 无论你的语言是什么,数据都以同样的方式存储!
* datetime存储为4个字节的日期+ 4个字节的时间,Datetime2有点复杂,因为它是灵活的。 you can read more on the undocumented internal stored format here
我希望这很有用: - )