Strona 1 z 1

Połączenie z sieciową bazą danych. [Subiekt GT]

Nowy postNapisane: środa, 27 maja 2009, 15:08
przez Ho88it
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:
    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.
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().
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);
► 
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.

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.