INTERNET Workshop BazaDanych ASP Płytoteka

background image

INTERNET: workshop - udost pnianie bazy danych w Internecie

Płytoteka Wst p

1. Instalacja Personal Web...

2. Przygotowujemy tabele

3. Konfigurujemy ODBC

4. Najpierw projekt

5. Poł czenie z baz

6. Dodawanie nowej płyty

7. Przeszukiwanie bazy

8. Modyfikacja informacji

Marcin Nowak

Jeszcze niedawno udost pnianie baz danych przez Internet było sztuk zarezerwowan dla nielicznych. Dzi , dzi ki

darmowym narz dziom, mo e to zrobi ka dy, kto zna podstawy HTML-a oraz Visual Basica.

W CHIP-ie 1/98 przedstawili my ASP - technologi umo liwiaj c łatwe tworzenie aktywnych witryn WWW.

Poka emy, jak za jej pomoc udost pni mał baz danych, przechowuj c informacje o płytach b d cych w

posiadaniu kilku osób, na przykład kolegów z bloku czy akademika. Do tego celu wykorzystamy Personal Web Server

firmy Microsoft. Posiadacze Windows 98 maj ten program na płycie instalacyjnej systemu - u ytkowników

poprzedniej wersji "okienek" odsyłamy do kr ka doł czonego do CHIP-a 3/98, gdzie zamieszczono Option Pack.

Zarówno wersja znajduj ca si na płycie instalacyjnej Windows 98, jak i b d ca cz ci pakietu Option Pack zawieraj

ju ASP. Oczywi cie, aby udost pnia baz danych, trzeba j mie - my posłu ymy si danymi przechowywanymi w

dokumencie programu Microsoft Access.

Info

Strona po wi cona standardowi j zyka SQL: http://www.jcc.com/sql_stnd.html

Na CD w dziale CHIP-offline | Internet | Workshop:ASP znajduj si filmy ilustruj ce wybrane fragmenty artykułu oraz

pliki witryny zrealizowanej wg wskazówek zawartych w artykule

background image

1.

Instalacja Personal Web Servera

Je li posiadamy płyt instalacyjn Windows 98, proces instalacji Personal Web Servera trzeba rozpocz

od uruchomienia odpowiedniego programu z kr ka. W tym celu nale y z menu Start wybra pozycj

Uruchom i w okienku, które si pojawi, napisa x:\add-ons\pws\setup.exe, gdzie x jest liter

oznaczaj c nap d CD.

W przypadku Option Packa rozpocz cie instalacji jest jeszcze łatwiejsze - wystarczy wło y płyt do

nap du, a po uruchomieniu aplikacji do jej obsługi przej do kategorii Software | Wersje pełne, wybra

Windows NT 4.0 Server Option Pack i klikn przycisk Instaluj. Wbrew temu, co sugeruje nazwa

programu, zawiera on wersj PWS dla Windows 95.

Kolejnym krokiem jest podanie miejsca, w którym b d si znajdowały serwowane przez nas pliki.

Mo emy zostawi warto domy ln i przej do nast pnego ekranu. Tutaj instalator zapyta si o folder,

w którym ma by zainstalowany

Microsoft Transaction Server

. W tym miejscu równie nie musimy niczego zmienia - aby rozpocz

proces instalowania programu, kliknijmy tylko przycisk Dalej.

2.

Przygotowujemy tabele

W naszej bazie b dziemy udost pnia dane przechowane w plikach Accessa. Pierwsz czynno ci , jak

musimy wykona , jest przygotowanie odpowiedniej tabeli, w której b dziemy przechowywa informacje.

Po uruchomieniu Access zapyta, co chcemy zrobi . Z grupy polece Tworzy now baz danych

u ywaj c wybieramy pustej bazy danych, naciskamy OK i podajemy nazw pliku, np. CD. Po wybraniu

przycisku OK pojawi si okno z nasz baz , nie zawieraj c jeszcze adnych tabel. Nast pnie klikamy

przycisk Nowy i tworzymy odpowiednie pola. Ich nazwy oraz typy znajduj si w ramce obok. Trzy pola

s kluczami, co oznacza, e nie mog istnie rekordy maj ce identyczny tytuł płyty, artyst i wła ciciela -

jedna osoba nie mo e mie dwu takich samych płyt.

