Вопрос по c# – Что такое IMEX в строках соединения OLEDB?

32

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

Какова цельIMEX=2 в приведенной выше строке подключения?

Ваш Ответ

4   ответа
12

ction.

Если вы используете

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

для столбца, подобного следующему, где первые 8 строк имеют 4 (или более) числовых значения, тогда тип считается числовым, а строковые значения читаются как нулевые.

Обратите внимание, что заголовок здесь не используется в качестве заголовка (HDR = NO), поэтому «почтовый индекс» ряд является первым рядом. (Эти почтовые индексы из Швеции на случай, если вы не узнаете их формат.)

 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

Но если ваши данные выглядят так, где только 3 являются числами из первых 8 строк

 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.

Теперь строка 1 больше не обрабатывается как заголовок и "zipcode" является считывается как данные, и поскольку это явно строка, все строки читаются как строки (так работает IMEX = 1).

У этого метода есть пара недостатков. Оба могут быть решены:

1) Вы не можете ссылаться на столбец по его имени (почтовый индекс), но необходимо использовать, например, F7 в зависимости от того, где расположен столбец.

You can solve this by figuring out where the zipcode column is located (can be done programmatically) and change the SQL text accordingly by changing "zipcode" to for example "F7".

2) Значение «почтовый индекс» появится в ваших данных.

This can be solved by having F7<>'zipcode' in your where clause. One might think that this would counteract the fact that we included zipcode (being a string) to make sure all rows are treated as strings. After having tested this it turns out though that the where clause trick that excludes "zipcode" does not have such a counteracting effect.

Error: User Rate Limit Exceeded
30

ConnectionStrings

"If you want to read the column headers into the result set (using HDR=NO even though there is a header) and the column data is numeric, use IMEX=1 to avoid crash.

To always use IMEX=1 is a safer way to retrieve data for mixed data columns. .."

Обратите внимание, что значение IMEX может быть очень важным, когда вам нужно записать данные обратно в Excel. Быстрый поиск в Интернете на IMEX нашел множество статей о проблемах с различными значениями IMEX

Error: User Rate Limit Exceededinstantpages.ltd.uk/ADODB_WP.htmError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Dimitar Tsonev
Error: User Rate Limit Exceeded Dimitar Tsonev
Error: User Rate Limit Exceeded
-6

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
0

таблица данных считывает значения столбца и после примерно 8-10 записей назначает тип данных столбцу. Например, если значения столбца
11.0
22.0
33.0
44.0
55.0
66.0
77.0
88.0
99.0
азбука
Таким образом, таблица данных не будет иметь значение abc, поскольку столбцу был назначен тип данных "Double". Чтобы этого избежать, и чтобы прочитать полные данные, используется IMEX = 1.
Пожалуйста, комментируйте для дальнейших запросов.

Похожие вопросы