vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest środa, 01 maja 2024 roku.
Ustaw jako stronę startową Ulubione Napisz
PowrótPowrót do serwisu  RegulaminRegulamin rssRSS

  tytuł wątku:
Wątki dyskusji

Indeksy w MDB z poziomu ADO


otwartyotwarty rozpoczął: _Z_ postów: 5



napisał: jalamas
postów: 316


umieszczony:
21 sierpnia 2007
21:03

  
1. Nie pisałam o ADODB.Command, ani o ADODB.Recordset , ale o metodzie Execute obiektu Connection.
Po co powoływać do życia nowe obiekty.

2. Cytat:
rozszerzenie działało na każdym kompie

Ta... to nie jest kwestia literki X, lecz kwestia wersji ADO, ADOX użytych w referencjach aplikacji.
- powinny być zgodne
- jeśli użyjesz wersji np. 2.7 a ja mam tylko 2.5 kicha (default dla WIN XP i Office XP, o ile pamiętam...), no chyba, że użyjesz późnego wiązania i badania wersji ADO w Connection...
I to by było na tyle...
napisał: _Z_
postów: 12


umieszczony:
21 sierpnia 2007
15:30

  
Witam,

Robię to z Excela bo tak muszę. Mój klient to użytkownik Excela, a dane dostaje z innego źródła w postaci bazy danych w MDB.

Problem indeksowania już rozwiązałem. Uzywałem obiektu ADODB.Recordset zamiast ADODB.Command.

Co do ADOX, to początkowo byłem sceptyczny, zwłaszcza, że obawiałem się jego niekompatybilności (literka X -extention kazała mi uważać by to rozszerzenie działało na każdym kompie). Ponieważ ADOX jest integralną częścią MDAC to sprawa się wyjaśniła.

W rzeczywistości ADOX pewnie jest rozwiązaniem mojego problemu zarządzania indeksami.

pzdr

- Marcin

PS nie rozpisuję się bo zaraz mi sesja wygaśnie
napisał: jalamas
postów: 316


umieszczony:
21 sierpnia 2007
08:06

  
Dlaczego czynisz to od strony Excela, nie masz ACC ?

Nie musisz wykorzystywać ADOX jeżeli nie masz takiej potrzeby w innym miejscu aplikacji.
Nie ma potrzeby wykorzystywać obiektu Recordset, ponieważ instrukcja CREATE INDEX
jest instrukcją DDL, patrz metoda Execute obiektu Connection.
Jeśli indeks istnieje obsłużysz po prostu błąd.
Patrz ACC :

- Okno edycji bazy danych
- Menu/Pomoc
- zakładka Spis treści
- punkt Materiały na temat Języka Microsoft Jet SQL
- Opis Języka, Język definicji danych,
- pozycja CREATE INDEX

CREATE [ UNIQUE ] INDEX indeks
ON tabela (pole [ASC|DESC][, pole [ASC|DESC], ...])
[WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]

Doczytaj dalej

Ponadto pamiętaj, że przy takich manipulacjach baza się rozrasta, konieczne jest kompaktowanie.
Ponieważ użyłeś parametru Cnn , sadzę iż masz 1-dno połączenie do bazy, zatem ujęłam je w osobnej procedurze
Sub test()
    On Error GoTo Test_Error
    Dim Cnn As ADODB.Connection
    Set Cnn = New ADODB.Connection
    Dim bResult As Boolean
    With Cnn
        .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & SciezkaBaza & ";"
        .Open
        If .State = adStateOpen Then
            bResult = ADODBCNewIndex(objCn:=Cnn)
            If bResult Then MsgBox "OK"
        End If
    End With

Test_Exit:
    On Error Resume Next
    If Not Cnn Is Nothing Then
        With Cnn
            If .State = adStateOpen Then .Close
        End With
    End If
    Set Cnn = Nothing
    Exit Sub
Test_Error:
    MsgBox "Błąd : ( " & Err.Number & " ) " & Err.Description & vbCrLf & _
           "Procedura : " & "Test", vbExclamation
    Resume Test_Exit
End Sub



