470 likes | 613 Views
Systemy i Narzędzia Baz Danych z Dostępem Przez Internet. Gliwice 2004. ASP.NET cz.2. Agenda. 1. Web Forms 1.1 Kontrolki HTML 1.2 Kontrolki sieci WWW 1.3 Kontrolki sprawdzania poprawności 1.4 Tworzenie kontrolek użytkownika 1.5 Tworzenie kontrolek dostosowanych 2. ADO.NET 2.1 ADO
E N D
Systemy i Narzędzia Baz Danych z Dostępem Przez Internet Gliwice 2004 ASP.NET cz.2
Agenda • 1. Web Forms • 1.1 Kontrolki HTML • 1.2 Kontrolki sieci WWW • 1.3 Kontrolki sprawdzania poprawności • 1.4 Tworzenie kontrolek użytkownika • 1.5 Tworzenie kontrolek dostosowanych • 2. ADO.NET • 2.1 ADO • 2.2 ADO.NET • 2.3 Różnice między ADO i ADO.NET • 2.4 Przykład ADO.NET • 2.5 OLEDBConnection • 2.6 OLEDBCommand • 2.7 OLEDBDataReader • 2.8 OLEDBAdapter • 2.9 DataSet, DataTable, DataColumn, DataRow, DataRelation, DataView
Agenda • 3. Usługi sieciowe XML • 3.1 Usługi sieciowe XML • 3.2 Przykład wykorzystania • 4. Literatura
1. Web Forms Web Forms • nowy model programistyczny ASP.NET, za pomocą którego tworzymy programowalne strony internetowe • pozwalają na implementację logiki aplikacji i wysyłanie na wyjściu znaczników HTML • oparte na CLR, możliwość korzystania z wszystkich zalet tej technologii • można tworzyć za pomocą zwykłego edytora tekstowego
1 Prosty formularz w Web Forms • Obsługa prostego formularza logowania w Web Forms ASP.NET jeden skrypt – login.aspx <html> <head> <script language="vb" runat="Server"> Sub Button1_Click(source as Object, e As EventArgs) If User.Value.Equals("kowalski") And Pass.Value.Equals("haslo") Then tekst.InnerHtml="Poprawne logowanie" Else tekst.InnerHtml=" Logowanie nieudane" End If End Sub </script> </head> <body>
1 Prosty formularz w Web Forms <form runat=server> <table> <tr> <td>użytkownik:</td> <td><input id=User runat=server></td> </tr> <tr> <td>hasło:</td> <td><input id=Pass type=password runat=server></td> </tr> <tr> <td colspan=2><input type=submit OnServerClick="Button1_Click" value="Wyślij" runat=server></td> </tr> </table> </form> <p><span id="tekst" runat=server /> </body></html>
1.1 Kontrolki HTML Kontrolki HTML • każda kontrolka ma związany z nią znacznik HTML, który reprezentuje • kontrolki te należą do przestrzeni nazw System.Web.UI.HtmlControls i pochodzą z klasy bazowej HtmlControl • możliwość dynamicznego dodawania kontrolek poprzez ich programowe tworzenie • deklaracja przy użyciu standardowego znacznika HTML - aby instancja reprezentująca związaną kontrolkę została utworzona na serwerze musi być użyty atrybut runat=server. Wtedy możemy się do niej odwoływać. <input type=text value= "wartosc" runat=server>
1.1 Kontrolki HTML Kontrolki HTML oraz związane z nimi znaczniki HTML
1.2 Kontrolki sieci WWW Kontrolki sieci WWW • kontrolki podobne do kontrolek HTML, niektóre pokrywają się z nimi, inne są dużo bardziej skomplikowane • kontrolki te należą do przestrzeni nazw System.Web.UI.WebControls i pochodzą z klasy bazowej WebControl, po której dziedziczą model obiektowy np. właściwości takie jak: ForeColor, BackColor, BorderColor, Enabled, Font, Height, Width • kontrolki tego typu mogą dostosowywać swój wygląd do możliwości i typu przeglądarki • możliwość dynamicznego dodawania kontrolek poprzez ich programowe tworzenie • deklaracja przy użyciu składni XML przy użyciu prefiksu asp <asp:TextBox type=text id="nazwa" text="wartosc" runat=server></asp:TextBox>
1.2 Kontrolki sieci WWW Wybrane właściwości, metody i zdarzenia klasy WebControl • Właściwości • BackColor - kolor tła kontrolki • BorderColor - kolor obramowania kontrolki • ForeColor - kolor pierszoplanowy kontrolki • EnableViewState - czy kontrolka ma podtrzymywać swój stan widoku na serwerze • Enabled - dostępność kontrolki • Visible - czy kontrolka ma być wyświetlana • Metody • DataBind - przeprowadza proces wiązania danych ze żródła • Zdarzenia • DataBinding - zgłaszane podczas wiązania danych na sewerze • Init - zgłaszane gdy kontrolka jest inicjowana • Load - zgłaszane gdy kontrolka jest ładowana do obiektu Page • PreRender - zgłaszane gdy kontrolka przystępuje do wyświetlania swej zawartości • Unload - zgłaszane gdy kontrolka jest usuwana
1.2 Kontrolki sieci WWW Wybrane kontrolki sieci WWW • Dane w formularzach oraz nawigacja • TextBox - pole tekstowe do wpisywania danych • DropDownList - lista rozwijalna • ListBox - lista opcji • CheckBox - pole wyboru • RadioButton - pole typu radio • Button - wyświetla przycisk zatwierdzający formularz • LinkButton - odpowiednik wykorzystujący hiperłącze • ImageButton - odpowiednik wykorzystujący obrazek • HyperLink - łącze nawigacyjne • Statyczna zawartość oraz prezentacja danych • Label - wyświetla tekst statyczny • Image - wyświetla obrazek • Table - tworzy tabelę • Repeater - wyświetla dane zgodnie ze zdefiniowanymi elementami HTML • DataGrid - wyświetla dane ze źródła w postaci tabeli • DataList - wyświetla dane ze źródla w postaci listy
1.2 Kontrolki sieci WWW • Przykład wykorzystania kontrolek Label oraz Button <html><head> <script language="VB" runat="server"> Sub Button1_Click(Sender As Object, e As EventArgs) Message.Text = "Przesłany tekst" End Sub Sub Message_Load(Sender As Object, e As EventArgs) Message.Text = "Początkowy tekst" End Sub </script></head><body> <form runat="server"> <asp:Label id="Message" Font-Name="Verdana" Font-Size="14pt" Width="200px" BorderStyle="solid" BorderColor="red" ForeColor="blue" BackColor="yellow" OnLoad="Message_Load" runat="server"/> <p> <asp:Button id="Button1" Text="Zmień tekst" OnClick="Button1_Click" Runat="server"/> </form> </body></html>
1.2 Kontrolki sieci WWW • Przykład wykorzystania kontrolki ListBox <html><head> <script language="VB" runat="server"> Sub Button1_Click(sender As Object, e As EventArgs) If ListBox1.SelectedIndex > -1 Then Message.Text=ListBox1.SelectedItem.Text End If End Sub </script></head><body> <form runat=server> <asp:ListBox id=ListBox1 Rows=3 SelectionMode="Multiple" runat="server"> <asp:ListItem>Tekst numer 1</asp:ListItem> <asp:ListItem>Tekst numer 2</asp:ListItem> <asp:ListItem>Tekst numer 3</asp:ListItem> </asp:ListBox> <asp:Button Text="Wypisz tekst" OnClick="Button1_Click„ runat="server"/> <p><asp:Label id="Message" runat="server"/> </form></body></html>
1.2 Kontrolki sieci WWW • Przykład wykorzystania kontrolek Table, TableCell, TableRow <html> <head> <script language="VB" runat="server"> Sub Button1_Click(Sender As Object, e As EventArgs) Dim i as integer Dim nr As TableRow nr = new TableRow() For i = 1 To 2 Dim nc As TableCell nc = new TableCell() nc.Controls.Add(new LiteralControl("3 , " & i )) nr.Cells.Add(nc) Next i Table1.Rows.Add(nr) End Sub </script> </head>
1.2 Kontrolki sieci WWW <body> <form runat="server"> <asp:Table id="Table1" GridLines="Both" runat="server"> <asp:TableRow> <asp:TableCell> 1 , 1 </asp:TableCell> <asp:TableCell> 1 , 2 </asp:TableCell> </asp:TableRow> <asp:TableRow> <asp:TableCell> 2 , 1 </asp:TableCell> <asp:TableCell> 2 , 2 </asp:TableCell> </asp:TableRow> </asp:Table> <p> <asp:Button id="Button1" Text="Dodaj trzeci wiersz„ OnClick="Button1_Click" Runat="server"/> </form> </body> </html>
1.2 Proste przykłady • Proste przykłady Web Forms • LabelButton przykład, źródła • Listbox przykład, źródła • Table przykład, źródła
1.3 Kontrolki sprawdzania poprawności Kontrolki sprawdzania poprawności • kontrolki sieci WWW pozwalające na sprawdzanie poprawności innych kontrolek sieci WWW formularza • wygodna i spójna metoda validacji danych po stronie serwera oraz klienta
1.3 Kontrolki sprawdzania poprawności Wspólne atrybuty kontrolek sprawdzania poprawności • Id - identyfikator kontrolki • ControlToVaildate - Id kontrolki, która będzie sprawdzana • Display - sposób wyświetlania, możliwe opcje • None - informacja o błędzie nie będzie wyświetlana • Static - statyczne miejsce do wyświetlania informacji o błędzie • Dynamic - dynamiczne miejsce do wyświetlania informacji o błędzie • Font-Name - czcionka wykorzystywana do wyświetlania informacji • Font-Size - rozmiar czcionki wykorzystywanej do wyświetlania informacji • ErrorMessage - informacja wyświetlana w przypadku wystąpienia błędnych danych
1.3 Kontrolki sprawdzania poprawności Kontrolki spradzania poprawności • ReqiuredFieldValidator - sprawdza czy dana kontrolka jest wypełniona • CompareValidator - porównuje zawartość danej kontrolki do zawartości innej kontrolki • RangeValidator - sprawdza czy dane w kontrolce są z podanego zakresu • RegularExpressionValidator - sprawdza czy dane w kontrolce są zgodne z podanym wyrażeniem regularnym • CustomValidator - wykorzystuje do sprawdzania zdefiniowaną przez programistę metodę sprawdzania poprawności • ValidationSummary - wyświetla wszystkie błędy w postaci jednej listy
1.3 Kontrolki sprawdzania poprawności • Składnia kontrolki RequiredFiledValidator <asp:RequiredFieldValidator ControlToValidate="Nazwa" Display="Dynamic" Font-Name="verdana" Font-Size="10pt" ErrorMessage="Treść" runat=server /> • Przykład wykorzystania kontrolki RequiredFiledValidator <html> <body> <form runat="server"> Wymagany tekst:<asp:textbox id="Tekst" runat="server" /> <asp:RequiredFieldValidator ControlToValidate="Tekst" runat="server" text="Pole nie może być puste" /> <p><asp:button text="OK" runat="server" /> </form> </body> </html>
1.3 Kontrolki sprawdzania poprawności • Składnia kontrolki RangeValidator <asp:RangeValidator Type= "Date" ControlToValidate="Nazwa" Display="Dynamic" Font-Name="verdana" Font-Size="10pt" MinimumValue= "01/01/2005" MaximumValue= "31/12/2005" ErrorMessage="Treść" runat=server /> • Przykład wykorzystania kontrolki RangeValidator <html><body> <form runat="server"> Data:<asp:textbox id="Tekst" runat="server" /> <asp:rangevalidator runat="server" type="date" controltovalidate= "Tekst" minimumvalue="2005-01-01" maximumvalue="2005-12-31" errormessage="Wpisz datę od 2005-01-01 do 2005-12-31." /> <p><asp:button text="OK" runat="server" /> </form> </body></html>
1.3 Kontrolki sprawdzania poprawności • Składnia kontrolki CustomValidator <asp:CustomValidator ClientValidationFunction= "Nazwa" OnServerValidationFunction= "Nazwa" ControlToValidate="Nazwa" Display="Dynamic" Font-Name="verdana" Font-Size="10pt" ErrorMessage="Treść" runat=server />
1.3 Kontrolki sprawdzania poprawności • Przykład wykorzystania kontrolki CustomValidator <html><body> <script language="vbscript"> Sub Klient(source, arguments) If (arguments.Value = "5" or arguments.Value = "10") Then arguments.IsValid = true Else arguments.IsValid = false End If End Sub </script> <form id="form1" runat="server"> Podaj liczbę:<asp:textbox id="Tekst" runat="server" /> <asp:CustomValidator runat="server" ControlToValidate="Tekst" ClientValidationFunction="Klient" ErrorMessage="Wpisz 5 lub 10" /> <p><asp:button text="OK" runat="server" /> </form> </body></html>
1.3 Proste przykłady • Proste przykłady kontrolek sprawdzania poprawności • requiredfieldvalidator przykład, źródła • rangevalidator przykład, źródła • customvalidator przykład, źródła
1.4 Tworzenie kontrolek użytkownika Kontrolki użytkownika • można tworzyć własne kontrolki użytkownika uzupełniając istniejące kontrolki HTML i serwera • kontrolki użytkownika zwiększają możliwość ponownego wykorzystania kodu, poprzez zamieszczenie w kontrolkach powtarzających się element. • zamykanie części interfejsu w postaci kontrolek jest wygodne w użyciu, ułatwia późniejsze wprowadzanie zmian i zwiększa jego przejrzystość • stosowanie częściowego buforowania strony poprzez buforowanie kontrolek może zwiększyć wydajność • kontrolkę tworzy się analogicznie jak zwykłą stronę Web Forms • można stosować zewnętrzny kod kontrolek analogicznie do Web Forms • kontrolki te są dostępne dla aplikacji gdzie zostały utworzone • możliwe jest programowe tworzenie przez Page.LoadControl("plik.ascx") • metody obsługi zdarzeń dla kontrolki muszą być zawarte kontrolce • kontrolki użytkownika mogą udostępniać właściwości oraz metody • deklaracja przy użyciu dyrektywy (osobny plik o rozszerzeniu ascx) <%@ Control ClassName="nazwa" [atrybut="wartosc" ...] %>
1.4 Tworzenie kontrolek użytkownika • Przykład prostej kontrolki użytkownika z pojedynczą właściwością <%@ Control ClassName="MojaData" %> <script language=vb runat=server> Public BackColor as string </script> <table bgcolor="<%=BackColor%>"> <tr> <td>Bieżąca data:</td> <td><%=Now.ToString("HH:mm:ss")%></td> </tr> </table> • Przykład strony Web Forms wykorzystującej utworzoną kontrolkę <%@Register TagPrefix="MD" TagName="Data" Src="mojadata.ascx"%> <html> <body> <MD:Data BackColor="yellow" runat="Server"/> </body> </html>
1.4 Proste przykłady • Prosty przykład kontrolki użytkownika • Moja data przykład, źródła
1.5 Tworzenie kontrolek dostosowanych Kontrolki dostosowane • sposób tworzenia różni się od kontrolek użytkownika • kontrolki dostosowane są przechowywane w postaci skompilowanej dll • kontrolki te mogą być ogólnie dostępne dla wszystkich aplikacji • kontrolki dostosowane umożliwiają obsługę danych przesłanych przez użytkownika (przesłanie zwrotne) • możliwe jest tworzenie kontrolek dostosowanych opartych na szablonach a także kontrolek wykorzystujących wiązanie danych ze źródła danych • kontrolki użytkownika mogą udostępniać własne właściwości, metody oraz własne zdarzenia
1.5 Tworzenie kontrolek dostosowanych Porównanie kontrolek użytkownika oraz dostosowanych
2.1 ADO ADO • oparta na COM technologia pozwalająca w jednolity i spójny sposób realizować dostęp do danych pochodzących z różnych źródeł • zestaw wzajemnie powiązanych obiektów oraz metod ADO Recordset (rekordy) Command (polecenie) Connection (połączenie) OLE DB Źródło danych
2.2 ADO.NET ADO.NET • zbiór klas .NET pozwalający realizować dostęp do różnych danych • to coś więcej niż kolejna wersja ADO,wewnętrznie znaczne różnice DataSet (dane) DataTable (tebela) Constraint (więzy) Column (kolumna) Row (rekord) DataRelation (relacje) DataAdaptor DataReader Command (polecenie) Źródło danych Connection (połączenie)
2.3 ADO.NET Różnice między ADO a ADO.NET
2.4 Przykład ADO.NET • Przykład wykorzystania DataSet, Connection, DataAdaptor, DataGrid <%@ Import Namespace = "System.Data" %> <%@ Import Namespace = "System.Data.OleDb" %> <HTML> <BODY BGCOLOR="White" topmargin="10" leftmargin="10"> <script language = "VB" runat = "server"> Sub Page_Load(sender As Object, e As EventArgs) Dim ConnStr as String ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("osoby.mdb") Dim conn As OleDbConnection = New OleDbConnection(ConnStr) conn.Open() Dim da As OleDbDataAdapter = New OleDbDataAdapter ("SELECT * FROM Osoba",conn)
2.4 Przykład ADO.NET Dim ds As New DataSet da.Fill(ds,"osoba") DataGrid1.DataSource=ds.Tables("osoba").DefaultView DataGrid1.DataBind() End Sub </script> <asp:datagrid id="DataGrid1" runat="server" /> </body> </html> Istnieją osobne klasy specjalnie przeznaczone do pracy z SQL Server, w nazwach klas zamiast OleDb jest Sql. Używana przestrzeń to System.Data.SqlClient
2.5 Obiekt ADO.NET OLEDBConnection Połączenie ze źródłem danych OLEBD (nieznaczne różniece z SLQConnection) • Właściwości • ConnectionString – ciąg znaków wykorzystywany do otwarcia połączenia, serie argumentów argument=wartość • ConnectionTimeout – czas oczekiwania na nawiązanie połączenia w s • Database – nazwa bazy danych z połączenia • DataSource – nazwa połączonego źródła danych • Provider – nazwa dostawcy bazy danych • State – bieżący stan połączenia • Metody • BeginTransaction – rozpoczyna nową transakcję i zwraca OLEDBTransaction • Open – otwiera połączenie ze źródłem danych • Close – zamyka połączenie ze źródłem danych • CreateCommand – tworzy i zwraca polecenie OLEDBCommand • Zdarzenia • InfoMessage – zdarzenie zgłaszane gdy dostawca zgłosi błąd lub komunikat • StateChange – zdarzenie zgłaszane po zmianie stanu połączenia
2.6 Obiekt ADO.NET OLEDBCommand Służy do zadawania zapytań, operacji masowych • Właściwości • Connection - połączenie z którym związany jest obiekt Command • CommandText – ciąg znaków z poleceniem • CommandTimeout - czas oczekiwania na wykonanie komendy w sek. • CommandType – typ polecenia (StoredProcedure, Text, TableDirect) • Parameters – zawiera wszystkie parametry • Metody • CreateParameter – tworzy obiekt i dodaje do zbioru OLEDBParameters • ExecuteNonQuery – wykonuje zapytanie lub procedurę zachowaną, zwraca liczbę dotyczących rekordów, bez samych rekordów • ExecuteReader – wykonuje zapytanie i zwraca obiekt OLEDBDataReader • ExecuteScalar – wykonuje zapytanie i zwraca pierwszą kolumnę pierwszego rekordu zbioru wyników • Prepare – tworzy skompilowaną wersję zapytania na serwerze
2.7 Obiekt ADO.NET OLEDBDataReader Służy do sekwencyjnego (po jednym polu) czytania danych ze źródła • Właściwości • FieldCount – liczba kolumn bieżącego rekordu • IsClosed – czy obiekt jest zamknięty • Item – wartość danej kolumny • RecordsAffected – liczba rekordów na które wpłynął obiekt • Metody • Close – zamyka obiekt • GetValue – zwraca wartość kolumny o podanym numerze • GetValues – zwraca tablicę wszystkich kolumn • IsDBNull – czy kolumna zawiera wartość NULL • NextResult – przesunięcie na zbiór rekordów • Read – przesunięcie na następny rekord
2.8 Obiekt ADO.NET OLEDBAdapter Służy do wypełnienia danymi zbioru DataSet • Właściwości • DeleteCommand – zapytanie SQL używane do usuwania rekordów • InsertCommand – zapytanie SQL używane do wstawiania rekordów • SelectCommand – zapytanie SQL używane do wybierania rekordów • UpdateCommand – zapytanie SQL używane do aktualizacji rekordów • Metody • Fill – wypełnia obiekt DataSet danymi ze źródła • Update – aktualizuje źródło danymi z obiektu DataSet • Zdarzenia • RowUpdate – zdarzenie po aktualizacji rekordu w źródle danych • RowUpdating – zdarzenie podczas aktualizacji rekordu w źródle danych
2.9 DataSet, DataTable, DataColumn, DataRow, DataRelation, DataView, DataRowView • DataSet – reprezentuje zbiór danych w pamięci, może to być nawet kilka tabel lub cała baza danych • DataTable – reprezentuje tabele należącą do zbioru danych • DataColumn – reprezentuje wszystkie informacje o kolumnie • DataRow – reprezentuje rekord danych tabeli • DataRelation – służy do tworzenia i zarządzania relacjami pomiędzi tabelami z zbiorze danych • DataView – służy tworzeniu tymczasowych perspektyw na danych pochodzących z obiektu DataTable. Wykorzystywane przy wiązaniu danych z kontrolkami sieci WWW • DataRowView – reprezentuje rekord obiektu DataView
3.1 Usługi sieciowe XML Web Services • nowa technologia przetwarzania rozproszonego • otwarcie na sprawdzone standardy oraz na inne platformy • wykorzystanie technologii HTTP i XML • język WSDL służy do opisu usług sieciowych (porty, protokoły, typy danych itp.) • Protokół SOAP jest metodą wymiany danych między różnymi platformami (XML + HTTP)
3.2 Prosty przykład • Prosty przykład odpytania usługi sieciowe przy wykorzystaniu HTTP GET (bez klienta SOAP) • Dodawanie przykład aspx, przykład asmx, źródła
3.3 Struktura żądania GET Zapytanie: GET /asp.net/uslugi%20sieciowe/dodawanie.asmx/Dodaj?liczbaA=string&liczbaB=string Odpowiedź: HTTP/1.1 Host: localhost HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <int xmlns="http://tempuri.org/">int</int>
3.4 Struktura żądania POST Zapytanie: POST /asp.net/uslugi%20sieciowe/dodawanie.asmx/Dodaj HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: length liczbaA=string&liczbaB=string Odpowiedź: HTTP/1.1 Host: localhost HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <int xmlns="http://tempuri.org/">int</int>
3.5 Struktura żądania SOAP Zapytanie: POST /asp.net/uslugi%20sieciowe/dodawanie.asmx HTTP/1.1 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/Dodaj" <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <Dodaj xmlns="http://tempuri.org/"> <liczbaA>int</liczbaA> <liczbaB>int</liczbaB> </Dodaj> </soap:Body> </soap:Envelope>
3.5 Struktura żądania SOAP Odpowiedź: HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <DodajResponse xmlns="http://tempuri.org/"> <DodajResult>int</DodajResult> </DodajResponse> </soap:Body> </soap:Envelope>
4. Literatura • http://msdn.microsoft.com – MSDN Microsoft • http://asp.net • Scot Worley, ASP.NET Vademecum Profesjonalisty, Helion, 2003 • Robert B. Dunaway, Visual Studio .NET, Mikom, 2003
Kontakt • Piotr Kuźniacki piotr.kuzniacki@polsl.pl Politechnika Śląska, Instytut Informatyki, ul. Akademicka 16, 44‑101 Gliwice, Polska Dziękuję za uwagę...