Przy próbie zamkni cia projektu Access zapyta o nazw tabeli - wpisujemy słowo "CD" i klikamy przycisk

OK. Mo emy tak e wprowadzi do tabeli kilka rekordów - kolejne b dziemy mogli doda z formularza

znajduj cego si na stronach naszego serwisu WWW.

W podobny sposób tworzymy drug tabel , która b dzie zawiera spis wła cicieli płyt oraz ich hasła

sprawdzane przy próbie modyfikacji bazy.

Plik z baz znajduje si w folderze Moje Dokumenty. Bezpieczniej jest go jednak przenie tam, gdzie

jest przechowywana reszta udost pnianych plików. Po zamkni ciu Accessa w katalogu Inepub na dysku

C: tworzymy folder DB i tam umieszczamy plik cd.mdb.

3.

Konfigurujemy ODBC

PWS, podobnie jak wi kszo programów korzystaj cych z baz danych, nie odwołuje si do nich

bezpo rednio - wszystkie operacje odbywaj si za po rednictwem ODBC. Open DataBase Connectivity

to specjalne sterowniki, umo liwiaj ce komunikowanie zarówno z profesjonalnymi serwerami baz danych,

jak i z informacjami zgromadzonymi w plikach Accessa, Excela czy nawet zbiorach tekstowych. Nie

musimy si martwi o zdobycie odpowiednich driverów - zostan zainstalowane razem z Personal Web

Serverem.

Aby skonfigurowa ODBC, otwieramy Panel sterowania i wybieramy ikon 32-bitowe ODBC. W oknie

Administrator ródeł danych ODBC, w zakładce DSN u ytkownika, klikamy Dodaj, uaktywniamy

pozycj Microsoft Access Driver (*.mdb) i naciskamy klawisz [Enter]. Na ekranie pojawi si okno

Konfiguracja ODBC Microsoft Access. Tutaj dokonujemy wła ciwej konfiguracji naszego ródła

danych. Jako Nazwa ródła danych podajemy CD, a w polu Opis wpisujemy komentarz, np. Baza CD

udost pniana przez Internet. Ostatni czynno ci jest wybranie pliku, który zawiera dane. W tym celu

klikamy Wybierz i wskazujemy zbiór o nazwie cd.mdb, który znajduje si w katalogu c:\inetpub\db.

background image

4.

Najpierw projekt

Przed przyst pieniem do tworzenia stron musimy zaplanowa struktur naszej witryny. Na stronie

głównej (default.htm), oprócz informacji wyja niaj cej co to za serwis, umie cimy trzy odno niki.

Pierwszy b dzie prowadził do strony wy wietlaj cej cał zawarto bazy (pokaz.asp), za pomoc

drugiego przejdziemy do dokumentu umo liwiaj cego przeszukiwanie zgromadzonych informacji

(szukaj.asp). Z ostatniego b d korzysta osoby, które kupiły now płyt i chc , by odpowiednie dane

znalazły si w bazie (dodaj.asp). Umo liwimy tak e usuwanie płyt z bazy (usun.asp) oraz modyfikacj

istniej cych wpisów (zmien.asp).

tabela CD:

tabela CD

Klucz

Nazwa

Typ

tak

Artysta

znakowe, 100 znaków

tak

Tytuł

znakowe, 100 znaków

tak

Wła ciciel

znakowe, 30 znaków

Wypo yczona

Tak/Nie

Rodzaj

znakowe, 20 znaków

tabela hasła:

tabela hasła

Klucz

Nazwa

Typ

tak

Imie

znakowe, 30 znaków

Hasło

znakowe, 20 znaków

5.

Poł czenie z baz

Pierwsza strona, któr przygotujemy, b dzie wy wietlała wszystkie płyty znajduj ce si w bazie. Musimy

j oczywi cie zaprojektowa , a pó niej napisa w HTML-u. Kurs tego j zyka był publikowany w CHIP-ie w

numerach 5/98 - 7/98, 9/98 i 10/98. My skupimy si na ASP (patrz: CHIP 1/98), które umo liwia

stworzenie aktywnego serwisu, pozwalaj cego odczytywa informacje z bazy, zapisywa oraz

przeszukiwa jej zawarto .

W j zyku VBScript, którego b dziemy u ywali do pisania stron ASP, otwarcie poł czenia z baz danych

jest realizowane za pomoc nast puj cych polece :

