gpt4 book ai didi

c# - SQL Bulkcopy YYYYMMDD问题

转载 作者:行者123 更新时间:2023-11-30 21:17:31 25 4
gpt4 key购买 nike

我在使用 C# 的 asp.net 3.5 中使用 SQL Bulkcopy 时遇到字符串到日期的转换问题

我读取了一个大型 CSV 文件(带 CSV reader )。读取的字符串之一应加载到 SQL Server 2008 日期列中。

如果文本文件包含例如字符串“2010-12-31”,SQL Bulkcopy 会将它毫无问题地加载到日期列中。

但是,如果字符串是“20101231”,我会得到一个错误:
数据源中String类型的给定值无法转换为指定目标列的日期类型

该文件包含 8000 万条记录,因此我无法创建数据表....

SqlBulkcopy Columnmappings等都可以。更改为 DateTime 也无济于事。

我试过了

SET DATEFORMAT ymd;

但这并没有帮助。

有什么办法告诉 SQL Server 接受这种格式吗?否则,我将在 CSV 阅读器中创建自定义修复程序,但我更喜欢 SQL 中的内容。

更新跟进这两个答案,我正在使用像这样的 SQL bulkcopy(正如在 Stackoverflow 上提出的另一个问题):

CSV 阅读器(请参阅上面关于代码项目的链接)返回字符串值(非强类型)。 CSVreader 实现了 System.Data.IDataReader,所以我可以这样做:

using (CsvReader reader = new CsvReader(path)) 
using (SqlBulkCopy bcp = new SqlBulkCopy(CONNECTION_STRING))
{ bcp.DestinationTableName = "SomeTable";
// columnmappings
bcp.WriteToServer(reader); }

来自 iDataReader 的所有字段都是字符串,所以我不能使用 c# 方法,除非我在 CSVreader 中做了很多更改

因此,我的问题与如何在 C# 中修复它无关,我可以这样做,但我想阻止它。

这很奇怪,因为如果你在 sql 中做类似的事情

 update set [somedatefield] = '20101231' 

它也可以,只是不适用于 bulkcopy。

知道为什么吗?

感谢您的任何建议,普伦

最佳答案

旧问题,但想添加替代方法。

当从 IDataReader 流式传输时,我遇到了 SQLBulkLoader 不允许列的数据类型/文化规范的相同问题。

为了减少在本地构建数据行的速度开销,而不是在目标上进行解析,我使用的一个简单方法是临时将线程区域性设置为定义所用格式的区域性 - 在本例中为美国格式日期。

对于我的问题 - 输入中的 en-US 日期(在 Powershell 中):

[System.Threading.Thread]::CurrentThread.CurrentCulture = 'en-US'
<call SQLBulkCopy>

对于您的问题,您可以这样做,但由于日期格式不是特定于文化的,因此创建一个默认文化对象(未经测试):

CultureInfo newCulture = (CultureInfo) System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
newCulture.DateTimeFormat.ShortDatePattern = "yyyyMMDD;
Thread.CurrentThread.CurrentCulture = newCulture;

我发现允许数据库服务器在通过 SQLBulkCopy 接口(interface)后执行类型转换比在本地执行解析要快得多,尤其是在脚本语言中。

关于c# - SQL Bulkcopy YYYYMMDD问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4750653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com