You are on page 1of 15

1

Zaawansowane programowanie internetowe


Instrukcja nr 1























1
LINQ

2
Zaawansowane programowanie internetowe
Instrukcja nr 1

1. Cel zaj

Celem zaj jest zapoznanie si z technologi LINQ oraz tworzeniem trjwarstwowej aplikacji
internetowej.

2. Zadanie

Prosz przgotowa aplikacj !!!" ktra#

$%zie pozwala&a na generowanie prostch artk'&w po%zielonch na kategorie.
! aplikacji maj $ wra(nie w%zielone warstw#
o %ostp' %o %anch )o%powia%ajca za kom'nikacj z $az %anch*
o $iznesowej )o%powia%ajcej za wkonanie reg'& $iznesowch w aplikacji*
o prezentacji )o%powia%ajcej za kom'nikacj z '+tkownikiem*
kom'nikacja z $az %anch ma si o%$wa za pomoc technologii Lin, -o .QL

! tm cel' nale+ wkona o%powie%nie kroki#

I. Stworzenie bazy danych
a* -worzm now aplikacj tp' /.P.N0- !e$ /pplication )jako nazw nale+
przj 1a%anie 1.1*
$* ! cel' 'tworzenia nowej $az %anch w oknie .ol'tion 02plorer klikam prawm
przciskiem msz na katalog' /pp34ata i z men' kontekstowego w$ieram
opcj /%% 5 New Item.
c* ! w6wietlonm oknie %ialogowm w$ieram opcj .QL .er7er 4ata$ase" a jako
nazw plik' po%ajem /rtk'l.m%8 i wciskam przcisk /%%.



3
Zaawansowane programowanie internetowe
Instrukcja nr 1


%* Ponownie otwieram okno .ol'tion 02plorer i klikam %w'krotnie na nowej
pozcji /rtk'l.m%8 w cel' otwarcia okna e%cji $az %anch.
e* 9likajc prawm przciskiem msz na w(le -a$les i w$ieram opcj /%% New
-a$le. !6wietlone zostanie okno e%cji ta$eli" ktre wpe&niam tak jak
pokazano na rs'nk' poni+ej



Prosz pamita o 'stawieni' kl'cza g&wnego ta$eli na pol' I4.
8* Po%o$nie tworzm %r'g ta$el /rtk'l i 'stawiam w niej nastp'jce pola



g* Po&czm te %wie ta$ele relacj :e%en %o wiel'.
h* 1apiszm wprowa%zone zmian.

II. Stworzenie warstwy dostpu do danych

a* ! oknie .ol'tion02plorer tworzm now katalog ;4/L< )4ata /ccess Laer* i
wszstkie pliki" o ktrch $%zie mowa w tm p'nkcie $%ziem 'mieszcza w tm
katalog'.
$* Ponownie otwrzm okno .ol'tion02plorer i klikajc prawm przciskiem msz
w$ieram opcj /%% 5 New Item.
c* 1 gr'p 4ata w$ieram opcj LINQ to .QL Classes" jako nazw po%ajem
/rtk'l.%$ml i klikam przcisk /%%.





4
Zaawansowane programowanie internetowe
Instrukcja nr 1

.tanowi to po%staw %o 'tworzenia mapowania o$iektowo = relacjnego
'mo+liwiajcego wkonwanie zapta> LINQ to .QL.
%* ?twieram okno .er7er 02plorer i przecigam z niego o$ie 'tworzone w $azie
%anch ta$ele" ktre 'mieszczam w otwartm oknie projektanta mapowania
o$iektowo = relacjnego. ! e8ekcie w oknie tm powinn si pojawi nastp'jce
element#


Nale+ za'wa+" +e @is'al.t'%io a'tomatcznie rozpozna&o po&czenie pomi%z
o%powie%nimi ta$elami.
e* Ponownie otwrzm okno .ol'tion02plorer i %o%ajm %o projekt' now inter8ejs
)/%% 5 New Item 5 Co%e 5 Inter8ace*" ktr nazwiem I/rtk'l. Inter8ejs' wgl%a
nastp'jco#

