Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / ADO к закрытой книге Excel "местами" возвращает Null / 14 сообщений из 14, страница 1 из 1
15.01.2010, 12:38
    #36411947
newnoober
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
Доброго времени суток.

Столкнулся с такой проблемой:
Беру данные из закрытой книги Excel:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim str_shtBD as string:    str_shtBD= "Лист1"
Dim path_db as string:      path_db= "c:\книга1.xls"
Dim cnn As ADODB.Connection
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
  "Data Source=" & path_db & ";" & _
  "Extended Properties=""Excel 8.0;HDR=No;IMEX=1"""

rst.Open "SELECT * FROM [" & str_shtBD & "$A1:AA3000]", cnn
ThisWorkbook.Worksheets("ЛИст1").Range("A1").CopyFromRecordset rst: rst.Close
В итоговых данных пропущены значения некоторых ячеек (возвращает Null), которые есть в источнике. Обратив внимание, что пропущены строковые данные в столбцах, а числовые остались, на первый взгляд, причина :

Rows to Scan: Excel does not provide ADO with detailed schema information about the data it contains, as a relational database would. Therefore, the driver must scan through at least a few rows of the existing data in order to make an educated guess at the data type of each column. The default for "Rows to Scan" is eight (8) rows. You can specify an integer value from one (1) to sixteen (16) rows, or you can specify zero (0) to scan all existing rows. This is done by adding the optional MaxScanRows= setting to the connection string, or by changing the Rows to Scan setting in the DSN configuration dialog box.
How To Use ADO with Excel Data from Visual Basic or VBA

добавив в начале талбици строку с непустыми значениями в каждом поле, проблема решилась (пока что так кажется...).

НО! Самое интересное, что в СТАРОМ варианте ВСЕ ДАННЫЕ выгружались абсолютно корректно на компьютерах с Dual-Core, а на Pentium 4 наблюдалась описанная проблема. Каких либо иных закономерностей связанных с установленным ПО выявить не смог (версии и SP Excel'я и ОС)

Потому решение "методом тыка" настораживает.
Есть у кого-то опыт работы с подобными проблемами и пути корректного решения?
Либо какие-то другие дельные соображения?

PS: замечания о том, что книги Excel не стоит использовать как БД (и т.п. высказывания), в данной теме не будут рассматриваться как дельные.

Спасибо.
...
Рейтинг: 0 / 0
15.01.2010, 12:52
    #36412006
qwrqwr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
newnoober Обратив внимание, что пропущены строковые данные в столбцах, а числовые остались, на первый взгляд, причина :Так и есть.
Видимо вам надо импортировать этот столбец как текст - а он воспринимается при импорте как числовой - и текстовые данные пропускаются.
Обычно вроде помогает - делать 1ю строчку текстовой (можно добавлением одинарной кавычки перед числом)
newnoober
добавив в начале талбици строку с непустыми значениями в каждом поле, проблема решилась (пока что так кажется...). ИМХО не добавлением непустых, а именно непустых текстовых .
newnoober
НО! Самое интересное, что в СТАРОМ варианте ВСЕ ДАННЫЕ выгружались абсолютно корректно на компьютерах с Dual-Core, а на Pentium 4 наблюдалась описанная проблема. Каких либо иных закономерностей связанных с установленным ПО выявить не смог (версии и SP Excel'я и ОС)
Скорее всего разные MDAC
проверьте
Код: plaintext
1.
Set conn = CreateObject("ADODB.Connection")
MsgBox conn.Version
на новом наверное 2.8
на старом наверное более ранняя - судя по ссылке меняли начиная с 2.5
...
Рейтинг: 0 / 0
15.01.2010, 13:30
    #36412144
qwrqwr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
PS
qwrqwr
Обычно вроде помогает - делать 1ю строчку текстовой Перечитал сам себя.
Не вроде, а должно помочь 100% - т.к. у вас там стоит IMEX=1
"IMEX=1;" tells the driver to always read "intermixed" (numbers, dates, strings etc) data columns as text. Благодаря ему - если хотя бы одна из верхних 25-ти строк будет текстовая - весь столбец воспримется как текст.
25 строк - значение по умолчанию - сидят здесь:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel] "TypeGuessRows" (REG_DWORD)Их менять можно, но ни к чему.
...
Рейтинг: 0 / 0
15.01.2010, 17:22
    #36412915
newnoober
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
qwrqwr
newnoober
добавив в начале талбици строку с непустыми значениями в каждом поле, проблема решилась (пока что так кажется...). ИМХО не добавлением непустых, а именно непустых текстовых .

конечно же Вы правы - имелось ввиду именно текстовых. выразился не корректно

qwrqwr
Скорее всего разные MDAC
проверьте

Set conn = CreateObject("ADODB.Connection")
MsgBox conn.Version
на новом наверное 2.8
на старом наверное более ранняя - судя по ссылке меняли начиная с 2.5
conn.Version везде одинаковая 2.8. Так что это не она. А жаль...
...
Рейтинг: 0 / 0
15.01.2010, 17:50
    #36412963
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
qwrqwr
Код: plaintext
1.
Set conn = CreateObject("ADODB.Connection")
MsgBox conn.Version
на новом наверное 2.8
на старом наверное более ранняя - судя по ссылке меняли начиная с 2.5Версия ADO не имеет значения. Смотреть надо версию драйвера который указан в строке подключения как "Provider".
...
Рейтинг: 0 / 0
15.01.2010, 17:59
    #36412988
qwrqwr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
White Owl, ну это мои домыслы были...
просто исходя из авторКаких либо иных закономерностей связанных с установленным ПО выявить не смог (версии и SP Excel'я и ОС)для меня следовало, что Jet 4.0 на всех машинах.


2 newnoober : в любом случае, текстовая первая строка + "IMEX=1" должны сработать везде корректно.
...
Рейтинг: 0 / 0
15.01.2010, 18:28
    #36413054
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
qwrqwrWhite Owl, ну это мои домыслы были...
просто исходя из авторКаких либо иных закономерностей связанных с установленным ПО выявить не смог (версии и SP Excel'я и ОС)для меня следовало, что Jet 4.0 на всех машинах.Кроме собственно ServicePack микрософты выпускают еще и "мелкие" патчи...
Смотреть надо на номер билда dll.
Само ADO это всего-лишь враппер, оно никак не трогает базу.
...
Рейтинг: 0 / 0
17.01.2010, 00:14
    #36414203
newnoober
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
qwrqwrв любом случае, текстовая первая строка + "IMEX=1" должны сработать везде корректно.это я уже понял. Но важна причина разного результата т.к. данным способом извлекается большое количество различных данных. Везде прописать первую строку текстом будет крайне сложно(т.к.повлечет множество корректировок), и не хотелось бы обнаружыть где ещё макрос дал збой, когда проект закончит тестироваться...

White OwlСмотреть надо версию драйвера который указан в строке подключения как "Provider".White OwlСмотреть надо на номер билда dll". В строке подключения как "Provider" указано то же, что и в первом посте: "Provider=Microsoft.Jet.OLEDB.4.0;"
А вот версии длл надо бедт проверить... правда, пока не знаю каких именно.
...
Рейтинг: 0 / 0
18.01.2010, 17:31
    #36416489
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
Это фича такая. Еще с ODBC такое шло. Там хоть на MAXSCANROWS реагировало - можно было заставить сканить весь дипазон (=0). У АДО привязано к настройкам то ли из реестра, то ли насмерть где-то забиты. На MAXSCANROWS не реагирует. давно было - уже утерял подробности
Попортила много крови когда-то. Так как случилось не ожиданно :)

Дравейр пытается сам определить тип данных по первым 8-25 (вроде. точно не помню.).
если в числовом поле 8 строк пусто, то поле считается текстом и все числа тю-тю. Почему число не может быть текстом - история умалчивает.
Версия драйвера/патча ADO роли не играет.

Выход - формировать для числовых полей изначально 0 либо насильно шаблон (где текст, где 0) из 8-25 строк либо заменять NULLы на 0. Можно шаблон размещать внизу, и в запросе указывать нумерацию с низу (не А1:B100,а B100:A1) - хавает

где-то давно я тут уже писал про эту особенность. а может и не писал :)

з.ы.
да и адо-запросы к ОТКРЫТОЙ книге вызывают утечки памяти. Описано на сайте мелких. Но автор видимо знает уже
...
Рейтинг: 0 / 0
19.01.2010, 09:22
    #36417215
qwrqwr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
Senin ViktorМожно шаблон размещать внизу, и в запросе указывать нумерацию с низу (не А1:B100,а B100:A1) - хаваетКласс, до такого сам не додумаешься, а в книжках не напишут, спасибо :)
...
Рейтинг: 0 / 0
19.01.2010, 12:20
    #36417698
