OLEDB连接字符串中的IMEX是什么?

36

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=localhost;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"

上述连接字符串中的 IMEX=2 是什么意思?

4个回答

36

来自连接字符串

"如果你想将列标题读入结果集中(即使有标题也使用HDR=NO)且列数据为数字,请使用IMEX=1以避免崩溃。

始终使用IMEX=1是检索混合数据列的数据的更安全的方式。.."

请注意,当需要写回数据到Excel时,IMEX值可能非常重要。 在互联网上快速搜索IMEX会发现许多关于各种IMEX值问题的文章。


1
"MEX=0和IMEX=2会导致ImportMixedTypes被忽略,使用默认值'MajorityType'。" - kmp
1
明白了。它用于包含混合数据类型的列。感谢回复。 - Dimitar Tsonev
1
@Steve,解释得非常好。IMEX加1。 - Md Haidar Ali Khan
2
在评论中更新链接:https://web.archive.org/web/20080329055859/http://www.instantpages.ltd.uk/ADODB_WP.htm - Mike

22

使用OleDbConnection读取Excel文件时可能会出现潜在问题。

如果您使用

  "Extended Properties='Excel 8.0;HDR=NO;IMEX=3;'"

如果像以下列一样的列,前8行有4个(或更多)数值,则该类型被视为数字,并且字符串值被视为null。

请注意,在此处未使用标题作为标题(HDR = NO),因此“zipcode”行是第一行。 (这些邮政编码来自瑞典,如果您不认识它们的格式。)

 1) zipcode
 2) 125 45
 3) 115 50
 4) 18735
 5) 11335
 6) 13940
 7) 181 55
 8) 11759
 9) 176 74
10) 137 38

但如果您的数据看起来像这样,前8行中只有3行是数字

 1) zipcode
 2) 125 45
 3) 115 50
 4) 18735
 5) 11335
 6) 139 40 <-- This one changed so that it is a string
 7) 181 55
 8) 11759
 9) 176 74
10) 137 38

那么它能正常工作,它会读取所有内容并作为字符串处理。

所以第一种情况是有问题的,但是有解决方法。

假设你使用的是

  "Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'"

如果我们将IMEX更改为1,HDR更改为YES,那么在上述两种情况下它将读取数据作为字符串。 但是假设我们有像这样的数据:

 1) zipcode
 2) 12545
 3) 11550
 4) 18735
 5) 11335
 6) 13940
 7) 18155
 8) 11759
 9) 17674
10) 137 38

如果前8行数据都是数字,然后再次失败,即使我们使用了IMEX=1。

您可以通过以下方式解决此问题。将连接字符串更改为:

  "Extended Properties='Excel 8.0;HDR=NO;IMEX=1;'"

请注意,我们保留了IMEX=1,但将HDR改回了NO。

现在第一行不再被视为标题,"zipcode"被读取为数据,并且由于它显然是一个字符串,所有行都被读取为字符串(这就是IMEX=1的工作原理)。

这种方法有一些缺点。但两个都可以解决:

  1. 您无法使用列名(zipcode)引用该列,但需要根据列位于何处使用例如F7的形式。

您可以通过找出zipcode列位于哪里(可以通过编程方式完成)并相应地更改SQL文本,将"zipcode"更改为例如"F7"来解决此问题。

  1. 值"zipcode"将出现在您的数据中。

这可以通过在where子句中使用F7<>'zipcode'来解决。有人可能认为这会抵消包括zipcode(作为字符串)以确保处理所有行为字符串的事实。经过测试发现,排除"zipcode"的where子句技巧并没有这样的抵消效果。


感谢您的详细解释。我正在处理美国邮政编码的问题。5位数字邮政编码被视为双精度值,而5-4位数字邮政编码被忽略,因为它们是字符串 :( - Shiva
1
很好的解释!当我使用HDR=NO + IMEX=1并查询DateTable时,我会重新创建列名从ROW 1开始,然后删除第一行。所有数据都被视为TEXT。 - Romias

1
当您将Excel文件读入数据表时,数据表会读取列值,并在大约8-10条记录后为列分配数据类型。例如,如果列值为
11.0
22.0
33.0
44.0
55.0
66.0
77.0
88.0
99.0
abc
那么,数据表不会将值“abc”作为该列已被分配数据类型“Double”。为避免此问题并读取完整数据,可以使用IMEX = 1。
如有进一步疑问,请留言。

-8
请在模块中使用通用函数...
Public Function DeleteBlankRowsfromDataset(ByRef Dtset As DataSet) As Boolean
    Try
        Dtset.Tables(0).AsEnumerable().Where(Function(row) row.ItemArray.All(Function(field) field Is Nothing Or field Is DBNull.Value Or field.Equals(""))).ToList().ForEach(Sub(row) row.Delete())
        Dtset.Tables(0).AcceptChanges()
        DeleteBlankRowsfromDataset = True
    Catch ex As Exception
        MsgBox("Deleting Blank Records in Dataset Failed")
        DeleteBlankRowsfromDataset = False
    End Try

End Function

虽然我们很感激你的努力,但是问题的答案应该回答当前的问题。这个答案可能需要进一步解释。 - Daniel L. VanDenBosch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接