powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Неверное определение type
38 сообщений из 38, показаны все 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
Неверное определение type
    #36692964
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносЧто-бы первую строку интерпретировало как данные, в строке подключения нужно было указывать в строке подключения HDR=No,что тоже не выход.

Почему, очень даже выход в данном случае.
Все поля определятся как текст, и затащится все, что есть, а преобразование сделаем на лету.
...
Рейтинг: 0 / 0
Неверное определение type
    #36693015
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProИгорь ГорбоносЧто-бы первую строку интерпретировало как данные, в строке подключения нужно было указывать в строке подключения HDR=No,что тоже не выход.

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

т.е. вместо сего

Код: plaintext
cn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DriverId=790;ReadOnly=True;" & "DBQ=" & strSourceFile & ";"

так
Код: plaintext
cn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DriverId=790; HDR=No;ReadOnly=True;" & "DBQ=" & strSourceFile & ";"

?
...
Рейтинг: 0 / 0
Неверное определение type
    #36693019
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так не сработало
...
Рейтинг: 0 / 0
Неверное определение type
    #36693039
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему именно ОДБЦ драйвер, а не Provider=Microsoft.Jet.OLEDB.4.0???

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Неверное определение type
    #36693053
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то все дюже примитивно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Sub Main()
    Dim cn As New ADODB.Connection, _
        r As New ADODB.Recordset, _
        sExcelFile As String

    sExcelFile = App.Path & "\Test.xlsx"

    cn.CursorLocation = adUseClient
    cn.mode = adModeRead
    cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=""" & sExcelFile & """;Mode=Read;Extended Properties=""Excel 8.0;HDR=No;IMEX=1"""
    
    r.Open "SELECT * FROM [a1:b65536]", cn, adOpenStatic, adLockReadOnly

    Debug.Print "Test 1:", r( 0 ).Name, r( 0 ).Type, r( 0 ), r( 1 ).Name, r( 1 ).Type, r( 1 )
    
    r.Close

    r.Open "SELECT 1 AS F1, '' AS F2 FROM [a1:b1] WHERE F1<>F1 UNION SELECT * FROM [a1:h65536]", cn, adOpenStatic, adLockReadOnly

    Debug.Print "Test 2:", r( 0 ).Name, r( 0 ).Type, r( 0 ), r( 1 ).Name, r( 1 ).Type, r( 1 ).DefinedSize, r( 1 )
End Sub
...
Рейтинг: 0 / 0
Неверное определение type
    #36693057
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: 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 или действует на все драйверы, непонятно



Спасибо!!!! На тестовых файлах сработало. (я про TypeGuessRows=0 )
Сейчас погоняю по папке :)
...
Рейтинг: 0 / 0
Неверное определение type
    #36693069
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusСпасибо!!!! На тестовых файлах сработало. (я про TypeGuessRows=0 )
Сейчас погоняю по папке :)

Только вот лазить в подобные настройки реестра крайне нежелательно.
...
Рейтинг: 0 / 0
Неверное определение type
    #36693364
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFShamanusСпасибо!!!! На тестовых файлах сработало. (я про TypeGuessRows=0 )
Сейчас погоняю по папке :)

Только вот лазить в подобные настройки реестра крайне нежелательно.

почему?
...
Рейтинг: 0 / 0
Неверное определение type
    #36693421
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusAndrFShamanusСпасибо!!!! На тестовых файлах сработало. (я про TypeGuessRows=0 )
Сейчас погоняю по папке :)

Только вот лазить в подобные настройки реестра крайне нежелательно.

почему?

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

Тот пример что я вам дал вполне рабочий, простой и не требует правки реестра - используйте его.
...
Рейтинг: 0 / 0
Неверное определение type
    #36693431
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз:

Код: plaintext
1.
r.Open "SELECT 1 AS F1, '' AS F2 FROM [a1:b1] WHERE 1<>1 UNION ALL SELECT * FROM [a1:b65536]", cn, adOpenStatic, adLockReadOnly

Здесь мы первым SELECT-ом определяем формат столбцов, а вторым читаем данные в соответствии с этим форматом.

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

А лист как указывать в таком формате?
...
Рейтинг: 0 / 0
Неверное определение type
    #36693806
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAndrF,

А лист как указывать в таком формате?

[МойЛист$a1:b1] или ['Мой лист$'a1:b1]
...
Рейтинг: 0 / 0
Неверное определение type
    #36694043
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFShamanusAndrFShamanusСпасибо!!!! На тестовых файлах сработало. (я про TypeGuessRows=0 )
Сейчас погоняю по папке :)

Только вот лазить в подобные настройки реестра крайне нежелательно.

почему?

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

Тот пример что я вам дал вполне рабочий, простой и не требует правки реестра - используйте его.

ааа, Вы про это,
я в курсе что не хорошо, просто это не пользовательский комп. Этот комп имеет основной целью подключение к файлам данных. Эдакий отчетный "сервер".

А по поводу Вашего кода пока не получается запустить. Ругается на втором селекте. Буду разбираться.

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


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