Function ADODBCNewIndex(objCn As ADODB.Connection) As Boolean
    On Error GoTo ADODBCNewIndex_Error
    Dim eSQL As String
    eSQL = "CREATE INDEX [nazwisko] ON [ludzie] ([nazwisko])"
    objCn.Execute eSQL
    ADODBCNewIndex = True

ADODBCNewIndex_Exit:
    Exit Function

ADODBCNewIndex_Error:
    ADODBCNewIndex = False
    If objCn.Errors.Count > 0 Then
        MsgBox GetErrorInformation(objCn.Errors) & vbNewLine, vbCritical + vbOKOnly, "ADO Errors"
    Else
        MsgBox "Błąd : ( " & Err.Number & " ) " & Err.Description & vbNewLine & _
               "Procedura : " & "ADODBCNewIndex", vbExclamation
    End If
    Resume ADODBCNewIndex_Exit
End Function


Public Function GetErrorInformation(ByVal oErrorColl As ADODB.Errors) As String
Dim lErrorCount As Long
Dim lErrorIndex As Long
Dim strErr As String
    lErrorCount = oErrorColl.Count
    strErr = "Errors reported by ADO" & vbCrLf
    For lErrorIndex = 0 To (lErrorCount - 1)
        With oErrorColl.Item(lErrorIndex)
            strErr = strErr & "(" & lErrorIndex + 1 & ") " & vbNewLine _
                     & "Error#: " & .Number & vbNewLine _
                     & vbTab & "Source: " & .Source & vbNewLine _
                     & vbTab & "SQL State: " & .SQLState
        End With
    Next
    GetErrorInformation = strErr
End Function

napisał: Rycho
postów: 291


umieszczony:
21 sierpnia 2007
01:27

  
Witam.
Też próbuję rozeznać się w ADO.
IMHO indeksy można utworzyć przy pomocy ADOX
Dodaj referencje do biblioteki Microsoft ADO Ext. 2.x for DDL and Security

W swoim komputerze powinieneś mieć plik pomocy do ADO np. ADO2xx.CHM

Przykładowy kod:
Sub Utwórz_Indeks()
  Const plikMDB = "C:\dane.mdb"
  Const tabela = "tblTabela"
  Const pole = "Pole1"

  Dim cat As New ADOX.Catalog
  Dim tbl As ADOX.Table
  Dim idx As New ADOX.Index

  On Error GoTo Except

  cat.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
                         "Data Source='" & plikMDB & "';"

  Set tbl = cat.Tables(tabela)

  With idx
    .Name = pole
    .Columns.Append pole
  End With

  tbl.Indexes.Append idx

Finally:
  Set cat.ActiveConnection = Nothing
  Set cat = Nothing
  Set tbl = Nothing
  Set idx = Nothing
  Exit Sub

Except:
  MsgBox Err.Source & vbNewLine & Err.Number & vbNewLine & _
         Err.Description, , "Error - Sub Utwórz_Indeks"
  Resume Finally
End Sub


Pozdrawiam Rycho
napisał: _Z_
postów: 12


umieszczony:
20 sierpnia 2007
23:02

  
Witam ponownie,

Z poziomu Excela maltretuję bazę danych w Accessie. Specjalnie użyłem określenia 'maltretuję' bo odpytywanie bazy danych jest dość czasochłonne - baza nie ma indeksów na odpowiednich kolumnach.

Czy jest możliwość zrobienia czegoś takiego:
eSQL = "CREATE INDEX IF NOT EXISTS ""nazwisko"" ON ""ludzie"" (""nazwisko"") "
rec.Open (eSQL), conn, 3, 1



Wykonałem test obciążeniowy, który wykazał (niby oczywiste), że poindeksowanie daje 26-krotne przyspieszenie w działaniu mojego Excela.

Oczywiście muszę nadmienić, że nie mogę dokonać indeksowania pliku MDB w Accessie, bo dostęp do niego jest tylko z poziomu Excela.

Pozdrawiam

- Marcin

PS dziękuję za bardzo cenną odpowiedź na moje poprzednie zapytanie


<-wstecz  1  dalej->
wszystkich stron: 1


Sortuj posty: z