public interface IArtykuly
{
List<Artykul> PobierzArtykulyZKategorii(
int Kategoria);
Artykul PobierzArtykul(int ID);
void DodajArtykul(string tytul, string tresc,
int Kategoria);
void EdytujArtykul(string tytul, string tresc,
int Kategoria, int ID);
void UsunArtykul(int ID);
}

8* Nastpnie" analogicznie" tworzm %r'gi inter8ejs I9ategorie#

public interface IKategorie
{
List<Kategoria> PobierzWszystkie();
Kategoria PobierzKategorieWgID(int ID);
void DodajKategorie(string Nazwa, string Opis);
void EdytujKategorie(string Nazwa, string Opis,
int ID);
void UsunKategorie(int ID);
}

g* 9olejno tworzm %wie klas pomocnicze#





5
Zaawansowane programowanie internetowe
Instrukcja nr 1



public class Kategoria
{
public int ID { get; set; }
public string Nazwa { get; set; }
public string Opis { get; set; }
public int LiczbaArtykulow { get; set; }
}

public class Artykul
{
public int ID { get; set; }
public string Tytul { get; set; }
public string Tresc { get; set; }
public int Kategoria { get; set; }
public DateTime DataOstatniejModyfikacji { get; set; }
public DateTime DataUtworzenia { get; set; }
}

0lement te $% s&'+& %o kom'nikacji pomi%z poszczeglnmi warstwami

h* Nastpnie tworzm klas ktra $%zie realizowa&a inter8ejs I/rtk'l

9lasa ta $%zie o%powie%zialna za kom'nikacj z $az %anch.

public class ArtykulLINQ_To_SQL : IArtykuly {

public List<Artykul> PobierzArtykulyZKategorii(
int Kategoria)
{
using (ArtykulyDataContext context
= new ArtykulyDataContext())
{
var artykuly = from a in context.Artykulies
where a.Kategoria == Kategoria
select new Artykul
{
Tytul = a.Tytul,
ID = a.ArtykulID
};
return artykuly.ToList();
}
}



6
Zaawansowane programowanie internetowe
Instrukcja nr 1

public Artykul PobierzArtykul(int ID)
{
using (ArtykulyDataContext context
= new ArtykulyDataContext())
{
try
{
var artykul = context.Artykulies.Single(
a => a.ArtykulID == ID);
return new Artykul
{
Tytul = artykul.Tytul,
Tresc = artykul.Tresc,
DataUtworzenia = artykul.DataUtworzenia,
DataOstatniejModyfikacji =
artykul.DataOstatniejModyfikacji,
Kategoria = artykul.Kategoria,
ID = artykul.ArtykulID
};
}
catch
{
return null;
}
}
}

public void DodajArtykul(string tytul,
string tresc, int kategoria)
{
using (ArtykulyDataContext context
= new ArtykulyDataContext())
{
Artykuly art = new Artykuly
{
Kategoria = kategoria,
Tytul = tytul,
Tresc = tresc,
DataOstatniejModyfikacji = DateTime.Now,
DataUtworzenia = DateTime.Now
};
context.Artykulies.InsertOnSubmit(art);
context.SubmitChanges();
}
}



7
Zaawansowane programowanie internetowe
Instrukcja nr 1

public void EdytujArtykul(string tytul,
string tresc, int kategoria, int ID)
{
using (ArtykulyDataContext context
= new ArtykulyDataContext())
{
var artykul = context.Artykulies.Single(
a => a.ArtykulID == ID);
artykul.Tytul = tytul;
artykul.Tresc = tresc;
artykul.Kategoria = kategoria;
artykul.DataOstatniejModyfikacji = DateTime.Now;
context.SubmitChanges();
}
}

public void UsunArtykul(int ID)
{
using (ArtykulyDataContext context
= new ArtykulyDataContext())
{
var artykul = context.Artykulies.Single(
a => a.ArtykulID == ID);
context.Artykulies.DeleteOnSubmit(artykul);
context.SubmitChanges();
}
}
}

