我正在将一个excel文件上传到服务器,然后将其行和列插入数据库。我一行一行地做,但日期时间有问题。插入146行数据后,出现一个错误,内容如下:
将varchar数据类型转换为datetime数据类型导致值超出范围。
声明已终止。
问题是日期。在excel文件中,日期的格式是dd/mm/yyyy,但数据库将其设为mm/dd/yyyy,因此当日期超过第12个时,会出现超出范围的错误。我不想改变我的excel文件,所以是否有一个选项我可以改变数据库(ms sql server)或我必须使用c代码,可以转换他们之前,他们被插入…谢谢。。。

最佳答案

如果您知道来自excel的格式,那么最好使用特定的iformatterprovider在c中将字符串解析为datetime。
这里的问题是没有来自excel的字符串的区域性信息,因此转换为datetime只能考虑数据库的区域性-在本例中是一种反转月份和日期的格式。这将意味着超出范围的日期(如您的情况)或不明确的日期永远无法正确解析。
在c代码中,您可以指定实现IFormatterProvider的区域性,en-gb具有您指定的excel日期的日期格式。MSDN documentation中的示例演示了如何执行此操作。我的示例简报显示了如何将en-gb日期格式的字符串转换为不区分区域性的DateTime

var culture = CultureInfo.CreateSpecificCulture("en-GB");
var date = DateTime.Parse("13/12/2011", culture);

SQL在区域性方面也有同样的问题。任何区域性敏感数据的字符串表示都将丢失当前区域性。转换该数据时,如果区域性与服务器不同,则需要指定该区域性。
您可以在sql中执行此操作,并将要转换的字符串的格式硬编码(103表示en-gb日期格式dd/mm/yyyy):
declare @datestring varchar(10) = '13/12/2011' --13th December
-- 103 is the format code for UK dates with full yyyy century.
select convert(date, @datestring, 103) --gives 2011-12-13

declare @datestring2 varchar(10) = '05/04/2011' --5th April, ambiguous date.
select convert(date, @datestring2, 103) --gives 2011-04-05

Convert / cast format codes.
还值得注意的是,这也将正确地转换不明确的日期,如2011年4月5日,如果不知道文化,这将反转月/日。
例如,如果您试图将英国2011年4月5日转换为美国日期,而不告诉解析器格式是什么,那么您将得到2011年5月4日的输出-反转月份和日期。

关于c# - 在插入数据库之前更改日期格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10734932/

10-14 18:52
查看更多