如何通过具有数据截断类型猜测的 c# 导入脏 Excel
本文关键字:导入 Excel 类型 何通过 数据 | 更新日期: 2023-09-27 18:29:20
我正在使用 SQL 批量复制方法通过 C# 从工作表导入一些具有超过 2lac 记录的脏 excel 文件。
问题:
-
我正在通过一个
OleDbDataReader
读取数据,在使用 C# 读取 excel 文件的情况下,该存在类型猜测问题。它猜测列的数据类型,如果一行以日期时间值开头,它会自动识别包含的列将是日期时间值,并且该行上的所有其他字符串值都被读者插入/读取为 null。 -
截断 255 个字符的字符串值也存在问题。如果某些值少于 255 个字符,则猜测包含列将是文本而不是备忘录。
由于这两个问题,我想说使用C#将数据从Excel导入SQL服务器并不完美 - 有什么想法吗?
使用其他内容导入您的 excel 内容。
http://epplus.codeplex.com/
我知道有两种不使用外部组件的方法。
一如果可以在导入文件之前将文件另存为 CSV,则可以使用文本文件驱动程序和架构.ini文件方法,该方法允许您逐列显式声明数据类型。
schema.ini 方法也适用于 SQL OPENROWSET 命令,允许您直接从 CSV 导入到 SQL,而无需中间的 C#,同时仍允许您指定列数据类型。
二 如果您对进行注册表黑客攻击不过敏,这里有Microsoft的建议。
它建议对注册表项进行更改:
HKLM''软件''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 导入。
或者,在不入侵注册表的情况下:
解决此问题的第二种方法(无需修改 注册表(是为了确保带有字段的行,其中有数据 255 字符或更大字符,出现在源的前 8 行中 数据文件。
这很可能是不可能的。