Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OLEDB连接字符串中的IMEX是什么?_C#_Connection String_Oledb - Fatal编程技术网

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

C# OLEDB连接字符串中的IMEX是什么?,c#,connection-string,oledb,C#,Connection String,Oledb,“Provider=Microsoft.Jet.OLEDB.4.0;数据源=localhost;扩展属性=”“Excel 8.0;HDR=Yes;IMEX=2” 在上述连接字符串中,IMEX=2的用途是什么?来自 “如果要将列标题读入结果集中(即使有标题,也使用HDR=NO),并且列数据是数字的,请使用IMEX=1以避免崩溃 始终使用IMEX=1是检索混合数据列数据的更安全的方法…” 请注意,当您需要将数据写回Excel时,IMEX值可能非常重要。 互联网上对IMEX的快速搜索发现了大量关于各种

“Provider=Microsoft.Jet.OLEDB.4.0;数据源=localhost;扩展属性=”“Excel 8.0;HDR=Yes;IMEX=2”

在上述连接字符串中,
IMEX=2
的用途是什么?

来自

“如果要将列标题读入结果集中(即使有标题,也使用HDR=NO),并且列数据是数字的,请使用IMEX=1以避免崩溃

始终使用IMEX=1是检索混合数据列数据的更安全的方法…”

请注意,当您需要将数据写回Excel时,IMEX值可能非常重要。
互联网上对IMEX的快速搜索发现了大量关于各种IMEX值问题的文章

当您将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。

进一步查询请发表评论。

请在模块中使用通用函数

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

使用OLEDB连接读取Excel文件时存在潜在问题

如果你使用

  "Extended Properties='Excel 8.0;HDR=NO;IMEX=3;'"
对于以下列,其中前8行具有4个(或更多)数值, 然后,该类型被视为数字类型,字符串值被读取为null

注意,这里的头不用作头(HDR=NO),因此“zipcode”行是第一行。 (这些邮政编码来自瑞典,以防您无法识别其格式。)

但如果您的数据如下所示,其中前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
如果我们将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

现在,第1行不再被视为标题,“zipcode”是 作为数据读取,因为它显然是一个字符串,所以所有行都作为字符串读取(IMEX=1就是这样工作的)

这种方法有几个缺点。这两个问题都可以解决:

  • 您不能通过列的名称(zipcode)引用该列,但需要根据列的位置使用例如F7
  • 您可以通过计算zipcode列的位置来解决这个问题 (可以通过编程方式完成)并相应地更改SQL文本 将“zipcode”更改为例如“F7”

  • 值“zipcode”将出现在数据中
  • 这可以通过在where子句中使用F7'zipcode'来解决。一个 可能会认为这会抵消我们包括 zipcode(作为字符串)以确保所有行都被视为字符串。 经过测试,结果表明where子句 排除“zipcode”的技巧并没有这样的反作用 效果


    从这里开始:“MEX=0和IMEX=2导致忽略ImportMixedTypes,并使用默认值‘MajorityType’。”明白了。它用于具有混合数据类型的列。谢谢你的邀请replies@Steve,令人敬畏的解释+1对于IMEXUpdate,请在评论中链接:感谢您的详细解释。我正在用美国邮政编码处理这个问题。5位Zipcode被视为双值,5-4位Zipcode被忽略,因为它们是字符串:(很好的解释!当使用HDR=NO+IMEX=1并查询DateTable时,我所做的是从第1行重新创建列名,然后删除第一行。所有数据都被视为文本。
     1) zipcode
     2) 12545
     3) 11550
     4) 18735
     5) 11335
     6) 13940
     7) 18155
     8) 11759
     9) 17674
    10) 137 38
    
      "Extended Properties='Excel 8.0;HDR=NO;IMEX=1;'"