Переход с DAO на ADO: непонятки

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Переход с DAO на ADO: непонятки

Сообщение Nicky » 27.11.2006 (Пн) 14:01

Жизнь заставила перейти на ADO.
Первый же день - проблема. Описываю:
Требуется получить список таблиц в БД (*.mdb)
Есть опциональный список допустимых паттернов и исключительных паттернов (т.е. sPattern = "ware%;ch%", sExPattern = "msys%;tmp%")
Код: Выделить всё
If Len(sPattern) > 0 Then sCriteria = "(TABLE_NAME like '" & Join(Split(sPattern, ";"), "' or TABLE_NAME like '") & "')"
If Len(sExPattern) > 0 Then sCriteria = sCriteria & IIf(Len(sCriteria) > 0, " and ", "") & "(TABLE_NAME not like '" & Join(Split(sExPattern, ";"), "' and TABLE_NAME not like '") & "')"
Set rs = cn.OpenSchema(adSchemaTables)
rs.Filter = sCriteria

Вываливается в ошибку, что аргумент не того типа, вне допустимого диапазона или конфликтует хз с кем
После некоторого количества кругов, описанных вокруг костра с бубном в руках, пришел к следующему:
не работает конструкция NOT LIKE. Т.е. в простейшем приближении
rs.Filter = "TABLE_NAME like 'ware%'" - работает
rs.Filter = "TABLE_NAME not like 'ware%'" - не работает
rs.Filter = "not (TABLE_NAME like 'ware%')" - не работает
В чем косяк?!!

Текст функции:
Код: Выделить всё
Function ADOTableList(sBase As String, v, Optional sPattern As String, Optional sExPattern _
  As String, Optional cn As ADODB.Connection, Optional sConnStr As String = cConnStr, _
  Optional sErr As String) As Boolean
  Dim bCN As Boolean, sCriteria As String, s As String
  On Error GoTo er
 
  If Not ADOOpen(sBase, sConnStr, cn, bCN, sErr) Then Err.Raise clERROR, , sErr
 
  If Len(sPattern) > 0 Then sCriteria = "(TABLE_NAME like '" & Join(Split(sPattern, ";"), "' or TABLE_NAME like '") & "')"
  If Len(sExPattern) > 0 Then sCriteria = sCriteria & IIf(Len(sCriteria) > 0, " and ", "") & _
    "(TABLE_NAME not like '" & Join(Split(sExPattern, ";"), "' and TABLE_NAME not like '") & "')"
  With cn.OpenSchema(adSchemaTables)
    .Filter = sCriteria
    If Not .EOF Then
      Do Until .EOF
        s = s & Null2Str(!TABLE_NAME) & vbLf
        .MoveNext
      Loop
      v = Split(left$(s, Len(s) - 1), vbLf)
    End If
    .Close
  End With
  ADOTableList = True
  GoTo ok

er:
  sErr = Err.Description
ok:
  If bCN Then cn.Close: Set cn = Nothing
End Function

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

Сообщение GSerg » 27.11.2006 (Пн) 15:16

Criteria string — a string made up of one or more individual clauses concatenated with AND or OR operators.

Operator must be one of the following: <, >, <=, >=, <>, =, or LIKE


То есть нету оператора NOT в числе допустимых.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 27.11.2006 (Пн) 15:49

Т.е. NOT недопустим в свойстве Filter, хорошо (т.е. плохо)
Тогда можно ли как-то через cn.OpenSchema(adSchemaTables, Array(Empty, Empty, sCriteria)) (у меня не получилось, но может что не так делаю)? Чувствую, придется делать перебором...

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

Сообщение Konst_One » 27.11.2006 (Пн) 15:53

нет,
придется в цикле отфильтровывать

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 27.11.2006 (Пн) 15:57

Konst_One писал(а):нет,
придется в цикле отфильтровывать

Это я и имел в виду. Всем спасибо

EDIT: в принципе, не страшно: инклюжены накладываю фильтром, а эксклюжены проверяю в цикле


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

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

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

    TopList