Centrum Skryptów - Microsoft Office

Jak usunąć zbiór rekordów z bazy danych Access Database?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak usunąć zbiór rekordów z bazy danych Access Database?

Cześć, Skrypciarze! Mam bazę danych programu Access, używaną do śledzenia zasobów powiązanych z wszystkimi moimi projektami. Od czasu do czasu muszę do niej zajrzeć i usunąć wszystkie rekordy związane z określonym projektem. Czy mogę to robić za pomocą skryptu?

-- WK

Cześć, WK. Z uwagi na fakt, że nie było nas prawie trzy tygodnie, mam teraz wiele do nadrobienia. Na przykład nie miałem okazji wspomnieć, że minister zdrowia dr Steven K. Galson uznał, że Święty Mikołaj powinien pójść na dietę. „To naprawdę ważne, aby ludzie cieszący się szacunkiem dzieci i będący dla nich wzorem do naśladowania mieli ładną sylwetkę, dobrze się odżywiali i uprawiali sporty” – tak właśnie stwierdził nasz minister zdrowia w odniesieniu do Św. Mikołaja.

W przeciwieństwie do większości ludzi mieszkających w USA, mnie te słowa nie zmartwiły. Po pierwsze, nie znam zbyt wielu dzieci, dla których Św. Mikołaj jest wzorem do naśladowania; czyli kimś, kim chciałyby stać się w przyszłości. Można z pewnością stwierdzić, że chociaż wielu ludzi lubi Św. Mikołaja, naprawdę niewielu chciałoby być Św. Mikołajem. (Mimo odlotowego czerwonego kostiumu.)

Prawdę mówiąc, kiedy przeczytałem słowa dr Stevena K. Galsona, krytykujące styl życia Św. Mikołaja, poczułem pewną ulgę. W końcu, jeżeli taki minister zajmuje się atakowaniem wymyślonej postaci, może to oznaczać tylko tyle, że wszystkie inne problemy ze zdrowiem zostały rozwiązane. Biedny nasz minister nie ma co zrobić ze swoim czasem.

Uwaga. Tak naprawdę dr Steven K. Galson nie jest ministrem zdrowia, tylko pełniącym obowiązki ministra zdrowia. To oznacza, że możemy mieć do czynienia z walką pomiędzy dwoma wymyślonymi postaciami, Św. Mikołajem i pełniącym obowiązki ministra zdrowia USA.

Coś jak Obcy kontra Predator.

Szczerze mówiąc, mnie to wszystko wydaje się tylko burzą w szklance wody. W końcu każdy wie, kim naprawdę chcą zostać dzieci jak dorosną. Skrypciarzami! I wcale nie dlatego, że Skrypciarze mają ładną sylwetkę (chyba, że okrągła też się liczy), dobrze się odżywiają i uprawiają sporty. Głównym powodem jest fakt, że w przeciwieństwie do Św. Mikołaja i doktora Stevena K. Galsona, Skrypciarze potrafią napisać skrypt usuwający zbiór rekordów z bazy danych Microsoft Access:

Const adOpenStatic = 3

Const adLockOptimistic = 3



Set objConnection = CreateObject("ADODB.Connection")

Set objRecordSet = CreateObject("ADODB.Recordset")



objConnection.Open _

    "Provider = Microsoft.Jet.OLEDB.4.0; " & _

        "Data Source = C:\Scripts\Test.mdb" 



objRecordSet.Open "DELETE * FROM Projects WHERE " & _

    "ProjectName = 'Workstation Upgrade'", objConnection, adOpenStatic, adLockOptimistic



objConnection.Close

Jak widać, usunięcie zbioru rekordów z bazy danych nie wymaga dużo pracy (ani kodu). Na początek definiujemy parę stałych (adOpenStatic oraz adLockOptimistic), ustawiając wartość każdej z nich na 3. Nie będę ich dzisiaj szczegółowo omawiał, wystarczy, że wspomnę, iż: 1) używane są do konfiguracji parametrów otwierania bazy danych i tabeli bazy danych; oraz 2).

Tak się nawet składa, że ten webcast został ostatnio ogłoszony trzecim najlepszym świątecznym filmem wszech czasów, zaraz po To wspaniałe życie oraz Prezent pod choinkę. Jesteśmy z tego bardzo dumni, biorąc pod uwagę fakt, iż ten webcast nie ma nic wspólnego ze Świętami Bożego Narodzenia i nawet nie jest filmem.

Uwaga. To ostatnie stwierdzenie mogło zostać zmyślone. Muszę jeszcze raz zajrzeć do źródeł i jeszcze do tego wrócę.

