我有一个应用服务器,它连接到另一台带有SQL Server 2008R2的服务器。两个服务器的GUI都是法语,并且日期和数字格式都是法语。 SQL Server和用于执行命令语言的用户也设置为法语(默认情况下都是)。但是,我将我的WCF服务中的格式设置为“en-GB”,方法是将其放在web.config中:
我在LINQ to SQL dbcontext文件中包含了一个存储过程,并且我传递了一个date参数而没有将其转换为字符串(因为ORM将其识别为日期)。
直到今天早些时候,事情变得很好,程序停止执行抛出异常,说不能将字符串转换为日期。
我用SQL Profiler跟踪了查询,发现它正在执行以下查询:
declare @p9 int
set @p9=NULL
exec sp_executesql N'EXEC @RETURN_VALUE = [GIS].[GetOnlineTrackingRecords]
@CompanyId = @p0, @EntityIds = @p1, @MinDate = @p2, @MinRecordId = @p3, @TrackingType = @p4, @TrackAllEntities = @p5', N'@p0 int,@p1 varchar(8000),@p2 datetime,@p3 bigint,@p4 tinyint,@p5 bit,@RETURN_VALUE int output',
@p0=1,@p1='168',@p2='2013-10-24 16:36:28.690',@p3=NULL,@p4=1,@p5=0,@RETURN_VALUE=@p9 output
select @p9
(@ p2的主要问题)
包装我的存储过程的ORM方法如下所示:
[global::System.Data.Linq.Mapping.FunctionAttribute(Name= "GIS.GetOnlineTrackingRecords")]
public ISingleResult<FMS2.Framework.TrackEntities.GetOnlineTrackingRecordsResult> GetOnlineTrackingRecords([global::System.Data.Linq.Mapping.ParameterAttribute(Name="CompanyId", DbType="Int")] System.Nullable<int> companyId, [global::System.Data.Linq.Mapping.ParameterAttribute(Name="EntityIds", DbType="VarChar(MAX)")] string entityIds, [global::System.Data.Linq.Mapping.ParameterAttribute(Name="MinDate", DbType="DateTime")] System.Nullable<System.DateTime> minDate, [global::System.Data.Linq.Mapping.ParameterAttribute(Name="MinRecordId", DbType="BigInt")] System.Nullable<long> minRecordId, [global::System.Data.Linq.Mapping.ParameterAttribute(Name="TrackingType", DbType="TinyInt")] System.Nullable<byte> trackingType, [global::System.Data.Linq.Mapping.ParameterAttribute(Name="TrackAllEntities", DbType="Bit")] System.Nullable<bool> trackAllEntities)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), companyId, entityIds, minDate, minRecordId, trackingType, trackAllEntities);
return ((ISingleResult<FMS2.Framework.TrackEntities.GetOnlineTrackingRecordsResult>)(result.ReturnValue));
}
当我尝试在SQL Server Management Studio中执行相同的查询时,它失败了,但它在我的机器上成功运行(使用英语语言sql server)。在我将SQL Server引擎的语言和用户默认语言更改为us_english后,它运行成功,但仅限于SQL Server,并且在从我的WCF应用程序调用时仍然失败并显示相同的错误消息。我已经使用sys.dm_exec_sessions和SQL Profiler仔细检查了使用us_english语言在用户下执行查询。我已经读过来自'yyyy-MM-dd HH:mm:ss'字符串到目前为止在任何机器上工作正常,但似乎不是:( 考虑到触摸代码非常困难,接下来我该怎么做......
由于
答案 0 :(得分:2)
您不应该传递像yyyy-mm-dd hh:mm:ss
这样的字符串。原因如下:
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '2013-05-06');
这将返回6月5日,而不是5月6日,因为它被解释为yyyy-dd-mm
。如果您在日期('2013-10-24'
)中进行了分析,则会收到错误,因为SQL Server不知道第24个月是什么。
现在,我不知道如何在你的ORM中做事,但理想情况下你应该从不传递一个字符串,所以格式无关紧要。您应该传递日期/时间值,而不是字符串。
当你确实需要传递一个字符串时(你可能,因为我不知道你选择的ORM的局限性,我只知道没有ORM覆盖所有的基础),你应该总是使用100%明确的格式。尝试:
@p2='2013-10-24T16:36:28.690'
---------------^ that T is important
让我说明为什么,只为Alireza。 From this document:
如果日期和时间显示在同一行,则始终在日期前写入日期。如果日期和时间值一起存储在单个数据字段中,那么ISO 8601建议它们应该用拉丁大写字母T分隔,如19951231T235959。
添加T时,删除SQL Server以任何其他方式解释日期的能力。这不是因为它是T,甚至是因为ISO 8601的建议,而是因为SQL Server中的代码只是说,如果有T,则将日期解释为ymd,而不管区域,区域设置,日期格式或语言设置。 / p>