Atworzenie klas kontekst'. Instr'kcja ta zawarta jest w $lok' 'sing
w cel' a'tomatcznego zwolnienia zaso$w w momencie" g% nie s
j'+ potrze$ne
Przk&a% tpowego zaptania LINQ to .QL realiz'jcego zarwno
selekcj wiersz i projekcj kol'mn z ta$eli $az %anch.
Poniewa+ instr'kcja w linii oznaczonej jako tworz o$iekt klas
I0n'mera$leB/rtk'l5" konieczne jest wwo&anie 8'nkcji -oList)*
w cel' wkonania zaptania i wgenerowania wmaganej list
o$iektw.

i* 9olejno prosz 'tworz klas 9ategoriaLINQ3-o3.QL )na o$raz i po%o$ie>stwo
klas /rtk'lLINQ3-o3.QL*



8
Zaawansowane programowanie internetowe
Instrukcja nr 1

III. Stworzenie warstwy biznesowej

a* ?twieram okno .ol'tion02plorer i %o%ajm %o projekt' )%o katalog' g&wnego*
%wie nowe klas 9ategorieCLL i /rtk'lCLL. 9las te $% stanowi& nasz
warstw $iznesow. !arstwa ta powinna zawiera ca& logik aplikacji
)spraw%zanie poprawno6ci %anch" a'torzacj it%.*

[DataObject]
public class KategorieBLL : IKategorie
{
IKategorie _kategorie;

public KategorieBLL() : this(new KategorieLINQ_To_SQL())
{}

public KategorieBLL(IKategorie kategorieDAL)
{
_kategorie = kategorieDAL;
}

[DataObjectMethod(DataObjectMethodType.Select, true)]
public List<Kategoria> PobierzWszystkie()
{
return _kategorie.PobierzWszystkie();
}

[DataObjectMethod(DataObjectMethodType.Select, false)]
public Kategoria PobierzKategorieWgID(int ID)
{
return _kategorie.PobierzKategorieWgID(ID);
}

[DataObjectMethod(DataObjectMethodType.Insert, true)]
public void DodajKategorie(string Nazwa, string Opis)
{
_kategorie.DodajKategorie(Nazwa, Opis);
}

[DataObjectMethod(DataObjectMethodType.Update, true)]
public void EdytujKategorie(string Nazwa,
string Opis, int ID)
{
_kategorie.EdytujKategorie(Nazwa, Opis, ID);
}

[DataObjectMethod(DataObjectMethodType.Delete, true)]
public void UsunKategorie(int ID)
{
_kategorie.UsunKategorie(ID);
}
}


9
Zaawansowane programowanie internetowe
Instrukcja nr 1



! prze%stawianej t'taj prostej aplikacji klasa ta stanowi je%nie implementacj
inter8ejs' I9ategorie. 9lasa i jej meto% opisane s o%powie%nimi atr$'tami"
ktre pozwalaj na &atwiejsze po%&czenie jej z o$iektami tp' ?$ject4ata.et
znaj%'jcmi si w warstwie prezentacji.

/tr$'t ten in8orm'je @is'al .t'%io" +e klasa ta jest o%powie%zialna za
%ostarczenie %anch %la warstw prezentacji.
9lasa zawiera %wa konstr'ktor. Pierwsz = %om6ln = wmagan jest
przez @is'al .t'%io" %r'gi 'mo+liwia ;wstrzknicie< o$iekt'
'mo+liwiajcego po&czenia z $az %anch.
/tr$'t opis'jc meto% 4ata?$jectDetho% pozwala na okre6lenie
jej przeznaczenia. .k&a%nia tego atr$'t' jest nastp'jca#

DataObjectMethod(DataObjectMethodType, bool)

Pierwsz parametr okre6la przeznaczenie meto%" %r'gi cz jest to
meto%a %om6lna cz nie.

$* Prosz stworz klas stanowic warstw $iznesow %la ta$eli /rtk'&.
c* Prosz prze$'%owa projekt )C'il% 5 C'il% .ol'tion*.

IV. Stworzenie warstwy prezentacji

a* ! stronie ;master page< prosz zmieni komponent men' tak a$ wskazwa& na
%wie stron# kategorie.asp2 i artk'l.asp2



$* Prosz %o&cz %o projekt' now stron kategorie.asp2
c* Na stronie tej prosz 'mie6ci nastp'jce komponent i na%a im nazw po%ane
w nawiasach#

LinkC'tton )Nowa9ategoria*
4etails@iew )9ategoria4@*
Eri%@iew )9ategorieE@*
?$ject4ata.o'rce )9ategoria?4.*
?$ject4ata.o'rce )9ategorie?4.*




10
Zaawansowane programowanie internetowe
Instrukcja nr 1





%* 9likam na pierwsz komponent tp' ?$ject4ata.o'rce i rozwijam okienko -asks"
z ktrego w$ieram opcj Con8ig're 4ata .o'rce



e* ! oknie %ialogowm w$ieram klas" ktra $%zie (r%&em %anch %la naszego
o$iekt'. :e+eli zaznaczm opcj ;.how onl %ata components< powinn pojawi
si tlko te klas" ktre oznaczli6m atr$'tem F4ata?$jectG. !$ieram klas
9ategorieCLL i klikam przcisk Ne2t.



11
Zaawansowane programowanie internetowe
Instrukcja nr 1



8* Nastpnie mo+em 'stawi z jakich meto% w$ranej wcze6niej klas ma korzsta
(r%&o %anch prz wkonwani' operacji po$ierania i e%cji %anch. 1a'wa+m
+e o%powie%nie meto% zosta& j'+ w$rane %ziki 'stawionm wcze6niej
atr$'tom. 1mie>m je%nak meto% w zak&a%ce ;.elect< na
;Po$ierz9ategorie!gI4<" pozosta&e wpis pozostawm $ez zmian. 9likam
przcisk Ne2t.



g* Poniewa+ w$rana meto%a ;Po$ierz9ategorie!gI4< ma przpisan parametr
w nastpnm oknie jeste6m proszeni o w$ranie (r%&a warto6ci %la niego.
! naszm przpa%k' w$ieram warto6ci tak jak pokazano na rs'nk' poni+ej
)prz za&o+eni'" +e komponent Eri%@iew nazwan jest 9ategorieE@*.


12
Zaawansowane programowanie internetowe
Instrukcja nr 1



h* 9likam przcisk ;Hinish<.
i* Nastpnie klikam raz jeszcze na mo%8ikowanm w poprze%nich krokach o$iekcie
i w oknie ;Properties< zmieniam warto6 w&a6ciwo6ci
;?l%@al'esParameterHormat.tring< z ;orginal3IJK< na ;IJK<.
j* Nastpnie klikam na o$iekcie tp' 4etails@iew" rozwijam okienko -ask" w
ktrm 'stawiam opcje tak jak pokazano na rs'nk' poni+ej i klikam opcje
;0%itHiel%s<.



k* ! w6wietlonm oknie %ialogowm w okienk'# ;.electe% Hiel%s< 's'wam
pozcje tak a$ pozosta& tlko# ;Nazwa<" ;?pis<"
;Comman%Hiel%<. Nastpnie klikam na ;Comman%Hiel%< i w oknie
;;Comman%Hiel% properties< o%naj%'jem pozcj New-e2t" z ktrej 's'wam
zawarto6.


13
Zaawansowane programowanie internetowe
Instrukcja nr 1



l* 9likam na przcisk ?9. w cel' zamknicia okna.
m* ! oknie Properties %la pozcji ;4ata9eNames< przpis'jem warto6 ;I4<.
n* Nastpnie w po%o$n spos$ prosz skon8ig'rowa %r'gi o$iekt tp'
?$ject4ata.et" prz czm w zak&a%ce ;.elect< prosz w$ra meto%
;Po$ierz!szstkie<.
o* ?$iekt Eri%@iew prosz po%&cz %o %r'giego o$iekt' tp' ?$ject4ata.et i
skon8ig'rowa tak a$ mo+liwe $&o w$ranie opcji 0%it l'$ 4elete. Prosz
rwnie+ 'stawi w&a6ciwo6 ;4ata9eNames< na warto6 ;I4<



p* Nastpnie prosz przpisanie %o o%powie%nich komponentw nastp'jcch
meto% o$s&'gi z%arze>#

LinkC'tton )Nowa9ategoria* = Click

protected void NowaKategoria_Click(
object sender, EventArgs e)
{
KategoriaDV.ChangeMode(DetailsViewMode.Insert);
KategoriaDV.Visible = true;
}


14
Zaawansowane programowanie internetowe
Instrukcja nr 1

Deto%a ta ma za za%anie w6wietli komponent 4etails@iew i prze&cz
go a'tomatcznie w tr$ wprowa%zania nowch %anch.

Eri%@iew )9ategorieE@* = Low0%iting

protected void KategorieGV_RowEditing(
object sender, GridViewEditEventArgs e)
{
KategorieGV.SelectedIndex = e.NewEditIndex;
KategoriaDV.ChangeMode(DetailsViewMode.Edit);
KategoriaDV.Visible = true;
e.Cancel = true;
}

Deto%a ta ma za za%anie w6wietli komponent 4etails@iew i prze&cz
go a'tomatcznie w tr$ wprowa%zania e%cji %anch %la wiersza
w$ranego w Eri%@iew

4etails@iew )9ategoria4@* = Do%eChanging

protected void KategoriaDV_ModeChanging(
object sender, DetailsViewModeEventArgs e)
{
if (e.NewMode == DetailsViewMode.ReadOnly)
KategoriaDV.Visible = false;
}

Deto%a ta ma za za%anie 'kr komponent 4etails@iew" w momencie g%
'+tkownik zatwier%zi l'$ an'l'je e%cj %anch.

,* Nastpnie prosz o przgotowanie %r'giej stron /rtk'l.asp2 tak a$ wgl%a&a
mniej wicej jak na rs'nk' poni+ej#




15
Zaawansowane programowanie internetowe
Instrukcja nr 1
9omponent 4rop4ownList )9ategoria* ma pozwoli na w$ranie kategorii" z ktrej
maj $ w6wietlone artk'&. Pozosta&e komponent powinn si zachowwa
mniej wicej tak jak na poprze%niej stronie.

Da&a po%powie%(#
Poniewa+ w komponencie 4etails@iew ma nie $ pozcji 9ategoria" jej warto6
m'si $ po$ierana z komponent' 4rop4ownList. /$ warto6 ta $&a %o&czona
%o zestaw' %anch przekazanego %o warstw $iznesowej konieczne jest
przpisanie %o komponent' 4etails@iew %wch meto% o$s&'gi z%arze>#
ItemInserting oraz ItemUpdating, w ktrch wpis'jem o%powie%nio#

e.Values["Kategoria"] = KategorieDDL.SelectedValue;
e.NewValues["Kategoria"] = KategorieDDL.SelectedValue;


V. Zadania do samodzielneo wy!onania

:e+eli wstarcz Pa>stw' czas' to na zajciach" je+eli nie to w %om' prosz =
w ramach powtrzenia = o roz$'%owanie tej aplikacji o technologi as'nchronicznego
przes&' %anch /:/M oraz %o&czenie %o niej stron" ktra 'mo+liwi&a $ przegl%anie
artk'&w w tr$ie tlko %o o%czt'.

You might also like