Po zdefiniowaniu dwóch stałych tworzymy wystąpienia dwóch obiektów. Obiekt ADODB.Connection, jak sama nazwa wskazuje, jest obiektem odpowiedzialnym za połączenie z bazą danych Access; obiekt ADODB.Recordset to obiekt, który zajmie się zbiorem rekordów, który pobierzemy z bazy danych. (Zawsze, gdy pobierzemy dane z bazy danych, będą one zbiorem rekordów.) Po utworzeniu tych dwóch obiektów używamy metody Open do otwarcia pliku bazy danych C:\Scripts\Test.mdb:

objConnection.Open _

    "Provider = Microsoft.Jet.OLEDB.4.0; " & _

        "Data Source = C:\Scripts\Test.mdb"

Cóż, należy Wam się jedno wyjaśnienie: poprzedni kod współpracuje z bazą danych Access wcześniejszą niż Office 2007. Jeżeli używacie tego skryptu do pracy z bazą danych Access 2007, instrukcja Open musi wyglądać trochę inaczej, w szczególności należy zastosować inne rozszerzenie. (.accdb zamiast .mdb) oraz zmodyfikować wartość Provider. Innymi słowy, należy zastosować ten oto wiersz kodu:

objConnection.Open _

    "Provider = Microsoft.ACE.OLEDB.12.0; " & _

        "Data Source = C:\Scripts\Test.accdb"

Zakładamy tutaj, że plik Test.mdb zawiera wszystkie informacje związane z projektem; w szczególności zakładamy, że Test.mdb zawiera tabelę o nazwie Projects. Zakładamy też, że tabela Projects zawiera pole o nazwie ProjectName. Teraz przypuśćmy, że chcemy usunąć wszystkie rekordy odnoszące się do projektu o nazwie Workstation Upgrade; innymi słowy, że chcemy usunąć wszystkie rekordy, których nazwa ProjectName to Workstation Upgrade. Jak to zrobić? No cóż, teraz kiedy już mamy połączenie z bazą danych, możemy to zrobić, wykonując poniższy wiersz kodu:

objRecordSet.Open "DELETE * FROM Projects WHERE " & _

    "ProjectName = 'Workstation Upgrade'", objConnection, adOpenStatic, adLockOptimistic

Kluczową częścią jest tutaj kwerenda SQL. Większość z nas wie, jak napisać kwerendę SQL pobierającą dane z tabeli bazy danych; czyli kwerendę wyglądającą tak:

SELECT * FROM Projects WHERE ProjectName = 'Workstation Upgrade'

Jak zapewne wiecie, ta kwerenda przekazuje wszystkie rekordy z tabeli Projects, których nazwa ProjectName to Workstation Upgrade. Spójrzmy teraz na naszą kwerendę SQL, która usuwa z tabeli Projects wszystkie rekordy z nazwą ProjectName równą Workstation Upgrade:

DELETE * FROM Projects WHERE ProjectName = 'Workstation Upgrade'

Wygląda znajomo? Jak się okazuje, jedyną różnicą pomiędzy pobieraniem zbioru rekordów a usuwaniem zbioru rekordów jest to, że w celu pobrania rekordów używamy słowa kluczowego SELECT, a do ich usunięcia – słowa DELETE. Dopóki o tym pamiętamy, wszystko jest w porządku.

Nawiasem mówiąc, nie pozwólmy zmylić się nazwie używanej metody – Open. W pewnym sensie otwieramy zbiór rekordów: tak naprawdę otwieramy go tylko na chwilę wystarczającą, aby usunąć z niego rekordy. Podczas używania tej metody, zbiór rekordów automatycznie się otwiera i zamyka; jak zapewne zauważyliście, na końcu skryptu używamy metody Close w celu zamknięcia połączenia z bazą danych, ale nie mamy żadnego kodu zamykającego zbiór rekordów. Jest tak dlatego, że nie musimy takowego używać, żeby zamknąć zbiór rekordów. W rzeczywistości, gdybyśmy dodali wiersz objRecordset.Close, wygenerowalibyśmy błąd w stylu „Nie można zamknąć czegoś, co nawet nie jest otwarte” i w tym momencie nastąpiłaby awaria skryptu.

O jeden wiersz mniej do napisania. Możecie uznać to z spóźniony prezent świąteczny od Skrypciarzy.

I to by było na tyle. I nie przejmujcie się tak słowami krytyki skierowanymi pod adresem Św. Mikołaja. W końcu od zawsze przedstawiamy był jako korpulentna postać. Ktoś widział kiedyś Św. Mikołaja bez brzucha? To mogłoby wzbudzić podejrzenia odnośnie do jego prawdziwości. Dlatego wszyscy przebierańcy wkładają sobie poduszkę pod to odlotowe czerwone wdzianko.

 Do początku strony Do początku strony

Centrum Skryptów - Microsoft Office