Artykuły opracowane przez HoBBit'a.
Połączenie z sieciową bazą danych. [Subiekt GT]
Użyte nazwy produktów lub nazwy zastrzeżone są własnością ich prawnych właścicieli i zostały tu użyte jedynie w celach edukacyjnych. Autor nie ponosi odpowiedzialności za szkody wynikające z działalności czytelnika.
Z uwagi na znikomą ilość tematów o
bazach danych, postanowiłem się podzielić doświadczeniem jakie zebrałem katując
się nad trywialnymi, z aktualnego punktu widzenia, problemami.
Pierwsza rzecz jaką udało mi się zaliczyć do dużego sukcesu jest podpięcie się
do bazy danych programu "Subiekt GT". Oto krótki tutorial jak to zrobić.
I. Przygotowanie
Co potrzeba:
Zainstalowane oprogramowanie wraz z serwerem bazy danych,
Połączenie sieciowe z bazą (zbędne jeżeli serwer jest uruchomiony lokalnie),
Konfiguracja aliasu bazy (przygotowanie bazy subiekta do obsługi)
Środowisko C++ Borlanda.
Lista Komponentów:
TComboBox [2x] - zakładka "Standard"
TDBGrid [1x] - zakładka "Data Controls"
TDataSource [1x] - zakładka "Data Access"
TTable [1x] - zakładka "BDE"
TSession [1x] - zakładka "BDE"
1. Konfigurujemy alias bazy SubiektaGT,
2. Wszystkie potrzebne komponenty wrzucamy na formę,
3. Konfigurujemy połączenia między komponentami.
Mamy 3 sposoby na konfigurację połączenia naszego programu z bazą:
1. podanie ścieżki do pliku bazy danych znajdującego się na dysku,
2. podanie nazwy bazy danych lokalnej lub sieciowej,
3. podanie nazwy sesji.
My użyjemy trzeciego sposobu.
II. Konfiguracja aliasu bazy SubiektaGT
Przedstawię tu konfigurację za pomocą narzędzia Źródła danych ODBC co
pozwoli ominąć ograniczenia stworzone przez środowisko Borlanda, które
nie pozwalają uruchomić programu bez zainstalowanego silnika BDE (np.
komputer kolegi).
Przechodzimy kolejno:
1. START
® Panel Sterowania
® Narzędzia Administracyjne
® Źródła danych
(ODBC)
2. Przechodzimy do zakładki [Systemowe DSN]
3. Naciskamy przycisk
[Dodaj...], z listy wybieramy "SQL Serwer" i
naciskamy przycisk [Zakończ].
Pokazuje się nam nowe okienko gdzie przeprowadzimy konfigurację dla
połączenia.
4. W pole [Nazwa] wpisujemy np: "Edu_SubiektGT"
5. W polu opis możecie wpisać co wam się podoba.
6. W polu [Serwer] należy wybrać ten serwer którego ścieżka dostępu
kończy się "..\INSERTGT" (np: SERWER\INSERTGT). Klikamy
[Dalej>].
7. Wybieramy opcję Uwierzytelniania serwera SQL za pomocą identyfikatora
logowania.
8. Jako identyfikator logowania wpisujemy "sa"
i hasło zostawiamy puste. Klikamy [Dalej>].
9. Zaznaczamy opcję "Zmień domyślną bazę danych na.." i wybieramy tą do
której chcemy się podłączyć (może być wyświetlonych więcej jak jedna).
Klikamy [Dalej>].
10. Zaznaczamy opcję "Zmień język komunikatów systemowych serwera SQL
na: " i wybieramy z listy "Polish". Klikamy [Zakończ].
11. Klikamy {Testuj źródło danych..}.
Jeżeli wszystko poszło dobrze to powinniśmy przejść test śpiewająco.. W
innym wypadku piszcie posty i pytajcie..
III. Konfiguracja programu
1. Nadajemy nazwę dla naszej sesji. Wpisujemy w polu SessionName
komponentu Session1 dowolną nazwę sesji unikając polskich znaków (ja
nadam jej nazwę "nowa").
2. W polu SessionName komponentu Table1 wybieramy naszą nazwę sesji (Edu_SubiektGT).
3. W polu DataSet komponentu DataSource1 wybieramy Table1.
4. W polu DataSource komponentu DBGrid1 wybieramy DataSource1.
Teraz możemy przejść do kodowania naszego programu.
IV. Kod programu
Pobieranie nazw baz danych realizuje klasa TSession przez funkcję
GetDatabaseNames().
//--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { Session1->GetDatabaseNames(ComboBox1->Items); //pobiera wszystkie nazwy baz ComboBox1->ItemIndex = 0; //ustawia się na górze listy Table1->ReadOnly = true; //na potrzeby edukacyjne zapis zablokowany } //--------------------------------------------------------------------------- |
Pobieranie nazw tabel zrealizowane jest w
zdarzeniu OnClick komponentu ComboBox1.
Składnia funkcji:
GetTableNames(AnsiString
DatabaseName, AnsiString Pattern, bool Extensions, bool SystemTables, TStrings *
List);
AnsiString DataBaseName - Ustala nazwę bazy
do obsługi. U nas pobierzemy nazwę z ComboBox1 właściwości Text
AnsiString Pattern - Można wyświetlić nazwy
baz z filtrem np:"*a" zostaną wyświetlone bazy których nazwa kończy się na a
bool Extensions - definiuje czy do nazwy ma
się zaliczać rozszerzenie pliku bazy danych (dla bazy SQL ustaw na false)
bool SystemTables - Ustaw SystemTables na
true dla baz danych opartych na SQL dla zwracania tabel systemowych i tabel
danych definiujących strukturę bazy. Dla baz Paradox i dBASE ustaw na false.
TStrings * List - Lista klasy String do
której zostaną wpisane wszystkie nazwy tabel z bazy.
Podczas wyboru bazy danych w uruchomionym programie, może pojawić się komunikat
o podanie loginu i hasła. W bazie Subiekta GT domyślny login to bodajże
sa i
hasło puste.
//--------------------------------------------------------------------------- void __fastcall TForm2::ComboBox1Click(TObject *Sender) { Session1->GetTableNames(ComboBox1->Text, "", true, false, ComboBox2->Items); //pobiera nazwy tabel do ComboBox2 ComboBox2->ItemIndex = 0; //ustawia się na górze listy } //--------------------------------------------------------------------------- |
Podczas zmiany bazy danych należy wyczyścić listę tabel, w innym przypadku odwołamy się do tabeli która nie istnieje w nowej bazie danych i program zgłosi błąd. Funkcję tą najlepiej jest wywoływać gdy ComboBox1 zostanie przez użytkownika rozwinięte, czyli w zdarzeniu OnDropDown.
//--------------------------------------------------------------------------- void __fastcall TForm2::ComboBox1DropDown(TObject *Sender) { ComboBox2->Items->Clear(); //czyści listę tabel } //--------------------------------------------------------------------------- |
Teraz nie pozostało nam nic innego jak wczytać zawartość tabeli do kontrolki DBGrid1. Aby to zrobić nie trzeba nawet znać nazw kolumn. Całą procedurę umieszczamy w zdarzeniu OnClick kontrolki ComboBox2.
//--------------------------------------------------------------------------- void __fastcall TForm2::ComboBox2Click(TObject *Sender) { Table1->Active = false; //zapobiega otwarciu otwartej już tabeli Table1->DatabaseName = ComboBox1->Text; //przypisuje nazwę bazy danych Table1->TableName = ComboBox2->Text; //przypisuje nazwę tabeli Table1->Active = true; //wyświetla wybraną tabelę } //--------------------------------------------------------------------------- |
I gotowe!
Teraz jak mamy już dostęp do bazy danych, możemy rozwijać nasz program dalej.
Alias sieciowej bazy danych przez ODBC zamiast BDE [MS Access]
Użyte nazwy produktów lub nazwy zastrzeżone są własnością ich prawnych właścicieli i zostały tu użyte jedynie w celach edukacyjnych. Autor nie ponosi odpowiedzialności za szkody wynikające z działalności czytelnika.
Większość osób konfiguruje Aliasy
baz danych przez BDE. W systemie Windows XP istnieje jednak narzędzie w pełni
zastępujące narzędzie Borlanda. Mowa tu o ODBC. Nie jestem pewien, czy jest ono
dostępne od momentu instalacji systemu czy instalacji serwera SQL (tak że proszę
o komentarz).
Omówię to narzędzie na przykładzie bazy danych programu MS Access z użyciem
komponentów BDE.
Lista niezbędników:
Plik bazy danych programu MS Access umieszczony na serwerze zawierający przynajmniej jedną tabelę z nazwanymi kolumnami.
Zainstalowany program MS Access.
Aktywne połączenie sieciowe.
Narzędzie zarządzania źródłem danych ODBC.
Otwieramy kolejno: START
®
Panel Sterowania
®
Narzedzia Administracyjne
®
Źródła danych ODBC
Zostaje uruchomiona aplikacja znajdująca się w katalogu "system32" pod
nazwą "odbcad32.exe"
Domyślnie pokazuje się nam zakładka [DSN użytkownika]. Zdefiniowane tu źródła
danych nie będą widoczne w sieci, choć lokalizacja pliku bazy może być sieciowa.
Jeżeli konfigurujemy SERWER (rozumiany jako hardware) który ma obsługiwać bazę i
inne komputery mają łączyć się do Serwera Bazy Danych (rozumianego jako software
np: MSSql Serwer) należy przejść do zakładki [Systemowe DSN].
Na liście są wyświetlone aktualnie istniejące Aliasy baz danych. My utworzymy
nowy Alias pozwalający na połączenie się z bazą danych znajdującą się na
komputerze o nazwie sieciowej "SERWER" w pliku "test.accdb".
Klikamy {Dodaj..}
Z listy sterowników wybieramy ten który obsługuje nowy format Access'a z rozszerzeniem *.accdb (u mnie 9-ty od góry)
Klikamy {Zakończ} lub 2 razy w wybrany sterownik.
W polu "Nazwa źródła danych" wpisujemy dowolną nazwę (ja wpiszę "AliasTestowy") która będzie Aliasem dla połączenia z bazą.Klikamy {Wybierz}.
Klikamy {Sieć} jeżeli zasoby znajdują się na innym komputerze.
Wyskoczy nam okno kreatora dysków sieciowych. Należy wybrać literę dysku pod jaką będzie zdefiniowana ścieżka dostępu do katalogu z plikiem bazy danych.Wpisujemy ścieżkę dostępu jeżeli ją znamy lub klikamy {Przeglądaj..} jeżeli nie jesteśmy pewni jak ją wpisać.
Wybieramy z udostępnionych folderów ten w którym umieściliśmy plik "test.accdb" (u mnie \\SERWER\BAZY_DANYCH ). Klikamy {Zakończ}.
Kreator zakończył pracę i powróciliśmy do poprzedniego okienka. Teraz po lewej stronie powinna być wypisana w moim przypadku nazwa pliku "test.accdb" (jeżeli jej nie ma, to znaczy że plik nie istnieje lub wybraliśmy zły folder źródłowy w pkt.9 ).
Klikając {Zaawansowane} można zdefiniować szczegóły dostępu do pliku takie jak "ReadOnly" którego ustawienie na 1 zabezpieczy bazę przed zapisem.
Klikamy {OK} i już możemy się pochwalić nowym Aliasem.
Ważne !! Przy korzystaniu z plików Access'a nie jest wymagane połączenie przez komponenty ODBC ponieważ jest to jedyny plik Microsoftu do którego można połączyć się przez komponenty BDE wykorzystując sterownik MSACCESS. Warunkiem jest jednak posiadanie zainstalowanego Access'a na komputerze.
opracował: HoBBit.