Set Conn = Server.CreateObject( "ADODB.Connection")

'On Error Resume Next

Conn.Open "DSN=CD;UID=;PWD="

Wywoływana jest metoda CreateObject obiektu Server. Jej argumentem jest nazwa innego obiektu,

umiej cego nawi zywa poł czenie z baz danych. Stworzona w rezultacie zmienna Conn zawiera

metod Open, która otwiera wła ciwe poł czenie. Aby nowo powstały obiekt Conn "wiedział", do jakiej

bazy ma si odwoła oraz aby został tam "wpuszczony", musimy poda nazw ródła ODBC,

u ytkownika oraz hasło. rodkow linijk wzi to w komentarz - chwilowo nie b dzie nam potrzebna, ale

pó niej zrobimy z niej u ytek.

Podczas

konfigurowania ródła

danych ODBC musimy

wskaza plik

zawieraj cy baz

Pami tajmy o tym, eby wszystkie polecenia VBScriptu oddziela od pozostałej zawarto ci strony

znakami <% oraz %> .

Aby odczyta co z bazy lub do niej zapisa , musimy korzysta z j zyka SQL. Jego opanowanie nie jest

trudne, ale sprawne posługiwanie si wymaga wprawy. My ograniczymy si do kilku prostych polece ,

konfigurowanie

background image

umo liwiaj cych manipulowanie naszymi danymi.

Do wydobycia wszystkich rekordów z naszej bazy, uporz dkowanych alfabetycznie po polu artysta oraz

tytul, skorzystamy z nast puj cego zapytania:

SELECT * FROM CD ORDER BY Artysta, Tytul

Takie polecenie zapiszemy w zmiennej sql, której u yjemy przy odwoływaniu si do bazy danych:

sql = "SELECT * FROM CD ORDER BY Artysta, Tytul"

Set rst = Conn.Execute(sql)

W wyniku wykonania powy szych polece zostanie zadane zapytanie, a jego wyniki znajd si w

zmiennej rst. Zawiera ona wszystkie odczytane z bazy rekordy, ale w danej chwili pozwala na

odwoływanie si tylko do jednego z nich. Chc c odczyta kolejne, musimy wywoła polecenie rst.Move-

Next, które przewija "okienko" w zbiorze rekordów na nast pny. Istnieje tak e mo liwo poruszania si

wstecz - aby to zrobi , nale y u y innej metody - rst.MovePrevious. Rst to kolekcja - zawiera wiele

zmiennych, w tym przypadku poszczególne pola rekordu, do których mo emy odwoływa si przez

nazwy. Po odczytaniu danych mo na zamkn poł czenie, wywołuj c metod Close. Je li tego nie

zrobimy, zostanie ono zamkni te automatycznie po zako czeniu wykonywania zawarto ci strony WWW.

Wypisanie na ekran tabeli z wszystkimi odczytanymi z bazy rekordami oraz zamkni cie poł czenia

realizowane jest nast puj c grup polece :

<TABLE><TR><TH>Artysta</TH>

<TH>Tytuł</TH><TH>Wła ciciel</TH>

<TH>Rodzaj muzyki</TH>

</TR>

<%Do While not rst.eof%>

<TR><TD><%=rst("Artysta")%></TD>

<TD><%=rst("Plyta")%></TD>

<TD><%=rst("Wlasciciel")%></TD>

<TD><%=rst("Rodzaj")%></TD>

<TD>

<% if rst("wypozyczona") = "1" then response.write "wypo yczona"

else response.write " "

end if%>

</TD></TR>

<%rst.movenext Loop Conn.Close%>

</TABLE>

W p tli wy wietlaj cej tabel ze spisem zgromadzonych przez nas płyt u yli my EOF: wła ciwo ci zbioru

rekordów umo liwiaj cej sprawdzenie, czy dotarli my do ostatniej porcji danych. Aby by pewnym, e na

tworzonej wła nie stronie nie wyst puje aden bł d, musimy zrobi to samo zaraz po zadaniu zapytania.

Gdyby bowiem w bazie danych nie było adnych informacji, wy wietliliby my pust tabel - znacznie

bardziej elegancko b dzie wygl dał komunikat Baza jest pusta.

Do umieszczenia czego na ekranie u yli my funkcji

Response.Write, ale je li na stronie jest du o statycznego tekstu i w niewielu miejscach wypisujemy

