在将DateTime值传递给存储过程时保留格式

时间:2011-10-31 17:54:58

标签: c# sql-server sql-server-2005 c#-2.0

我在Web窗体上有一个TextBox服务器控件,比如 txtDueDate 。我不想使用DateTimePicker但想要使用TextBox本身。用户以dd / mm / yyyy格式输入日期。

将此值传递给SQL Server 2005(Express)存储过程时,我使用类似:

的内容
cmdParameters.AddWithValue("@DueDate", Convert.ToDateTime(txtDueDate.Text));

存储过程具有输入参数来处理此值,并声明为:

@DueDate SmallDateTime

我想知道SQL Server 2005在内部用于存储此日期的默认格式。在我的PC上,Windows XP区域设置被设置为dd / mm / yyyy格式。通过Management Studio查看记录时,它会正确存储。但我担心将使用此Web应用程序的用户。 Windows区域设置可能在PC上有所不同。

我想确定查询数据库的人,日期以dd / mm / yyyy格式显示。如果有人插入,02/01/2004,则不应成为有效的反向日期,例如:01/02/2004。

4 个答案:

答案 0 :(得分:5)

DateTimeDateTimeDateTime - 当存储在SQL Server中时它不具有任何(面向字符串)格式(它存储为64-有点长)。如果您已将参数作为DateTime传递给存储过程,那么您应该没问题!该值将由SQL Server 存储而不更改任何格式 - 因为它没有与之关联的任何格式...

在给定的字符串格式中,日期表示的唯一一点是在SQL Server Management Studio中查看它,或者在例如SQL Server Management Studio中将其转换为字符串格式时。你的.NET应用程序。

如果您需要以某种方式将字符串表示传递到SQL Server(例如,用于搜索等),那么最强大且可以使用任何区域/语言设置的那个是< strong> ISO-8601 日期格式:YYYYMMDD或者(如果您需要时间部分)YYYY-MM-DDTHH:MM:SS(其中中间的T是文字,将日期分开和时间部分)

答案 1 :(得分:2)

无论如何,

DateTime值不应该作为基于文本的格式存储在数据库中 - 听起来它们不是。您应该将它们视为 DateTime值。如何在出路时格式化这些值取决于查询数据库的任何内容,如果没有基本上只存储文本,你就无法控制它,你应该做。 尽可能多地以“原生”格式处理该值。尽量避免与字符串格式进行转换。

我也避免在这里使用Convert.ToDateTime(text) - 您如何确定系统默认格式是否适用于此处?您是否可以使用一组控件来提供实际值,而不是依赖于用户输入的内容?

答案 2 :(得分:0)

你选择......

1)如果您担心用户输入错误的格式(错误,如DateTime.Parse引发异常),则需要验证输入

2)如果您担心用户输入错误的格式(错误,如DateTime.Parse中引发异常),则使用日期选择器。

答案 3 :(得分:0)

到目前为止的转换是在客户端完成的,通过:

Convert.ToDateTime(txtDueDate.Text)

默认情况下,它使用当前的UI文化,但您可以使用第二个参数指定文化:

Convert.ToDateTime(txtDueDate.Text, new CultureInfo("en-GB"))