C# Oledb读取服务器上的多个excel文件会导致类型错误

C# Oledb读取服务器上的多个excel文件会导致类型错误,c#,excel,oledb,jet,C#,Excel,Oledb,Jet,最初,我在处理jet驱动程序(通过oledb)时遇到了数据类型“猜测”的问题。如果一个工作表有混合类型,它将引入空/空值 -编辑- 连接字符串和注册表中都有一个IMEX设置,它将告诉jet/ace对具有多种数据类型的列使用文本。这样,如果前6行有一个整数值,第7个单元格有一个文本值,则不会出现类型转换失败。注册表中还有一个设置(和连接字符串),允许您说出jet应使用多少行进行采样 -结束编辑- 我更改了服务器上的连接字符串和注册表设置。所以现在程序读起来很好。它将以文本形式读取值,而不使用{n}

最初,我在处理jet驱动程序(通过oledb)时遇到了数据类型“猜测”的问题。如果一个工作表有混合类型,它将引入空/空值

-编辑-

连接字符串和注册表中都有一个IMEX设置,它将告诉jet/ace对具有多种数据类型的列使用文本。这样,如果前6行有一个整数值,第7个单元格有一个文本值,则不会出现类型转换失败。注册表中还有一个设置(和连接字符串),允许您说出jet应使用多少行进行采样

-结束编辑-

我更改了服务器上的连接字符串和注册表设置。所以现在程序读起来很好。它将以文本形式读取值,而不使用{n}行进行采样。我认为它工作得很好

现在我有了一个数据源,它列出了要读取的文件。如果我有多个文件在那里,它将有相同类型的铸造问题。。。或者至少有相同的症状。如果我一次上传一个文件而不使用队列,那么它就可以正常工作。当我在一行中有多个文件时,它似乎有类型转换问题

我不确定是什么导致了在一行中读取多个文件时发生这种情况,但不是一次读取一个文件时。连接打开,读取所有数据,然后关闭。。。所以我认为这与此无关

我只是想听听你的想法?找到原来的问题已经够难了。和Jet一起工作似乎是在要求屁股疼痛


根据要求增加相关代码

public static readonly String CONNECTION_STRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data   Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES; ReadOnly=True;IMEX=1;\"";

private System.Data.DataTable Query(String worksheetName, String selectList = "*")
{
    DataTable table = new DataTable();

    _connection.Open();
    var query = String.Format(Constants.DATA_QUERY, selectList, worksheetName);
    new OleDbDataAdapter(query, _connection).Fill(table);
    _connection.Close();
    return table;
}

如果可能的话,我建议使用本机库,类似或替代OLEDB,我在这里找到了解决方案

提供程序设置:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\path\fileName1.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
SQL语句的设置必须如下所示:

Select * From[Hoja1$]
UNION ALL
Select * From [Hoja1$] IN 'C:\path\fileName2.xls' 'Excel 8.0;HDR=Yes;IMEX=1'
如果要进行内部联接

Select * from [Hoja1$] as a
INNER JOIN (select * from [Hoja1$] IN 'C:\path\fileName2.xls' 'Excel 8.0;HDR=Yes;IMEX=1') as b
ON a.FOLIO=b.FOLIO

您的相关代码在哪里?多个文件肯定不会导致您的问题。你的逻辑是什么?我不记得需要编辑注册表来阅读
excel工作簿
。使用
ACE OleDB
,您在阅读时应该不会遇到任何问题。真正地你写了这么多,但没有什么能帮助你理解你的想法issue@T.S.当excel猜测错误的数据类型时,有一个IMEX设置。因此,如果前6行显示为整数类型,而第10行显示为文本,则类型转换将失败,并为第10行引入“”值。您需要编写逻辑来解析该类型。我在一个应用程序中所做的是将所有行解析为文本,然后每行都经过数据验证,失败的将添加到日志中。稍后,用户可以转到该日志并将这些失败的行作为Excel下载。用户将快速修复它[因为只存在失败的行],然后重新上传文件。您需要朝着构建逻辑的方向努力,以解决您的不兼容问题,或者只使用字符串。当它读取一个文件时,这是有效的,当我连续读取多个文件时,这似乎被忽略了。在这种情况下,我不允许让用户修复文件。谢谢你的推荐。我会看看这些项目。虽然这个链接可以回答问题,但最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生变化,只有链接的答案可能会无效。@IanO'Brien当然,我通常会这样做,但这些不是文章,而是3d party库。或者我应该把它作为一个评论发布,因为它不能直接回答问题?我正好处在一个可以从Jet/Ace转换的情况下。然而,情况并非总是如此。我想指出,这实际上并没有回答眼前的问题。(这意味着它不会试图解决实际问题)您的驱动程序是Microsoft.Jet.OLEDB.4.0,而我的是Microsoft.ACE.OLEDB.12.0,因此您可以连接到标准excel文件,但不能连接到xlsx。Ace向后兼容,但jet不向前。这个问题也有6年历史了。还值得指出的是,从多个来源获取数据不是问题所在。问题是imex设置在列中存在混合类型时使用的采样。那是不起作用的部分。