2009-04-21 38 views
3

当日期字段的日期格式从4/16/2009 12:00:00 AM更改为2009年4月16日时,我遇到了一个奇怪的问题:00:00。我将应用程序设置为写出每个存储的proc,如果它存在,则使用相同的相应日期字段进行触发。这是什么出来。你会注意到,格式切换中途无法解释。在ASP.NET Web应用程序请求期间莫名其妙地改变文化

EXECUTE uspContent_SelectOne '132' 
4/16/2009 12:00:00 AM 
EXECUTE uspContent_SelectOne '127' 
4/16/2009 12:00:00 AM 
EXECUTE uspContent_SelectOne '133' 
4/16/2009 12:00:00 AM 
EXECUTE uspContent_SelectOne '131' 
4/16/2009 12:00:00 AM 
EXECUTE uspAttachment_SelectAll 
EXECUTE uspArticleAuthors_SelectAll_ArticleId '3' 
EXECUTE uspArticles_SelectOne '3' 
EXECUTE uspAuthors_Letters 
EXECUTE uspAuthors_Letters 
EXECUTE uspAuthors_Letters 
EXECUTE uspAuthors_SelectAll_Letter_LastName 'A' 
EXECUTE uspFiles_SelectAll_NoFileData 
EXECUTE uspArticles_SelectOne '3' 
EXECUTE uspArticleTypes_SelectAll 
EXECUTE uspFiles_SelectAll_NoFileData 
EXECUTE uspAuthors_SelectOne '0' 
EXECUTE uspArticleAttachments_SelectAll_ArticleId '3' 
EXECUTE uspArticleAttachments_SelectOne_ArticleId_AttachmentId '3','4' 
EXECUTE uspAttachment_SelectOne '4' 
EXECUTE uspContent_SelectOne '132' 
16/04/2009 00:00:00 
EXECUTE uspContent_SelectOne '127' 
16/04/2009 00:00:00 
EXECUTE uspFiles_SelectOne_NoFileData '60' 
EXECUTE uspArticleAttachments_SelectOne_ArticleId_AttachmentId '3','3' 
EXECUTE uspAttachment_SelectOne '3' 
EXECUTE uspContent_SelectOne '133' 
16/04/2009 00:00:00 
EXECUTE uspContent_SelectOne '131' 
16/04/2009 00:00:00 
EXECUTE uspAttachment_SelectAll 
EXECUTE uspArticleAuthors_SelectAll_ArticleId '3' 
EXECUTE uspAuthors_SelectAll_Letter_LastName 'A' 
EXECUTE uspContent_SelectOne '129' 
18/09/2008 00:00:00 
EXECUTE uspContent_SelectOne '7' 
18/09/2008 00:00:00 
EXECUTE uspContent_SelectOne '8' 
18/09/2008 00:00:00 
EXECUTE uspContent_SelectOne '9' 
18/09/2008 00:00:00 
EXECUTE uspContent_SelectOne '10' 
18/09/2008 00:00:00 
EXECUTE uspContent_SelectOne '11' 
18/09/2008 00:00:00 
EXECUTE uspFiles_SelectAll_NoFileData 

我想不通为什么。我正在使用ASP.NET/C#,SQL Server 2005和MS Enterprise Library 4.1。

更新1

我检查应用程序的区域性设置,得到了这一点。对于每个日期字段查询,我检查了文化。在拍摄下面你的屏幕上可以看到如何从美国到英国的文化变迁:

image of cuture changing http://www.craigmoliver.com/cultureissue.jpg

在它设置为web.config中的设置如下:

<globalization culture="en-US" uiCulture="en-US" requestEncoding="utf-8" responseEncoding="utf-8" enableClientBasedCulture="false" /> 

回答

4

是从哪里来的要求不同的浏览器?您是否从HTTP请求中的Accept-Language头文件获取Culture/UICulture?如果是这样,您可能有一个浏览器的首选语言设置为en-US,另一个设置为en-GB?

+0

这是EN-US,EN; Q = 0.5通过请求。 – craigmoliver 2009-04-21 19:32:46

3

检查当前文化的建议是有前途的。

需要考虑的另一种可能性是:您的应用程序是否在负载平衡的服务器场中运行,并且Web服务器的配置是否相同?

+0

它们没有负载平衡,这发生在我的本地机器和dev服务器上。 – craigmoliver 2009-04-21 19:26:51

0

在我执行“Convert.ToDate”的方法,我把下面的代码:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); 
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US"); 

还是不知道它为什么这样做。我的机器和开发服务器上的默认文化是en-US。

这令人发狂!

1

创建一个断点,每当Thread.CurrentThread.CurrentCulture发生更改时触发。至少应该指出你朝着正确的方向。

0

如果您正在使用由XSD架构(DataSet.ReadXmlSchema法)产生的数据集,和XSD包含msdata:Locale属性,这个数据集文化相关的操作可能会使用的语言环境从架构,忽略web.config设置。 为当前线程显式设置它,然后再次覆盖来自XSD的语言环境。

我曾经在一次奇怪的与语言环境有关的问题上失去了几个小时,结果原因就在此。

也许类似的东西也可以隐藏在企业库配置文件中。 我也建议搜索所有违反语言环境字符串(en-UK)的项目相关文件。也许有趣的事情出现了。

0

这是发生在单个页面的生命周期中,还是跨越多个页面?如果它跨越多个页面,则还应该在应用中的每个页面的标记中检查@Page指令 - 您可以在其中显式设置区域性和UI文化。也许你有一个流氓页面的文化设置不当。

+0

在页面上,请勿修改文化 – craigmoliver 2009-05-06 22:17:15

0

您还可以检查您的过程以使用SET DATEFORMAT语句。在SQL Server中,可以在过程的上下文中更改日期值的解释,以便数据库以不同方式解析日期。下面的代码

SET DATEFORMAT 'DMY'; 
SELECT CAST('1-4-2009' AS date); 
SET DATEFORMAT 'MDY'; 
SELECT CAST('1-4-2009' AS date); 

返回我的电脑上,结果如下因此

2009-04-01 
2009-01-04 

SQL Server将解释字符串值按不同的