Два вопроса по ADO (OpenSchema & FieldAttributeEnum)

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Шмульке
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 21.08.2003 (Чт) 8:17
Откуда: Владивосток

Два вопроса по ADO (OpenSchema & FieldAttributeEnum)

Сообщение Шмульке » 07.04.2004 (Ср) 7:53

День бодрый всем !

ПЕРВОЕ (OpenSchema)

Есть замечательный метод - OpenSchema, который имеет таинственный параметр - Criteria (документация Майкрософт обходит его молчанием)

Код: Выделить всё
Set RS_T = CN.OpenSchema(adSchemaColumns, "TABLE_NAME=""MyTable""")

(что-то наверное типа этого......но этот код не роботает !)

Если кто использовал его для конкретизации выборки - дайте пожалуйста примерчик

ВТОРОЕ (FieldAttributeEnum):

Допустим значение Attributes=90.... но в этом перечислимом типе нет такого элемента со значением 90 :x
Думается, что это какая-то сумма констант.. :?: (из этого Enum)

Подскажите как можно ПРАВИЛЬНО извлечь инфу о поле (например adFldMayBeNull и adFldLong)

Надеюсь понятно выражался...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.04.2004 (Ср) 9:11

if attributes and adFldMayBeNull then ...
if attributes and adFldLong then ...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Это Array

Сообщение Konst_One » 09.04.2004 (Пт) 14:04

работает так:

set rs=cn.OpenSchema(adSchemaColumns,Array(Catalog,SchemaName,TableName,Null,Null))

Шмульке
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 21.08.2003 (Чт) 8:17
Откуда: Владивосток

Сообщение Шмульке » 12.04.2004 (Пн) 4:36

2 Konst_One: коллега, спасибо все работает именно так как нужно ! :P

2 GSerg: тоже спасибо, хотя воспользоваться советом не удалось (OpenSchema дает ответы на эти вопросы :!: )


Возникает другой вопрос (думаю, он тоже в рамках топика) :

Открывая таблицу в режиме "Конструктор" в MS Access, в свойстве поля можно найти свойство "Пустые Строки" (Да/Нет)

Вот это свойство метод OpenSchema почему-то не передает :? (может не считает нужным ? :wink: )

Не подскажите как "достучаться" до этого свойства ("Пустые Строки") ?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.04.2004 (Пн) 9:35

Может быть стоит подключить ADOX и смотреть через каталог (ADOX.Catalog)? Это поудобнее будет, чем через OpenSchema.
Lasciate ogni speranza, voi ch'entrate.

Шмульке
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 21.08.2003 (Чт) 8:17
Откуда: Владивосток

Сообщение Шмульке » 13.04.2004 (Вт) 5:15

2alibek: Коллега, спасибо :!: ADOX - вещь весьма полезная (respect)

но тут же наткнулся на новый трабл (код упрощен)

Код: Выделить всё
Dim i As Byte

Set CN = New ADODB.Connection
CN.ConnectionString = "......."
CN.Open

Set c = New ADOX.Catalog
Set c.ActiveConnection = CN

For i = 1 To c.Tables("MyTable").Columns.Count
    Debug.Print c.Tables("MyTable").Columns(i).Name
Next i

выскакивает ошибка
Iten cannot be found in the collection corresponding to the requested name or ordinal


одним словом нельзя двигаться по коллекции с помощью переменной i

уже в отладчике в окне Immediate выставляешь вместо i еденицу - все работает :?:

с нетерпением жду советов и гипотез :lol:

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 13.04.2004 (Вт) 13:27

Код: Выделить всё
For i = 1 To c.Tables("MyTable").Columns.Count -1
next i

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 13.04.2004 (Вт) 13:28

Но, если тебе надо все колонки пройти то нужно с нуля 0 начинать, а не с 1, как у тебя написано

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 13.04.2004 (Вт) 20:07

Вообще-то, при работе с коллекциями рекомендуется использовать цикл For Each - он там намного быстрее. Заодно избавишься от головной боли со стартовыми индексами.

Шмульке
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 21.08.2003 (Чт) 8:17
Откуда: Владивосток

Сообщение Шмульке » 14.04.2004 (Ср) 2:56

спасибо всем ответившим ! :D

2 Konst_One: да, дейтвительно движение правильней начинать с i=0, но это не ничего не меняет (ошибка остается)

А вот совет Ennor действительно помог ! :P (personal thanks) как-то подзабыл я этот приемчик...

Сомнение: не стану биться об заклад, но всегда думал, что цикл For Each МЕДЛЕННЕЕ чем движение со счетчиком (For i=0 To...)
Даже кажется видел статью на www.vbstreets.ru на тему оптимизации кода (там об этом было сказано)

Проблема решена, но все равно не ясно почему нельзя двигаться по коллекции с помощью итератора (может специфика библиотеки ? :? )

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.04.2004 (Ср) 8:49

Нужно двигаться с 0 до .Count-1. Если в коллекции 10 элементов и начинается с нулевого, то последний элемент будет 9, а не 10.
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 14.04.2004 (Ср) 11:10

Шмульке писал(а):Сомнение: не стану биться об заклад, но всегда думал, что цикл For Each МЕДЛЕННЕЕ чем движение со счетчиком (For i=0 To...)

Внутри коллекция есть не что иное, как двунаправленный связанный список с доп. индексацией. При простом цикле ты каждый раз юзаешь индекс, так что накладки довольно высоки. А при For Each ты просто используешь *Next в каждом конкретном элементе. Согласись, что переход по конкретному указателю _намного_ быстрее определения адреса произвольного объекта (а коллекция не знает, что ты итерируешь именно в цикле, для нее каждое обращение по индексу - обращение к произвольному элементу). Даже переход по ключу (если он есть) и то быстрее работает.
Отсюда, соотв-но, делай выводы, когда коллекции нужны, а когда лучше использовать массивы.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.04.2004 (Ср) 15:05

Коллекция суть COM-объект, а именно IDispatch, имеющий в своём составе метод с DispID=-4. Этот метод вызывается для получения указателя на очередной элемент коллекции при итерации for each. А вот каким образом реализовано получение этого указателя - сказать нельзя, ибо COM объект является чёрным ящиком, и можно написать жутко неэффективный NewEnum.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 15.04.2004 (Чт) 16:55

GSerg писал(а):Коллекция суть COM-объект, а именно IDispatch, имеющий в своём составе метод с DispID=-4. Этот метод вызывается для получения указателя на очередной элемент коллекции при итерации for each. А вот каким образом реализовано получение этого указателя - сказать нельзя, ибо COM объект является чёрным ящиком, и можно написать жутко неэффективный NewEnum.

:) :) :) Ты говоришь о том, как она выглядит снаружи, а я говорю о том, что у нее сидит внутри. Собеседование с пристрастием с проектировщиками VB 5 дало совершенно однозначный результат - внутри это действительно двунаправленный линкед лист. Почитай МакКинни.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2004 (Пт) 9:17

Скорее всего так оно и есть, список - самый удобный способ.
Но то, что ты говоришь, скорее всего относится к классу VB Collection. А коллекция Fields может быть организована и по другому.
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 16.04.2004 (Пт) 11:52

1000 к одному, что также. Это же Microsoft, они велосипедов не изобретают. Как правило... :)
В книжке Брюса макКинни "Hardcore Visual Basic" он пишет, что сам общался с разработчиками VB (Thunder Project, как он у них там называется), и они это подтвердили.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList