powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / adodb.recordset open не возвращает ничего, если..
18 сообщений из 18, страница 1 из 1
adodb.recordset open не возвращает ничего, если..
    #39105539
Фотография Шведков Артем
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

adodb.recordset open sql запрос с листа excel не возвращает ничего, если после строки с заголовками идет 8 и более пустых строк.. (значений в первом столбце sql запроса)

подскажите,плиз, так ли это ? сходу ничего не удалось нагуглить на эту тему..

макрос достался по наследству, используется следующее подключение:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & StrFile & ";" & "Extended Properties=""Excel 12.0 Xml; HDR=YES"""

SrcData = "SELECT * FROM [" & sheet_name & "$" & "A22:S99999] WHERE HDR1 <> """

Set rsSrcData = CreateObject("ADODB.Recordset")
rsSrcData.Open SrcData, conn, 3, 1



где HDR1 - название хидера первого столбца (левая верхняя ячейка запроса на лист excel);
StrFile - полный путь к файлу.


--------------------------------------------------------------------
И один генерал, по TV сказал<br/> Что на Марсе, не будет with..
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39105612
гр к
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шведков Артем, ты скорее всего кавычку пропустил в конце
SrcData = "SELECT * FROM [" & sheet_name & "$" & "A22:S99999] WHERE HDR1 <> """ "
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39105619
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гр кШведков Артем, ты скорее всего кавычку пропустил в конце
SrcData = "SELECT * FROM [" & sheet_name & "$" & "A22:S99999] WHERE HDR1 <> """ "
Тогда уж две, если с пустой строкой сравнить хочет
Код: vbnet
1.
SrcData = "SELECT * FROM [" & sheet_name & "$" & "A22:S99999] WHERE HDR1 <> """""
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39105622
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шведков Артемесли после строки с заголовками идет 8 и более пустых строк.Определение типа столбца идет по первым восьми строкам (через реестр можно поправить на 16 максимум). Как-то можно обойти этот момент.
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39105625
Фотография Шведков Артем
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на этот момент не смотрите, я его вручную сюда повторил, в коде все нормально
Код: vbnet
1.
2.
3.
4.
        
If rsSrcList.Fields("not_null").Value <> "" Then
  SrcData = SrcData & " WHERE " & rsSrcList.Fields("not_null").Value & " <> """""
End If



вопрос в том, что если стоит 8 первых пустых строк после заголовка, 9ая строка уже не читается и не добавляется в recordset, хотя там есть данные и в диапазон в запросе они попадают..
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39105628
Фотография Шведков Артем
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProОпределение типа столбца идет по первым восьми строкам (через реестр можно поправить на 16 максимум). Как-то можно обойти этот момент.

ага, спасибо, вот это уже интересней.. пока пофиксим этот момент и попробую поискать, где это указывается
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39105632
гр к
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, ага, 2.
Я 1 кавычку добавил, и не заметил, что VBE тоже еще 1 добавил.
Итого 5 кавычек.
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39105633
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMEX=1 возвращает все столбцы текстом, не определяя тип

