Подтвердить что ты не робот

Что такое IMEX в строке подключения OLEDB?

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

Привет. Какова цель IMEX?

4b9b3361

Ответ 1

От ConnectionStrings

"Если вы хотите прочитать заголовки столбцов в наборе результатов (используя HDR = NO, хотя есть заголовок), а данные столбца являются числовыми, используйте IMEX = 1, чтобы избежать сбоя.

Чтобы всегда использовать IMEX = 1, это более безопасный способ получения данных для столбцов смешанных данных..."

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

Ответ 2

Возникает потенциальная проблема при чтении файлов Excel с помощью OleDbConnection.

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

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

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

Обратите внимание, что заголовок здесь не используется в качестве заголовка (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

Но если ваши данные выглядят так, где только 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) Вы не можете ссылаться на столбец по его названию (zipcode), но нужно использовать, например, F7 в зависимости от того, где находится столбец.

Вы можете решить это, выяснив, где находится столбец zipcode (можно сделать программно) и изменить текст SQL соответственно на изменение "zipcode" на, например, "F7".

2) Значение "zipcode" появится в ваших данных.

Это может быть разрешено с помощью F7 < > 'zipcode' в вашем предложении where. Один может подумать, что это будет противодействовать тому, что мы включили zipcode (являющийся строкой), чтобы убедиться, что все строки рассматриваются как строки. После проверки этого оказалось, что предложение where трюк, который исключает "zipcode" , не имеет такого противодействия эффект.

Ответ 3

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

Ответ 4

Пожалуйста, используйте обобщенную функцию в модуле...

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