0

我正在使用 SQL 批量复制方法通过 C# 从工作表中导入一些具有超过 2lac 记录的脏 excel 文件。

问题:

  1. 在使用 C# 读取 excel 文件的情况下,我正在通过一个OleDbDataReader存在类型猜测问题的数据来读取数据。它猜测列的数据类型,如果一行以日期时间值开头,它会自动识别包含的列将是日期时间值,并且该行上的所有其他字符串值都被读取器插入/读取为 null。

  2. 截断 255 个字符的字符串值也存在问题。如果某些值少于 255 个字符,则它猜测包含列将是文本而不是备忘录。

由于这两个问题,我想说使用 C# 将数据从 Excel 导入 SQL Server 并不完美 - 有什么想法吗?

4

2 回答 2

1

使用其他东西来导入您的 excel 内容。

http://epplus.codeplex.com/

于 2012-03-28T14:46:49.620 回答
0

我知道不使用外部组件的两种方法。

如果您可以在导入之前将文件保存为 CSV,那么您可以使用文本文件驱动程序和schema.ini文件方法,它允许您逐列显式声明数据类型。

schema.ini 方法也适用于 SQL OPENROWSET 命令,允许您直接从 CSV 导入 SQL,而无需中间使用 C#,同时仍允许您指定列数据类型。

如果你对注册表黑客不过敏,这里是微软的建议

它建议对注册表项进行更改:

HKLM\Software\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows

或对于 64 位系统:

HKLM\SOFTWARE\wow6432node\microsoft\jet\4.0\engines\excel\TypeGuessRows

通过将此值设置为零,将扫描电子表格的前 16384 行以进行类型猜测,而不是默认的 8 行。如果遇到任何超过 255 个字符的文本字段,则这些列被视为备忘录字段。

请注意,您仍然不能100% 保证获得正确的数据类型,具体取决于您的数据。

还要注意这个键的 HKLM 范围 - 它会影响该机器上任何进程的每个 OleDB Excel 导入。

或者,无需破解注册表:

解决此问题的第二种方法(不修改注册表)是确保在源数据文件的前 8 行中存在具有 255 个字符或更大数据的字段的行。

这很可能是不可能的。

于 2012-03-28T15:16:06.883 回答