我正在使用SQL批量复制方法通过C#导入一些包含超过2lac记录的脏Excel文件。
问题:
我正在通过OleDbDataReader
读取数据,如果使用C#读取excel文件,则会出现类型猜测问题。它猜测列的数据类型,如果一行以datetime值开头,它会自动标识包含的列将是datetime值,并且该行上的所有其他字符串值将由读取器插入/读取为null。
字符串值也存在问题,截断为255个字符。如果某些值少于255个字符,则表明包含的列将是文本而不是备忘录。
由于这两个问题我会说使用C#将数据从Excel导入SQL Server并不完美 - 任何想法?
答案 0 :(得分:1)
使用其他内容导入excel内容。
答案 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行中 数据文件。
这很可能是不可能的。