Shocker.Pro(через реестр можно поправить на 16 максимумHCLM/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRow
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39105734
Фотография Шведков Артем
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProIMEX=1 возвращает все столбцы текстом, не определяя тип

Shocker.Pro(через реестр можно поправить на 16 максимумHCLM/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRow

спасибо за инфу, но imex=1 не подходит, т.к. валятся все дальнейшие проверки на IsNumeric, а изменение TypeGuessRow так же не помогло.. пробовал ставить значение в 10ичной и 16ричной системе исчисления, оба раза перезагружался. винда на рабочем ноуте 32битная с 2007 экселем. на домашней 64-битной системе с 2013 экселем еще не проверял..
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39105741
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вполне вероятно, что TypeGuessRow не влияет на определение, так сказать, конца файла.

В чем-то оно логично, если ты запрашиваешь файл как базу данных, он должен как-то минимально соответствовать концепции базы данных. Сам в свое время долго пытался прикрутить вытаскивание данных их файлов через ADO, попрыгал по граблям и в итоге сделал-таки через COM.
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39144765
Фотография Шведков Артем
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Приветствую!

В общем, изменение TypeGuessRow не помогло и снова всплыла эта ошибка из за пустых первых 8 строк при заполнении recordset'а через ADO.. подскажи, плиз, как ты реализовывал схожие алгоритмы через 'COM' ? Или может примеры где можно глянуть ?
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39144781
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не то чтобы схожие...
просто получал доступ к отдельным ячейкам или диапазонам, закидывал их в базу и там уже обрабатывал

примеры будут зависеть от того, из какой среды ты пытаешься это делать?
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39144788
Фотография Шведков Артем
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

тут все банально просто, есть эксель шаблон с макросами, который кушает присылаемые из филиалов схожие эксельки с данными и работает с ними, а далее уже обработанные эксельки грузятся в оракловую многомерку. Все это на виндовых машинах, 32 и 64 битных, у кого какие)
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39144812
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну тогда грубо говоря
Код: vbnet
1.
2.
3.
Set WB = Workbooks.Open("c:\книга1.xls")
Set WS = WB.Sheets(1)
a = WS.Cells(5, 5)
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39144820
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProShocker.Pro(через реестр можно поправить на 16 максимумHCLM/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRow
Не, не максимум. Если установить нулевое значение, то для определения типов сканируется аж 16к строк... само собой, тормоза прилагаются.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
adodb.recordset open не возвращает ничего, если..
    #39776817
Фотография natalitvinenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProIMEX=1 возвращает все столбцы текстом, не определяя тип

А что делать, если IMEX=1 помогает частично? В одном столбце все наладилось(а были null), в двух других пишет нули- а там цифири.
Код: javascript
1.
connection.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" +pppath+"; Persist Security Info=False;Extended Properties='Excel 8.0;HDR=YES;IMEX=1';");


Лезу в Excel из jscript.
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39778800
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
значит в столбцах цифры (числовые значения) идут в перемешку с текстами, похожими на цифры. Соответственно, для ячеек столбца, у которых тип данных не совпадает с определённым по IMEX=1, в рекордсет будет возвращаться значение NULL.
Всё логично (с т.з. логики баз данных).

Нормализовывать значения столбцов придётся (макросом, через запрос уже не получится).
...
Рейтинг: 0 / 0
adodb.recordset open не возвращает ничего, если..
    #39779105
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ldfanateзначит в столбцах цифры (числовые значения) идут в перемешку с текстами, похожими на цифры. Соответственно, для ячеек столбца, у которых тип данных не совпадает с определённым по IMEX=1, в рекордсет будет возвращаться значение NULL.
Всё логично (с т.з. логики баз данных).

Нормализовывать значения столбцов придётся (макросом, через запрос уже не получится).
Код: plaintext
1.
2.
3.
4.
5.
6.
 Отсутствующие значения . Драйвер Excel считывает определенное количество строк (по умолчанию 8 строк) в указанный 
источник для определения типа данных каждого столбца. Если столбец содержит смешанные типы данных, особенно если числовые
 данные смешаны с текстовыми данными, драйвер принимает решение в пользу того типа данных, которого больше, и возвращает
 значения NULL в ячейки, содержащие данные другого типа. (В случае равенства преимущество получает числовой тип.) 
Большинство параметров форматирования ячеек в листе Excel не затрагивает это определение типа данных. Можно изменить 
поведение драйвера Excel, указав режим импорта. Чтобы указать режим импорта, добавьте IMEX=1 к значению расширенных 
свойств в строке соединения диспетчера соединений Excel в свойства окна. 

Код: plaintext
" IMEX=1;"  tells the driver to always read "intermixed" (numbers, dates, strings etc) data columns as text. 

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

Код: plaintext
1.
2.
3.
Check out the [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel] located registry
 REG_DWORD "TypeGuessRows". That's the key to not letting Excel use only the first 8 rows to guess the columns data type. 
Set this value to 0 to scan all rows. This might hurt performance. Please also note that adding the IMEX=1 option might cause the 
IMEX feature to set in after just 8 rows. Use IMEX=0 instead to be sure to force the registry TypeGuessRows=0 (scan all rows) to work.
Попробуйте поменять значение регистра и выставить IMEX = 0
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / adodb.recordset open не возвращает ничего, если..
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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