warto ci zmiennych, zamiast konstrukcji

<%Response.write Request("imie")%>

mo emy u ywa

<%=Request("imie")%>

Wszystkie informacje przechowywane w bazie maj polskie "ogonki" w standardzie CP-1250, tymczasem

w Internecie obowi zuje norma ISO-8859-2. Oznacza to, e przed wy wietleniem czegokolwiek musi by

dokonana konwersja. Gdyby my przechowywali dane na serwerze SQL, odpowiedni sterownik ODBC

dokonywałby jej automatycznie. Poniewa u ywamy plików Accessa, musimy robi to samodzielnie - w

tym celu napiszemy własn funkcj . U yjemy w niej funkcji Replace, która potrafi zamieni dowolny

fragment ła cucha znaków na inny, np.: test = Replace(test, " ","Q"). Nie konwertujemy wszystkich

znaków, gdy tylko literki , , , , , maj ró ne kody w obydwu standardach. Za ka dym razem, gdy

b dziemy odczytywa jakie dane z bazy, zamiast rst("nazwa_pola") b dziemy pisa

w2i(rst("nazwa_pola")). Przy zapisywaniu u yjemy funkcji wykonuj cej czynno odwrotn .

background image

6.

Dodawanie nowej płyty

Nasza witryna ma umo liwia dodawanie płyt do bazy. W tym celu na stronie WWW musimy umie ci

formularz, w którym posiadacz nowego tytułu b dzie mógł poda dotycz ce go informacje. Elementom

formularza nadamy takie nazwy, jakie maj odpowiadaj ce im pola w bazie. Znajdzie si tam równie

pole, w którym trzeba b dzie wpisa swój identyfikator oraz hasło, co uniemo liwi postronnym osobom

dokonywanie zmian. Poniewa hasła znajduj si w osobnej tabeli, na stronie wy wietlanej po wysłaniu

formularza musimy zada dwa zapytania - jedno o hasło oraz drugie, umieszczaj ce informacje w bazie.

Dane do naszej bazy

mo emy dodawa z

poziomu Accesa

Dane wysłane przez formularz znajduj si w kolekcji o nazwie Request. Odwołujemy si do nich,

podaj c nazwy pól formularza, tak samo, jak robili my to w przypadku zmiennej rst. Polecenie

konstruuj ce zapytanie o hasło b dzie wi c wygl da nast puj co (cało to jedna linia):

sql = "SELECT Imie FROM Hasla WHERE Imie = '" & Request("Wlasciciel") & "' AND haslo = '" &

Request("haslo") & "'"

Je eli po jego zadaniu wła ciwo EOF zbioru danych b dzie równa FALSE, oznacza to, e został

zwrócony jaki rekord. Istnieje wi c u ytkownik z takim hasłem i ma prawo do umieszczenia w naszej

bazie nowej płyty.

Dotychczas tylko wyci gali my informacje z bazy - aby w niej co zapisa , musimy skonstruowa nowe

zapytanie, oparte na słowie INSERT.

sql = "INSERT INTO Plyty VALUES ('"

sql = sql & Request("Artysta") & "', '"

sql = sql & Request("Tytul")

sql = sql & "', " & Request("Rodzaj")

sql = sql & ", '" & Request("Wlasciciel")

sql = sql & "', "

sql = sql & Request("Wypozyczona") & ")

Zwró my uwag , e pole Wypozyczona nie jest uj te w apostrofy. W przeciwie stwie do warto ci

pozostałych, b d cych typu tekstowego, jest ono liczb .

Mo e si zdarzy , e z jakiego powodu, na przykład usuni cia pliku z informacjami o płytach, na

naszych stronach wyst pi bł d. Mo e by on spowodowany wieloma czynnikami, których nie jeste my w

stanie przewidzie . W przypadku napotkania nieprawidłowo ci ASP przerywa wykonywanie zawarto ci

strony i wy wietla komunikat o bł dzie. Nie wygl da to zbyt profesjonalnie, tym bardziej e jest on

niezrozumiały dla typowego u ytkownika i zawiera dziwne liczby, nie mówi ce wiele zaskoczonemu

go ciowi naszej witryny. Ponadto, je li całe zdarzenie zajdzie podczas tworzenia tabeli z informacjami o

płytach, nie zostanie ona zako czona prawidłowo i jej zawarto nie b dzie widoczna - tak e komunikat o

bł dzie. Mo emy jednak go "przechwyci " i wypisa na ekranie informacj , która nikogo nie wprawi w

osłupienie.

Na stronie wy wietlaj cej zawarto naszej bazy znajduje si , wzi te w komentarz, polecenie On Error

Resume Next. Je li usuniemy pocz tkowy apostrof, wszystkie pojawiaj ce si pó niej bł dy zostan

zignorowane. Nie oznacza to jednak, e nie b dziemy o nich wiedzie i przegapimy je. Istnieje obiekt Err,

który zawiera informacje o ostatnim bł dzie. Niestety, sami musimy sprawdza , czy co si stało. Dlatego

po poleceniu, które zadaje zapytanie, umie cimy nast puj cy fragment kodu:

<% If (Err.Number <> 0) then

Response.Write "Wyst pił bł d, informacje nie zostały zapisane."

Else Response.Write "Informacje o płycie zostały zapami tane."

End if% >

Wła ciwo Number obiektu Err zawiera informacje o nu-merze bł du, który wyst pił podczas

wykonywania ostatniego polecenia. Je li nic złego si nie zdarzyło, jest ni 0. Pami tajmy o tym, e je li

w jednym miejscu wył czyli my sygnalizowanie bł dów, obowi zuje to w całym dokumencie i mo emy

nie zauwa y naszych kolejnych pomyłek. Dlatego polecenie On Error Resume Next powinno by

wzi te w komentarz, dopóki nie przekonamy si , e nasza strona działa poprawnie.

background image

7.

Przeszukiwanie bazy

Nasz serwis nie byłby w pełni funkcjonalny, gdyby nie miał mo liwo ci przeszukiwania zgromadzonych w

nim informacji. Pierwsz czynno ci jest przygotowanie odpowiedniego formularza. B dzie on umo liwiał

przeszukiwanie bazy po dowolnym polu. Jego przykładowy kod znajduje si w ramce na poprzedniej

stronie.

Pierwsz czynno ci , która zostanie wykonana po wysłaniu formularza, powinno by sprawdzenie, czy

był on wypełniony. Je li nie, u ytkownika ode lemy do strony, która wy wietla cał zawarto bazy.

U yjemy tzw. przekierowania, czyli komendy protokołu HTTP, wysyłaj cej informacj o nowej lokalizacji

strony.

Poniewa wszystkie nagłówki HTTP (równie ten o przekierowaniu) s wysyłane przed zawarto ci

strony, odpowiednie polecenia VBScriptu musz znale si na samym pocz tku pliku ASP.

Nasza baza umo liwia

przeszukiwanie

zgromadzonych w niej

danych

Po sprawdzeniu, e formularz nie został wypełniony, wysyłamy przekierowanie i ko czymy wykonywanie

strony:

If Request("artysta")="" AND Request("tytul")="" AND Request("wlasciciel")=""

then Response.Redirect ("http://" & Request.ServerVariables("SERVER_NAME") & "pokaz.asp")

Response.End

Gdyby my nie wykonali ostatniego polecenia, zawarto strony zupełnie niepotrzebnie byłaby dalej

przetwarzana.

Je li formularz został wypełniony, musimy skonstruowa zapytanie, które "wydob dzie" z bazy

odpowiednie informacje. B dzie si ono zaczyna nast puj co:

sql = "SELECT * from Płyty WHERE "

Tre zapytania oznacza: "Wybierz z tabeli Płyty takie całe rekordy, w których...". Teraz po słowie

WHERE musz nast pi polecenia okre laj ce, jakie warunki musz spełnia wyszukane rekordy.

Poniewa zakładamy, e go naszej witryny mo e zna tylko cz

nazwy płyty albo zespołu, zamiast

znaku =, do porównywania u yjemy operatora SQL-a LIKE i znaków %. Te ostatnie działaj podobnie jak

gwiazdki przy listowaniu zawarto ci katalogu w DOS-ie - zast puj dowolny ci g znaków. Dzi ki temu po

podaniu słowa "blue" w ród odpowiedzi znajd si zarówno "Kind of blue", jak i "Still got the blues".

Zakładamy, e je li które z trzech pól formularza nie zostało wypełnione, mo e mie dowoln warto .

Cz

zapytania dotycz c artysty formułujemy nast puj co:

