Pobranie nazw tabel w bazie Access, brak dostępu

0

Aby w bazie Access pobrać listę tabel należy wykonać zapytanie:

SELECT Name FROM MSysObjects WHERE Type = 1;

Jednak to zwraca błąd braku uprawnień odczytu tabeli MSysObjects [systemowa, ukryta tabela].

Przekopałem nieco net, większość odpowiedzi to dodanie uprawnień poprzez narzędzia Accessa [przykład], jednak ani ja, ani odbiorca programu, który piszę w C# .NET, nie ma środowiska Access. Poza tym - ów program będzie obrabiał wiele takich plików baz Accessa, więc ręczna ich edycja nie wchodzi w rachubę.

Pytanie zatem: jak programowo pobrać spis tabel w bazie bez zmuszania człowieka do ustawiania ręcznie praw? (Albo jak te prawa programowo dodać)
Ewentualnie usatysfakcjonuje mnie odpowiedź jak sprawdzić, czy w danej bazie istnieje tabela o nazwie XYZ (jakieś bardziej eleganckie rozwiązanie, niż "SELECT TOP 1 1 FROM XYZ;" i sprawdzanie, czy zwróciło "1" czy błąd braku XYZ).

[edited]
Wykonałem to w ten sposób, ale nie czuję, że jest to profesjonalne podejście do sprawy (choć spełnia założenie w 100%).

        private bool AccessCheckTableExists(string table)
        {
            bool exists = false;
            try
            {
                AccessConnection.Open();
                OleDbCommand command = new OleDbCommand();

                command.Connection = AccessConnection;
                command.CommandText = "SELECT TOP 1 1 FROM " + table;

                OleDbDataReader reader = command.ExecuteReader();
                if (reader.Read())
                    exists = reader.GetString(0).Equals("1");
                reader.Close();
            }
            catch
            {
                exists = false;
            }
            finally
            {
                AccessConnection.Close();
            }
            return exists;
        }
0

Nazwa bazy może być złudna: "Pobranie nazw tabel w bazie Access, brak dostępu" :-D

0

A po polsku? Nie zrozumiałem przesłania.

0

Marooned: chodziło mu pewnie o to, że ktoś może pomyśleć, że te "access, brak dostępu", to coś w stylu "access denied, czyli brak dostępu" i wtedy rzekomo nie wiadomo, o jaką bazę chodzi w temacie :D

0
Marooned napisał(a)

A po polsku? Nie zrozumiałem przesłania.

"access" to po angielsku "dostęp", w związku z tym fragment tematu "(...) w bazie Access, brak dostępu" fajnie brzmi... bo jeśli w bazie o nazwie "dostęp" ktoś ma problem "brak dostępu" to zrobiła się zabawna gra słów...

A tak z innej beczki, to z tego co wiem (choć nigdy w praktyce tego nie używałem), to MS Access ma słabo rozwinięty interfejs do podłączania się z poziomu kodu. Biorąc pod uwagę to, że SQL Server 2005 jest darmowy, to może lepiej rozważyć zmianę systemu bazodanowego?

0

Z ciekawości sprawdzałem czy w ADO.NET jest jakiś odpowiednik javowego DatabaseMetaData. Natrafiłem na taki artykuł:
http://my.execpc.com/~gopalan/dotnet/ado_net/ado.net_retrieving_database_metadata.html
Na dotnetach się nie znam, więc nie mogę ocenić jego jakości, ale jest tam jakaś funkcja RetrieveTableInformation, która listuje tabele.
Może się przyda.

0

No tak.. dlatego użyłem wielkiego 'A' aby zaznaczyć, że chodzi o nazwę własną a nie wyraz angielski :)

idziewiosna: wierz mi, że choćby mnie żelazkiem przypalano to bym sam bazy Access nie wybrał. W takiej bazie trzymane są obecnie dokumenty Archiwum Państwowego i moją magisterką przenoszę te dane do innego systemu bazodanowego aby udostępnić je publicznie przez sieć Internet.

rotgut - dzięki za szperanie, zajrzę jutro, bo właśnie na ognisko pędzę ;)

Ale myślę, że zostanę już przy kodzie z pierwszego postu, bo od paru dni sprawdza się znakomicie. Co nie oznacza, że nie zamierzam pogłębić swej wiedzy w tej dziedzinie i link przejrzę :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0