Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Неверное определение type / 25 сообщений из 38, страница 1 из 2
17.06.2010, 13:16
    #36692131
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверное определение type
Есть програма на 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
17.06.2010, 13:19
    #36692143
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверное определение type
Вот из-за этой в частноти беды я и отказался от работы с экселем через ODBC и стал работать через COM
...
Рейтинг: 0 / 0
17.06.2010, 13:20
    #36692146
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверное определение type
если в самом экселе проставить ` в начале столбца то будет стринговый тип
...
Рейтинг: 0 / 0
17.06.2010, 13:26
    #36692169
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверное определение type
Shocker.Pro не расстраивай меня, должен же быть выход


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Надо смотреть, как будет по скорости с большими файлами
...
Рейтинг: 0 / 0
17.06.2010, 15:42
    #36692664
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверное определение type
> Автор: 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
17.06.2010, 15:45
    #36692676
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверное определение type
Игорь Горбонос,

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

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




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

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

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

Он, по всей видимости, определяет по среднему.
Ну и опять же, ты же не можешь гарантировать, что стороннее приложение не выдаст тебе числа в первых 16-ти позициях.
Поэтому я и спросил про 1, думал, может по заголовкам столбцов решит, что все является только текстом... не выгорело
...
Рейтинг: 0 / 0
17.06.2010, 16:15
    #36692810
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверное определение type
Игорь, прикольная ссылка . Действительно удобно описано.
...
Рейтинг: 0 / 0
17.06.2010, 16:39
    #36692928
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверное определение type
> Автор: 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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Неверное определение type / 25 сообщений из 38, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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