powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Неверное определение type
25 сообщений из 38, страница 1 из 2
Неверное определение type
    #36692131
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть програма на VBA, которая цепляется через ADODB к excel-евским файлам и читает их содержимое в Рекордсет средством sql запроса.

код процедуры "цепляния" такой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
Public Sub GetWorksheetData(ByVal strSourceFile As String, ByVal strSQL As String, ByRef Massiv() As Variant, ByRef MassivHead() As Variant)
Dim cn As ADODB.Connection
Dim rstTemp As ADODB.Recordset

Set cn = New ADODB.Connection
cn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DriverId=790;ReadOnly=True;" & "DBQ=" & strSourceFile & ";"
Set rstTemp = New ADODB.Recordset

rstTemp.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText

Erase Massiv
Erase MassivHead
    x =  0 
        With rstTemp
        Do While Not .EOF
                    .MoveNext
                      x = x +  1 
            Loop
    End With

ReDim Massiv( 1  To x,  1  To rstTemp.Fields.Count) As Variant
ReDim MassivHead( 1  To  2 ,  1  To rstTemp.Fields.Count) As Variant

rstTemp.MoveFirst
            ' создание шапки
                For i =  0  To rstTemp.Fields.Count -  1 
                MassivHead( 1 , i +  1 ) = rstTemp.Fields(i).Name
                MassivHead( 2 , i +  1 ) = rstTemp.Fields(i).Type
                Next i
            ' создание массива данных
            
            For J =  0  To x -  1 
                For i =  0  To rstTemp.Fields.Count -  1 
                Massiv(J +  1 , i +  1 ) = rstTemp.Fields(i)
                Next i
            rstTemp.MoveNext
            Next J

rstTemp.Close
cn.Close

Set rstTemp = Nothing
Set cn = Nothing

End Sub

при этом на входе подаются такие данные

Шапка1 Шапка2Слово 10000Слово 10000Слово 10000Слово 10000_1Слово 10000_1Слово 10000


Проблема в том, что при чтении поле 2 определяется как тип 5-числовое, а должен быть как тип 200 - т.е. текстовое и в итоге в рекордсете эти поля (где текст) получается null. Т.е. рекордсет возвращает такой массив

Шапка1 Шапка2Слово 10000Слово 10000Слово 10000Слово NULLСлово NULLСлово 10000

В чем может быть трабла?

p.s. GuessRow менял
...
Рейтинг: 0 / 0
Неверное определение type
    #36692143
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот из-за этой в частноти беды я и отказался от работы с экселем через ODBC и стал работать через COM
...
Рейтинг: 0 / 0
Неверное определение type
    #36692146
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если в самом экселе проставить ` в начале столбца то будет стринговый тип
...
Рейтинг: 0 / 0
Неверное определение type
    #36692169
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro не расстраивай меня, должен же быть выход


Konst_Oneесли в самом экселе проставить ` в начале столбца то будет стринговый тип

это конечно хороший вариант, но сюда не подходит. Поясню.
У меня файл к которому я обращаюсь сгенерирован другим приложением, изменить приложение будет очень тяжело.

По факту получается надо зайти в этот файл, обработать "нужные" поля и закрыть, потом к нему подсасываться. Но это само по себе некошер, потому, что если я его буду открывать (файл) то смысл его потом закрывать и обрабатывать, проще сразу создать массив variant и наполнять из открытого файла.


интересует есть ли такое решение как предопределенный тип поля рекордсета. Просто я ADODB толком не умею настраивать для connect-а
...
Рейтинг: 0 / 0
Неверное определение type
    #36692175
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если GuessRow=1?
...
Рейтинг: 0 / 0
Неверное определение type
    #36692200
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

не получается потестить к сожалению
админских прав нет

сейчас в службу тех поддержки обращусь попробую
...
Рейтинг: 0 / 0
Неверное определение type
    #36692208
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusShocker.Pro,

не получается потестить к сожалению
админских прав нет

сейчас в службу тех поддержки обращусь попробую

Microsoft???
...
Рейтинг: 0 / 0
Неверное определение type
    #36692212
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

нет не микрософт, большая компания...
...
Рейтинг: 0 / 0
Неверное определение type
    #36692223
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

а еще попутно такой вопрос, я отказался от открытия файла, т.к. файл может быть большим и ADODB sql запросом цепляется только к тому листу, который мне нужен.

а открытие файла через COM по сути равноценно обычному открытию, т.е. файл например размером 40 мб, будет открываться 10-15 секунд, так?
...
Рейтинг: 0 / 0
Неверное определение type
    #36692226
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanusа открытие файла через COM по сути равноценно обычному открытию, т.е. файл например размером 40 мб, будет открываться 10-15 секунд, так?

Да, верно.
В аксессе есть классная штука - TransferSpreadsheet
Ща поковырял, вроде это свойственно только аксессу.
...
Рейтинг: 0 / 0
Неверное определение type
    #36692229
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProShamanusа открытие файла через COM по сути равноценно обычному открытию, т.е. файл например размером 40 мб, будет открываться 10-15 секунд, так?
Да, верно.
В аксессе есть классная штука - TransferSpreadsheet
Ща поковырял, вроде это свойственно только аксессу.
А то, глядишь, если файлы такого размера, может дешевле запустить аксесс как СОМ и через него высосать данные
...
Рейтинг: 0 / 0
Неверное определение type
    #36692242
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