newnoober
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
Senin Viktor...
Версия драйвера/патча ADO роли не играет.
...
з.ы.
да и адо-запросы к ОТКРЫТОЙ книге вызывают утечки памяти. Описано на сайте мелких. Но автор видимо знает уже
Если версия драйвера/патча ADO роли не играет, то что может быть причиной АБСОЛЮТНО корректной работы того же кода на тех же данных на других машинах? Есть какие-то соображения по ЭТОМУ поводу?

PS: про утечки памяти знаем, даже пробовали :)
...
Рейтинг: 0 / 0
19.01.2010, 15:05
    #36418259
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
newnoober
Если версия драйвера/патча ADO роли не играет, то что может быть причиной АБСОЛЮТНО корректной работы того же кода на тех же данных на других машинах? Есть какие-то соображения по ЭТОМУ поводу?


Точно ли данные (в цифровом поле) одинаковы в первых (например,8) строках екцеля?
Так как этой "фичей" я уже лет 6 наверное пользуюсь, возможно, в более древние времена :) MDACи были более правильные.
Да и драйвер хоть и от ADO, а синтаксис и ограничение селектов от Microsoft Query. А с чем питается эта микрософтовская зверушка - х.з.
...
Рейтинг: 0 / 0
19.01.2010, 20:35
    #36419075
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
Senin ViktorДа и драйвер хоть и от ADOНе бывает драйверов "от ADO" . ADO это враппер над OLEDB драйверами.
...
Рейтинг: 0 / 0
21.01.2010, 18:10
    #36423674
newnoober
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO к закрытой книге Excel "местами" возвращает Null
Senin ViktorТочно ли данные (в цифровом поле) одинаковы в первых (например,8) строках екцеля? Ходил и тестил на разных машинах. Файл с обработчиком и файл с источником лежат в сети. За время теста никаких изменений с данными/кодом не производил. Результатирующий рекордсет на разных машинах разный 100%
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / ADO к закрытой книге Excel "местами" возвращает Null / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]