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;
}