через джеёёпппу можно и проще, разработчика той проги попинать, чтобы он символом ' предопределял тип поля.
...
Рейтинг: 0 / 0
Неверное определение type
    #36692271
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proа если GuessRow=1?
не получилось
...
Рейтинг: 0 / 0
Неверное определение type
    #36692307
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если что выкладываю пример в виде файла

в архиве 2 файла, подключающийся и тестовый.
...
Рейтинг: 0 / 0
Неверное определение type
    #36692334
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, так ты из экселя подключаешься...

Попробуй покопаться в установлении связей между двумя книгами
Что-то типа формулы в ячейке:
"=[Книга1]Лист1!$A$1"

Тогда вторичная книга полностью открываться вроде бы не будет.
...
Рейтинг: 0 / 0
Неверное определение type
    #36692336
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точнее
=[c:\Книга1.xls]Лист1!$A$1
...
Рейтинг: 0 / 0
Неверное определение type
    #36692500
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

хмм
т.е. создать виртуальный com объект,
там на листе создать ссылки на лист существующей книги объекта.
загрузить содержимое в массив.

Так?
...
Рейтинг: 0 / 0
Неверное определение type
    #36692516
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanusт.е. создать виртуальный com объект,
Зачем?
У тебя же есть текущая книга, в ней и лепи.
Ставишь ссылки(у) и считываешь в массив. На крайняк можно скрытый лист завести.

Надо смотреть, как будет по скорости с большими файлами
...
Рейтинг: 0 / 0
Неверное определение type
    #36692664
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shamanus
> Ну если что выкладываю пример в виде файла

Измени запрос на
Код: plaintext
1.
2.
strSQL = "SELECT SH1.""Ввод/вывод"", SH1.""Время внесения"", SH1.Группа, SH1.""Дата начала"", {fn 
CONVERT(SH1.КодПост, SQL_VARCHAR)}, SH1.Компьютер, SH1.Консолидация, SH1.""Мин#"", SH1.Наименование, SH1.Подгруппа, 
SH1.Пользователь, SH1.Сеть FROM ""C:\1\ТЕСТОВЫЙ"".""Лист3$"" SH1;"

И будет в нужном месте 200
Только счастья все равно не получишь, потому что по нескольким первым(1-3??? может можно и больше, не знаю) строкам
определяется тип данных в столбце. И это все равно числа. Так вот. После вычитки всего что может быть понятно как число,
а все непонятное как число Nullится и после, уже при выполнении самого запроса все Nullы фильтруются и не попадают в
результат. Как вариант, можно попробовать отыскать ключ в реестре, который отвечает за количество строк, по которым
определяется тип данных столбца, разыскать и изучить документацию по этому значению. Мне видится такая возможность -
установтиь количиство строк для определения типа данных равным порядка 60000. и тогда можно выполнять мой запрос, потому
что если выполнять твой запрос то могут попастся данные, в которых в этом поле будут только числовые коды.
НО! это если ТАК можно будет сделать.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Неверное определение type
    #36692676
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,

Не выйдет.
TypeGuessRow от 1 до 16
...
Рейтинг: 0 / 0
Неверное определение type
    #36692691
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл дописать
Если мой склероз меня не подводит, то где искать ключ в реестре знает Shocker.Pro
А почитать насчет всяких фенечек в запросах ОДБЦ можно
здесь , но мне удобнее читать
здесь . И только если что-то
непонятно, читать первую ссылку

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Неверное определение type
    #36692768
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
Да, забыл дописать
Если мой склероз меня не подводит, то где искать ключ в реестре знает
А почитать насчет всяких фенечек в запросах ОДБЦ можно
здесь , но мне удобнее читать
здесь . И только если что-то
непонятно, читать первую ссылку




Игорь, Shocker.Pro, спасибо за полный ответ

странно, что даже при GuessRow=16, все равно в данном конкретном случае возвращается результат тип 5. Хотя текстовое значение уже в строке 9.

буду думать или заставлю стороннее приложение описывать типы в полях (ставить апострофы перед числовыми величинами) или действительно полистовой импорт (но этого если честно не хочется)
...
Рейтинг: 0 / 0
Неверное определение type
    #36692805
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanusстранно, что даже при GuessRow=16, все равно в данном конкретном случае возвращается результат тип 5. Хотя текстовое значение уже в строке 9.

Он, по всей видимости, определяет по среднему.
Ну и опять же, ты же не можешь гарантировать, что стороннее приложение не выдаст тебе числа в первых 16-ти позициях.
Поэтому я и спросил про 1, думал, может по заголовкам столбцов решит, что все является только текстом... не выгорело
...
Рейтинг: 0 / 0
Неверное определение type
    #36692810
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь, прикольная ссылка . Действительно удобно описано.
...
Рейтинг: 0 / 0
Неверное определение type
    #36692928
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> Поэтому я и спросил про 1, думал, может по заголовкам столбцов решит, что все является только текстом... не
> выгорело

Что-бы первую строку интерпретировало как данные, в строке подключения нужно было указывать в строке подключения HDR=No,
что тоже не выход.
Кстати! На любимом сайте написанно:
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.
Правда это относится только к Provider=Microsoft.Jet.OLEDB.4.0 или действует на все драйверы, непонятно

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Неверное определение type
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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