如何通过具有数据截断类型猜测的c#导入脏Excel

时间:2012-03-28 14:30:20

标签: c# sql-server excel import-from-excel

我正在使用SQL批量复制方法通过C#导入一些包含超过2lac记录的脏Excel文件。

问题:

  1. 我正在通过OleDbDataReader读取数据,如果使用C#读取excel文件,则会出现类型猜测问题。它猜测列的数据类型,如果一行以datetime值开头,它会自动标识包含的列将是datetime值,并且该行上的所有其他字符串值将由读取器插入/读取为null。

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

  3. 由于这两个问题我会说使用C#将数据从Excel导入SQL Server并不完美 - 任何想法?

2 个答案:

答案 0 :(得分:1)

使用其他内容导入excel内容。

http://epplus.codeplex.com/

答案 1 :(得分:0)

我知道有两种方法可以不使用外部组件。

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

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

TWO 如果您对注册表黑客没有过敏,请点击此处Microsoft's suggestion

它建议更改注册表项:

  

HKLM \ SOFTWARE \微软\喷气\ 4.0 \发动机\ EXCEL \ TypeGuessRows

或64位系统:

  

HKLM \ SOFTWARE \ wow6432node \微软\喷射\ 4.0 \发动机\ EXCEL \ TypeGuessRows

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

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

另请注意此密钥的HKLM范围 - 它将影响该计算机上任何进程的每个OleDB Excel导入。

或者,没有黑客入侵注册表:

  

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

这很可能是不可能的。