使用 Jet 的 OleDbDataAdapter 数据类型不匹配

Posted

技术标签:

【中文标题】使用 Jet 的 OleDbDataAdapter 数据类型不匹配【英文标题】:OleDbDataAdapter datatype mismatch using Jet 【发布时间】:2011-09-11 13:03:18 【问题描述】:

我正在使用 OleDbDataAdapter(准确地说是 Microsoft.ACE.OLEDB.12.0)从 Excel 工作簿中检索数据。对于一个表,我使用的是类型化数据集,但对于另一个表,我不能这样做,因为列数是未知的(Excel 模板可能会生成额外的列)。

问题在于,如果有人在一列中输入了太多数值,“JET”似乎会假定它是一个数字列,并且不再加载文本值。我知道您可以更改模板并为该列设置特定的数据类型,但模板已经广泛传播,所以我宁愿在导入时解决它。

现在我尝试首先计算已使用列的数量,并准备一个具有已定义 Columns 集合的新 DataTable,并将其 DataType 属性设置为 typeof(string)。可悲的是,JET 似乎并没有看到这一点,仍然选择了自己的方式。我猜即使我可以在这里使用强类型数据集,它也无济于事......

有人知道如何告诉 JET 如何导入数据,这样我就不必面对交付新模板版本的负担了吗?

**:不要附带 Excel 自动化解决方案...

【问题讨论】:

【参考方案1】:

如果您有权访问注册表,请设置 TypeGuessRows=0 和/或 ImportMixedTypes=Text。请参阅此处了解更多信息INITIALIZATION SETTINGS

【讨论】:

我发现你也可以在我的 oledb 连接字符串的扩展属性中设置它们,这样确实可以解决我的问题。我还需要设置 IMEX=1 才能使其正常工作... 事实上,只有设置 IMEX=1 就可以了。似乎那些“初始化设置”并没有真正影响连接...... @Koen IMEX 和 HDR 可以在扩展属性中设置,但我确定 TypeGuessRows 是仅注册表设置。这取决于数据的布局以及影响设置效果的数据类型混合发生的位置。 永远不要在注册表中更改可以在运行时更改的内容。事实上,我认为几乎不应该为这样的事情编辑注册表,因为您永远不知道您碰巧正在更​​改的设置可能存在哪些依赖关系。

以上是关于使用 Jet 的 OleDbDataAdapter 数据类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用 OleDbDataAdapter 读取 Excel 文件时出错

如何将准备好的语句与 OleDbDataAdapter 一起使用?

使用 vb.net、oledbdataadapter 更新数据库时出现问题

如何使用 oleDbDataAdapter.Update(myDataSet) 更新 excel 文件

OleDbDataAdapter 在使用包含 Join 的语句时抛出 AccessViolationException

使用 OleDbDataAdapter 读取 CSV 文件时出现未指定的错误