Połączenie z sieciową bazą danych. [Subiekt GT]
Napisane: środa, 27 maja 2009, 15:08
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:
Lista Komponentów:
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ą:
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:
III. Konfiguracja programu
IV. Kod programu
Pobieranie nazw baz danych realizuje klasa TSession przez funkcję GetDatabaseNames().
Pobieranie nazw tabel zrealizowane jest w zdarzeniu OnClick komponentu ComboBox1.
Składnia funkcji GetTableNames(AnsiString DatabaseName, AnsiString Pattern, bool Extensions, bool SystemTables, TStrings * List);
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.
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.
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.
I gotowe!
Teraz jak mamy już dostęp do bazy danych, możemy rozwijać nasz program dalej.
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:
- 1. Zainstalowane oprogramowanie wraz z serwerem bazy danych,
2. Połączenie sieciowe z bazą (zbędne jeżeli serwer jest uruchomiony lokalnie),
3. Konfiguracja aliasu bazy (przygotowanie bazy subiekta do obsługi)
4. Ś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.
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.
IV. Kod programu
Pobieranie nazw baz danych realizuje klasa TSession przez funkcję GetDatabaseNames().
- Kod: Zaznacz cały
__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);
►
- Kod: Zaznacz cały
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.
- Kod: Zaznacz cały
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.
- Kod: Zaznacz cały
//---------------------------------------------------------------------------
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.