<%

If Request("artysta") <> ""

then sql = sql & "artysta LIKE '%"

sql = sql &

Request("artysta") & "%' "

end if

%>

Podobnie post pujemy w przypadkach pozostałych dwu pól. Je li nasze zapytanie jest nieprawidłowe i

wywołuje bł d, dobrze jest, bezpo rednio przed jego zadaniem, wypisa na ekranie warto zmiennej

sql; pozwoli nam to przeanalizowa zapytanie. Najcz stsz przyczyn bł dów s nie domkni te

apostrofy lub operator AND znajduj cy si na ko cu.

Formularz do przeszukiwania zawarto ci bazy

Podaj kryteria wyszukiwania:

<FORM ACTION="szukaj.asp">

Artysta: <INPUT TYPE="TEXT" NAME="artysta"> <BR>

Tytuł: <INPUT TYPE="TEXT" NAME="tytul"> <BR>

Wła ciciel: <INPUT TYPE="TEXT" NAME="wlasciciel"> <BR>

wyszukiwanie w naszej bazie

background image

Wypo yczona:

<SELECT NAME="wypozyczona">

<OPTION VALUE=""> oboj tnie

<OPTION VALUE="0"> nie

<OPTION VALUE="1"> tak

</SELECT>

<INPUT TYPE="Submit" VALUE="Szukaj"

</FORM>

8.

Modyfikacja informacji

Ostatnimi funkcjami, w jakie wyposa ymy nasz baz , jest mo liwo modyfikowania wpisów oraz ich

usuwania. Najlepiej, na li cie płyt, obok ka dej pozycji zrobi odno niki prowadz ce do dokumentów

wykonuj cych odpowiednie operacje. Musimy to wykona tak, by na wywołanej stronie było wiadomo,

który rekord chcemy usun lub zmodyfikowa . W tym celu do tego dokumentu przekazujemy parametry,

które pó niej odczytamy z kolekcji Request. Umie cimy je w odno niku prowadz cym do omawianej

strony, by wygl dał on np. tak (całe polecenie musi by w jednej linii):

<A HREF="usun.asp?tytul=Cisza & artysta=Budka+Suflera">usu </A>

Zwró my uwag na + zast puj cy spacje. Jest wiele znaków, które nie mog wyst pi w URL-u i dlatego

ASP ma specjaln funkcj - Server.URLEncode - która zamienia spacje na plusy, a pozostałe

niechciane znaki na ci g %nn, gdzie nn to kod znaku w systemie szesnastkowym. Niestety, nie istnieje

aden gotowy mechanizm wykonuj cy czynno odwrotn - nale y napisa własn funkcj . W projekcie

serwisu umieszczonym na płycie CD doł czonej do magazynu, znajduje si ona w pliku drequest.inc.

Aby zmodyfikowa informacje o wybranej płycie, najpierw musimy je odczyta , nast pnie wy wietli w

formularzu i po naci ni ciu przez u ytkownika przycisku Zapisz zapisa w bazie. Oczywi cie, za ka dym

razem musimy pami ta o sprawdzaniu hasła, by tylko wła ciciel mógł dokona zmian.


Wyszukiwarka

Podobne podstrony:
INTERNET ZASTOSOWANIA Workshop PHP Apache Płytoteka
INTERNET Workshop SklepInternetowyPerl MySQL
INTERNET Workshop SklepInternetowyPerl1
INTERNET Workshop Język Perl Apache
ASP NET 2 0 Tworzenie witryn internetowych z wykorzystaniem C i Visual Basica aspntw
ASP NET 2 0 Tworzenie witryn internetowych z wykorzystaniem C i Visual Basica aspntw
informatyka asp net 3 5 tworzenie portali internetowych w nurcie web 2 0 omar al zabir ebook
Adverbs (zebrane patrz worksheets z internetu w folderze język angielski) 2
ASP NET Web Forms Kompletny przewodnik dla programistow interaktywnych aplikacji internetowych w Vis
ASP NET Web Forms Kompletny przewodnik dla programistow interaktywnych aplikacji internetowych w Vis
ASP NET Web Forms Kompletny przewodnik dla programistow interaktywnych aplikacji internetowych w Vis
ASP NET 3 5 Tworzenie portali internetowych w nurcie Web 2 0 aspn35

więcej podobnych podstron