Vajad kellegagi rääkida?
Küsi julgelt abi LasteAbi
Logi sisse

Nimetu (1)

1 HALB
Punktid

Esitatud küsimused

  • Kuidas saada tööle koodijupp mis ei tööta?
  • Mitu pirni ostad?
  • Milliste sünniaastatega lapsed meil tabelis on?
  • Milliseid andmeid esitada elementidena milliseid atribuutidena?
  • Kuidas raamistik aru saab millist keelt kasutada?

Andmebaasipõhiste veebirakenduste arendamine
Microsoft Visual Studio 2008 ja
SQL Server 2008 baasil
Tallinn
22.10.2009
Sisukor
Eessõna 6
Sissejuhatus 7
Õppematerjali kasutamise juhis 8
Kuidas saada abi küsimustele 11
Microsoft .NET platvorm 13
C# 17
Põhivõimalused 18
Käivitamine 21
Suhtlus arvutiga 23
Arvutamine 24
Valikud 25
Kordused 27
Korrutustabel 29
Alamprogramm 31
Massiivid 31
Käsud mitmes failis 38
Tekst 39
Tekstifailid 41
Juhuarv 43
Omaloodud andmestruktuur 44
Edasijõudnute osa: Objektorienteeritud programmeerimine 49
Tutvustus 49
Dokumenteerivad kommentaarid 56
Pärilus 58
Ülekate 62
Liidesed 63
Abstraktne klass 65
Meetodite asendus 67
Omadused 69
Indekseering 72
Struktuurne andmestik 74
Operaatorite üledefineerimine 82
Abivahendid 92
Erindid 92
Enum 97
Andmekollektsioonid 98
Mallid 103
Atribuudid 106
Andmebaasiliides 112
Ühenduse loomine, päring 112
Andmete lisamine 116
SQL- parameeter 117
Salvestatud protseduur 118
Funktsiooni delegaadid 120
Funktsioonide komplekt 121
Sündmused 122
Ilmajaamad 122
Graafiline liides 125
Visual Studio C# Expressi install 128
Esimese rakenduse loomine 135
Kokkuvõte 141
SQLi keel 142
Microsoft SQL Server 2008 143
SQL Server 2008 perekond 143
SQL Server Express Edition 144
Põhivõimalused 157
Töö alustamine 157
Andmebaasi loomine 159
Lihtsamad päringud 169
Tabelite vahelised seosed 185
Tabelite ühendamine päringutes 188
Edasijõudnutele 192
Pikemad päringud 192
Keerukamad seosed tabelite vahel 208
Alampäringud 218
Lisavõimalused 226
XML andmete kasutamine 252
Varukoopia 261
Kokkuvõte 264
Andmetele ligipääs ADO.NET 265
Andmeallika külge ühendumine 269
Töötamine andmebaasiga ühendatud keskkonnas 273
XxxCommand 274
Parameetrite kasutamine 276
Ridade lugemine väljundist (DataReader) 276
Transaktsioonid 278
Töötamine ühenduseta keskkonnas (DataSets) 279
Olemasolevate andmete põhjal DataSeti loomine 282
XML 290
XML’i kirjutamise reeglid 292
Reeglid 292
XML’i elemendid 293
Atribuudid 294
XHTML 296
Nimeruum 297
XML’i valideerimine 298
XML skeemid 298
XMLi kasutamine SqlServeris 300
XMLi genereerimine relatsioonilistest andmetest 300
XML andmetüübi kasutamine 304
XML andmete kasutamine .NET raamistikus 308
XMLi parsimine 309
XMLi valideerimine 312
XMLi salvestamine 315
LINQ - .NET Language - Integrated Query 317
ASP.NET 319
Visual Studio paigaldamine 320
Põhivõimalused 326
Lihtsa veebilehestiku loomine HTML keele abil 326
Astmelised laadilehed (CSS) – cascading style sheets 346
Programmeeritavad veebilehed 359
Andmebaasipõhise veebirakenduse loomine 370
Andmed mitmes tabelis 416
Veebi kopeerimine 443
Edasijõudnutele 447
Programmi koodi paigutamine eraldi faili 447
Seadistamine (Web.config) 449
Rakenduse jälgimine ( Trace ) 450
Vigade haldamine 455
AJAX 460
Lokaliseerimine 462
Master Pages 468
Elemendid lehel 470
Veebilehtede kujundamine kasutades nägusid ( Themes ) 488
Väärtuste tööaegne meelespidamine 490
Veebisaidi turvamine 494
Andmetega manipuleerimine 505
WebParts 515
Veebiteenused 516
IIS 522
Lisad 522
Eessõna 5
Sissejuhatus 6
Õppematerjali kasutamise juhis 7
Kuidas saada abi küsimustele 9
Microsoft .NET platvorm 11
C# 14
Põhivõimalused 15
Käivitamine 18
Suhtlus arvutiga 20
Arvutamine 20
Valikud 21
Kordused 24
Korrutustabel 26
Alamprogramm 27
Massiivid 28
Käsud mitmes failis 34
Tekst 35
Tekstifailid 37
Juhuarv 39
Omaloodud andmestruktuur 40
Edasijõudnute osa: Objektorienteeritud programmeerimine 44
Tutvustus 44
Dokumenteerivad kommentaarid 50
Pärilus 53
Ülekate 56
Liidesed 57
Abstraktne klass 59
Meetodite asendus 61
Omadused 63
Indekseering 66
Struktuurne andmestik 67
Operaatorite üledefineerimine 76
Abivahendid 85
Erindid 85
Enum 90
Andmekollektsioonid 91
Mallid 96
Atribuudid 99
Andmebaasiliides 104
Ühenduse loomine, päring 104
Andmete lisamine 108
SQL-parameeter 108
Salvestatud protseduur 109
Funktsiooni delegaadid 112
Funktsioonide komplekt 113
Sündmused 113
Ilmajaamad 114
Graafiline liides 117
Visual Studio C# Expressi install 119
Esimese rakenduse loomine 125
Kokkuvõte 131
SQLi keel 132
Microsoft SQL Server 2008 133
SQL Server 2008 perekond 133
SQL Server Express Edition 134
Põhivõimalused 145
Töö alustamine 145
Andmebaasi loomine 147
Lihtsamad päringud 156
Tabelite vahelised seosed 170
Tabelite ühendamine päringutes 173
Edasijõudnutele 176
Pikemad päringud 176
Keerukamad seosed tabelite vahel 190
Alampäringud 199
Lisavõimalused 206
XML andmete kasutamine 229
Varukoopia 237
Kokkuvõte 239
Andmetele ligipääs ADO.NET 240
Andmeallika külge ühendumine 244
Töötamine andmebaasiga ühendatud keskkonnas 247
XxxCommand 248
Parameetrite kasutamine 249
Ridade lugemine väljundist (DataReader) 250
Transaktsioonid 251
Töötamine ühenduseta keskkonnas (DataSets) 253
Olemasolevate andmete põhjal DataSeti loomine 256
XML 263
XML’i kirjutamise reeglid 265
Reeglid 265
XML’i elemendid 266
Atribuudid 267
XHTML 268
Nimeruum 269
XML’i valideerimine 270
XML skeemid 270
XMLi kasutamine SqlServeris 272
XMLi genereerimine relatsioonilistest andmetest 272
XML andmetüübi kasutamine 275
XML andmete kasutamine .NET raamistikus 279
XMLi parsimine 280
XMLi valideerimine 283
XMLi salvestamine 285
LINQ - .NET Language-Integrated Query 287
ASP.NET 289
Visual Studio paigaldamine 290
Põhivõimalused 295
Lihtsa veebilehestiku loomine HTML keele abil 295
Astmelised laadilehed (CSS) – cascading style sheets 313
Programmeeritavad veebilehed 324
Andmebaasipõhise veebirakenduse loomine 333
Andmed mitmes tabelis 375
Veebi kopeerimine 400
Edasijõudnutele 403
Programmi koodi paigutamine eraldi faili 403
Seadistamine (Web.config) 405
Rakenduse jälgimine (Trace) 406
Vigade haldamine 410
AJAX 415
Lokaliseerimine 417
Master Pages 422
Elemendid lehel 424
Veebilehtede kujundamine kasutades nägusid (Themes) 440
Väärtuste tööaegne meelespidamine 442
Veebisaidi turvamine 446
Andmetega manipuleerimine 454
WebParts 464
Veebiteenused 465
IIS 471
Lisad 471

Eessõna

Hea õpilane!
Microsofti arenduspartnerid ja kliendid otsivad pidevalt noori ja andekaid koodimeistreid, kes oskavad arendada tarkvara laialt levinud .NET platvormil. Kui Sulle meeldib programmeerida, siis usun, et saame Sulle pakkuda vajalikku ja huvitavat õppematerjali.
Järgneva praktilise ja kasuliku õppematerjali on loonud tunnustatud professionaalid. Siit leid uusimat infot nii .NET aluste kohta kui ka juhiseid veebirakenduste loomiseks. Teadmiste paremaks omandamiseks on allpool palju praktilisi näiteid ja ülesandeid. Ühtlasi on sellest aastast kõigile kättesaadavad ka videojuhendid, mis teevad õppetöö palju põnevamaks.
Oleme kogu õppe välja töötanud vabavaraliste Microsoft Visual Studio ja SQL Server Express versioonide baasil. Need tööriistad on mõeldud spetsiaalselt õpilastele ja asjaarmastajatele Microsofti platvormiga tutvumiseks. Kellel on huvi professionaalsete tööriistade proovimiseks, siis tasub lähemalt tutvuda õppuritele mõeldud DreamSpark programmiga ( http://www.dreamspark.co m), mille kaudu saab alla laadida tehnilist tarkvara täiesti tasuta.
Microsofti eesmärk selliste õppematerjalide koostamisel on lihtne: tahame tuua kokku uusimat tehnoloogiat tundva põlvkonna, kes ületaks meie partnerite senised ootused ja tõstaks programmeerimise lati tasemele , kuhu me ise ulatunud pole. Sellesama materjali põhjal on edukalt testinud oma teadmisi Eesti kõige paremad arvutiõpetajad, sh ka Sinu kooli õpetaja!
Tulevased maailma parimad koodimeistrid, edu teile!
Rain Laane
Microsofti Eesti esinduse juht

Sissejuhatus

Käesolev juhend on mõeldud kasutamiseks õppematerjalina Veebistuudiumis. Juhendis antakse edasi põhiteadmised, mis on vajalikud andmebaasipõhiste ASP.NET 3.5 veebirakenduste loomiseks.
Koostades alustasime põhitõdedest ning väga keerulisi konstruktsioone ei käsitle. Selle juhendiga töötamiseks piisab , kui on olemas huvi programmeerimise vastu.
Kuigi .NET raamistik võimaldab koodi kirjutamist kümnetes erinevates keeltes, piirdume siin juhendis C# keelega, kui keelega, mis on spetsiaalselt loodud .NET raamistiku tarbeks. Andmebaaside osas vaatleme SQL Server 2008 võimalusi ning XML failide kasutamist.
Õppematerjali väljatöötamist toetasid Microsoft Eesti, BCS Koolitus ja Tiigrihüppe Sihtasutus .
Avastamisrohkeid õpinguid!
Erki Savisaar ja Jaagup Kippar
BCS Koolituse lektorid

Õppematerjali kasutamise juhis

Siinses materjalis on hulgem lehekülgi ja peatükke. Esimese hooga võib see tekst väljatrükituna kätte võttes suisa ära ehmatada. See pole aga sugugi autorite eesmärk. Kirjutist koostades on mõeldud nii algajate kui edasijõudnute peale. Et eesti keeles pole . NETi kohta midagi põhjalikumat kirjutatud, siis püüab see õppematerjal sobida võimalikult paljudele, kel teema kohta huvi või vajadus. Eks edasijõudnud suudavad juba ise sobivaid teemasid leida ning ka veebist ja suurematest targematest raamatutest juurde otsida. Siin aga peaksid siiski nii veebirakenduste, andmebaaside kui ka „puhta“ programmeerimise kohta olema sees põhitõed, mille abil on enamik ettetulevatest olukordadest võimalik ära lahendada ning nende oskuste põhjal olla piisavalt tasemel, et suuta soovi korral arvutifirmasse praktikale minna ja mõne ajaga sealsesse töösse sulanduda.
Päris algajatele on valida kaks sisendpunkti, kust peaks saama alustada „tavainimese“ arvutialaste teadmiste – ehk siis teksti kirjutamise ja failide salvestamise oskusega. Lihtsam, ilusam ja värvilisem on ASP.NETi peatüki algusosa , kus saab enesele veebilehe kokku panna ja seda soovide järgi kujundada. Edasi sealt juba oskused andmete lugemiseks ja salvestamiseks.
Kel aga tahtmist kohe tõsisemalt programmeerimismaailma siseneda, nende algajate jaoks peaks ka C# peatükk täiesti õpitav olema. Võrreldes veebimaailmaga on sealne kasutajaliides tunduvalt mustvalgem, aga selle eest on jälle tunduvalt vähem kohti, kuhu programmeerimise käigus eksida võiks. Esimese mõnekümne leheküljega saab ülevaate programmeerimise põhimõistetest ja –võimalustest. Edasi suuremaks väljakutseks on objektorienteeritusega seonduv , millest tänapäeval vähegi suurema programmi kirjutamisel ei saa üle ega ümber. Viimased punktid C# juures aga on pigem edasijõudnutele erilisematel juhtudel hakkama saamise või siis sertifikaadieksamiks valmistumise tarbeks. Ka on kõrgkoolidel võimalus kasutada C# materjali oma programmeerimise põhikursuse alusena – senised katsed on olnud edukad .
Veebistuudiumi materjali muud peatükid on ka üles ehitatud põhimõttel, et lihtsamast ja tuttavamast keerukama ja võõrama poole. Andmebaaside juures alustamiseks on baasi ja tabeli loomine hädavajalik tegevus. Lihtsama ülesehitusega päringud kuuluvad iga rakenduse juurde ning sageli saab nendega küllalt palju ära teha. Kui aga andmed keerukamad, siis paratamatult tuleb tabeleid siduda ning sobivate väljavõtete saamiseks ka ridu grupeerida ning nende pealt tulemusi kokku arvutada. Praktiliste andmebaasirakenduste koostamiseks võiks siinne materjal päris hea aluse anda. Kui aga peetava kursuse eesmärgiks on anda ka andmebaaside projekteerimise põhialused (nagu kõrgkoolides kombeks), siis on vaja lisaks tutvuda veel andmemudelite, normaalkujude jm. andmebaasiteooria alla kuuluvate teemadega.
Iga osa lõpus on ülesanded. Neid on püütud sättida nõnda, et keskmisel õppuril oleks paras jutt läbi lugeda, läbi mõelda, mõni näide ka järele proovida. Ning siis ülesanded ette võtta ja nende abil kogu lugu otsast peale uuesti läbi teha. Kui aga mõni ülesanne tundub juba tõsiselt tuttav ja liialt lihtne, eks selle või siis vahele jätta. Või kiiresti läbi proovida, et kas ikka on nii lihtne kui pealtnäha tundub. Samuti, kui pärast ülesannete läbitegemist kipub vastav peatükk ikka segaseks jääma, tuleb kindlasti kasuks, kui enesele või oma õpilastele mõned teemakohased toimetused juurde mõelda ning sealtkaudu kogu lugu veel korra läbi katsetada. Kordamine on tarkuse ema. Ning eriti hiljem aluseks olevate teemade puhul tuleb ikka kasuks, kui see veelkord pulkadeni läbi näritud ja enesele selgeks tehtud on.
Soovitavat õppematerjali kasutusvõimalust saab vaadata ka järgneva skeemi pealt:

Kuidas saada abi küsimustele

Kõigepealt õnnitlused: vähemasti küsimus on olemas - seda polegi nii vähe. Igaks juhuks korda siiski küsimust mõttes mitu korda üle, et omal selge oleks, mida täpselt teada tahad . Ja kui selle kohta midagigi on mõnes kättesaadavas õpikus olemas, siis loe sealt vastavad kohad üle. Kui esimese korraga vastust ei leidnud, pole hullu . Loe igaks juhuks teine ja kolmas kord veel ning mõtle, et kas mõni lause võiks ehk niidiotsa anda, kus kannataks ise omal jõul edasi arutleda. Päris väheste, kuid samas kindlate algandmete ja tubli mõttetööga saab reaalmaailmas küllaltki palju kokku panna. Nii nagu füüsikas enamiku liikumisega seotud arvutusi saab teha paari lühikese valemi ja talupojamõistuse ning kannatuse põhjal, nii ka arvutiprogrammide loomisel pole hädavajalikke algandmeid kuigi palju.
Kui aga oma mõistus siiski lootusetult tundub otsa saama, siis tasub abi otsida. Otsimootorid suudavad maailmast märkimisväärse osa andmeid välja pakkuda - kui ainult õige märksõna leiab. Üldistele muredele üldisi lahendusi on hulgem üles kirjutatud, aga neist midagi omale sobivat välja noppida on küllalt raske. Kui aga juba õnnestub täpsustada teema, programmeerimiskeel või otsingusse sisse anda konkreetse veateate tekst, siis on rohkem asjalikke vastuseid loota .
Microsofti-spetsiifiliste küsimuste korral leiab palju asjalikku abi aadressilt http://msdn.microsoft.co m - seda nii konkreetse keele/ tehnoloogia alt kui ka üldtutvustuste kaudu. Igati põhjalik tasuta abimaterjal ka siis lugemiseks, kui konkreetseid küsimusi parajasti ei ole - küll lugemise peale näpud sügelema hakkavad ja tehes ka küsimused tekivad.
Kui peaksid õpingute käigus takerduma, siis oled teretulnud kasutama abi saamiseks Eneta kommuuniportaali foorumit www.eneta.ee/foorum. Kui jääd hätta programmide installeeri­misega, tarkvara kasutamisega või Sul tekib mistahes muu Microsofti tehnoloogia kasuta­misega seotud küsimus ja vajad nõu, siis Eneta foorumisse on kaasatud paljud asjatundjad sind abistama. Samuti peavad Veebistuudiumi lektorid ja korraldajad foorumitel silma peal ning katsuvad omaltpoolt murelikele pääseteid soovitada.
Kuidas saada tööle koodijupp, mis ei tööta?
Iga vähegi uue teema juures on selline küsimus täiesti loomulik. Saades aga katsetuste abil kotermannist võitu, on lootust, et järgmised samateemalised lõigud juba lihtsamalt lähevad.
Eriti hea, kui on võtta/kopeerida ligikaudu sarnast tööd tegev ning töötav näide - olgu õpikust, veebist, oma vanade näidete seast või mujalt. Pannes kõrvuti töötava koodi ning mittetöötava koodi, tasub hakata töötavat koodi ühe sammu kaupa uue koodi poole muutma . Iga sammu järel kontrollides, et kas rakendus ikka tööle läheb. Kui sammud on piisavalt pisikesed, siis on hea vaadata, millise juures neist järsku töötamine lakkab - selle järgi juba võimalik edasi nuputada. Vahel juhtub ka olukordi , kus töötavast näitest mittetöötava juurde liikumisel saadakse lõpuks pealtnähasamasugune, ent töötav kood. Siis on ju kõik hästi, mõistatuse põhjuseks sellisel juhul enamasti mõni sisse lipsanud või mujalt kaasa tulnud vigane sümbol, mis kompilaatori töö sassi ajab. Nõnda muutmise teel aga saab ka sellistest muredest lahti.
Kui pole käepärast niisama sobivat töötavat näidet, siis aitab vigasest näitest ridade/plokkide välja kommenteerimine. Et kui alles jäänud vaid tühi koodilõik koos algus- ja lõpusulgude/märkidega, siis see kas hakkab tööle, või on käivitusviga hoopis koodist väljapool. Näiteks kipub vahel juhtuma, et mõned koodifailid on jäänud ülekandmise käigus projektist välja ning seetõttu ei saa neid kasutada. Kui aga tühi koodilõik hakkab tööle, siis saab edasi rakendada juba sama taktikat, mis eelmises lõigus. Ehk siis rea või paari kaupa hakata koodi tagasi panema , mõelda, et mis iga korraga uut peaks toimuma hakkama ning kontrollida, et kas nii ka hakkas.
Kui aga tundub, et kõik peaks õige olema, aga ikkagi toimub midagi kahtlast, siis tasub võtta detektiivi roll ning püüda asuda tõestama, et mõni stantardne koodikäsklus toimib vigaselt. Kõige kindlam võimalus midagi tööle saada on tõestada, et seda pole olemasolevate vahenditega võimalik teha. Enamasti selgub süstemaatilise läbiproovimise käigus siiski, et soovitud lahendus on tehtav - kuigi mõnikord küllaltki pikka teed pidi. Paratamatult aga leidub kohti, kus ka programmeerimiskeele enese käsklus käitub vähemasti mõningates olukordades kõhutunde pakutust erinevalt. Vahel aitab sellistel puhkudel manuaali lugemine. Välistatud pole aga ka olukord, kus on võimalik tehnoloogia autoritele saata uhkusega kiri, kus kirjeldada leitud viga ning selle esinemise olukordi - enne muidugi mitmel moel selle esinemist ise läbi katsetades. Kui raamistik pole surnud, vaid elab järgmiste versioonide tekkimise näol edasi, siis sellised teated on arendajatele igati tänuväärsed ning samas tõstavad saatja enesetunnet ja enesekindlust.

Microsoft .NET platvorm

Microsoft .NET raamistik ( Framework ) on platvorm programmide loomiseks. Enne .NETi oli võimalik programme luua mitmetele erinevatele platvormidele nt DOS, Win32, Linux jne. .NET platvormi loomise eesmärk on võtta programmeerija õlult kohustus tagada programmi ühilduvus erinevate protsessorite ja operatsioonisüsteemidega, andes rohkem aega programmiga põhifunktsionaalsusega tegelemiseks. Riistvara ja operatsioonisüsteemidega ühilduvuse tagamine on jäetud raamistiku loojate hooleks.
Lisaks Microsoftile, kes pakub raamistiku Windowsi operatsioonisüsteemidele, arendatakse Novelli toetusel analoogset platvormi ka Linux, Solaris, Max OS X ja Unix operatsioonisüsteemile (lisaks on toetatud ka Windowsi operatsioonisüsteem). Platvormi nimeks on Mono ning selle kohta saab rohkem lugeda aadressilt www.mono‑project.com. Mõlemad lahendused baseeruvad ühtedel ja samadel ECMA/ISO poolt kinnitatud avatud standarditel.
Kõige aluseks nende platvormide loomisel on CLI e. Common Language Infrastructure, mis kirjeldab ära, millised peavad olema keeled, mida platvormil saab kasutada ning millisele kujule peavad nendes keeltes kirjutatud koodid kompileeruma. CLI üks huvitav omadus on see, et enam pole vahet, millises keeles programmeerid, sest kompileeritud kood on lõpuks ikkagi sama. Seega saab iga programmeerija valida endale just selle keele, mis kõige hingelähedasem.
Järgmine tase on CLR e. Common Language Runtime (Mono puhul CLI virtual machine), mis pakub hallatud (turvalist) keskkonda programmeerimiseks. Selles hallatud keskkonnas on keskse kontrolli all klasside laadimise e. mälu hõivamine, mälu vabastamine (Garbage collector) ning vahekoodi kompilaator masinkoodiks. Lisaks pakub CLR programmi loomiseks vajalikke klasse . Lisaks klasside kasutamise võimalusele on paljud neist ka päritavad e. nendest on võimalik pärimise teel luua oma klasse.
Kõrval asuvalt diagrammilt on näha, et raamistik lisab uue kihi programmi ja riistvara vahele, mis loomulikult ei mõju hästi programmi jõudlusele. Hea uudis on see, et Microsofti .NET raamistik integreerub üsna ilusti Windowsi sisse muutudes osaks Windowsist. Enamgi veel, kui võtta Microsofti viimane Windows e. Vista siis raamistik ongi Windows! See tähendab seda, et kõik klassid ja meetodid, mida Microsoft kasutab oma operatsioonisüsteemi loomisel, on kasutamiseks ka kõigile teistele arendajatele, mis omakorda annab kätte väga võimalusterohked vahendid kiiresti funktsionaalsete programmide ehitamiseks.
CLR rakenduste kompileerimine käib kahes faasis:
  • Esimese sammuna programmeerija kompileerib oma lähtekoodi vahekeelde. Microsofti raamistiku puhul on selleks MSIL (Microsoft Intermediate Language).
  • Teise sammuga käivitamise hetkel CLRi kooseisus olev kompilaator kompileerib MSILi masinkoodi, mida protsessor hakkab täitma. Kompileeritakse vaid need osad programmist, mida kasutatakse e. kompileerimine on kiire, kuigi esimene käivitamine võib olla aeglasem kui kohe binaarsel kujul oleval programmil.
Viimasel hetkel kompileerimise eelis seisneb selles, et protsessorile käivitamiseks mõeldud binaarset koodi on võimalik optimeerida täpselt selle protsessori jaoks, mis hakkab programmi jooksutama. Ei ole vahet, kas protsessor on 32 või 64 bitine jne.
Tulles nüüd tagasi Microsofti .NET platvorm juurde siis see pole mitte üksnes CLR, vaid toodete kogumik, mis sisaldab kõiki vajalikke vahendeid jagatud rakenduste ehitamiseks, pakkudes keelest sõltumatut, ühtset programmeerimise mudelit programmi kõigi kihtide jaoks. .NET platvorm toetab täielikult Interneti platvormist sõltumatuid ja standardseid tehnoloogiaid nagu HTML, XML ja SOAP .
.NET platvormiga seotud tooted võib jagada 4 kategooriasse:
  • .NET raamistik – baseerub Common Language Runtime’l (CLR). CLR pakub baasteenuseid ja klasse programmide loomiseks, sõltumata keelest ja programmi kihist .
  • .NET My Services – on kogumik kasutajatele suunatud XML veebiteenuseid. Nende teenuste hulka kuuluvad: .NET Passport autentimine, meeldetuletuste saatmine ja vastuvõtmine, personaalse info ja andmete salvestamise võimalus
  • .NET Enterprise Servers – pakuvad lisafunktsioone ärirakenduste tarbeks. Enterprise serverid on nt SQL Server (andmebaaside tarbeks), Exchange (kirjavahetuse jaoks) jne
  • Visual Studio – Vahend .NET rakenduste loomiseks. Lisainfot Visual Studio kohta saab Microsoft veebist http://msdn.microsoft.com/vstudio . Visual Studio 2008st on olemas mitmeid versioone. Programmeerimistee alustamiseks ja katsetamiseks on loodud spetsiaalsed tasuta versioonid Visual Studio Express näol. Express versioone on võimalik tõmmata aadressilt http://msdn.microsoft.com/express . Selle kursuse raames on kasu kahest versioonist Visual Web Developer 2008 Express – ASP.NET 3.5 veebirakenduste loomiseks ja Visual C# Express Edition lihtsalt C# keeles programmeerimise jaoks.
Selleks, et .NET platvormile loodud programme käivitada, on vaja .NET raamistikku. Juhul, kui Teil seda arvutis veel ei ole, on seda võimalik tõmmata mitmelt veebilehelt, sh Windows Update 'st või www.microsoft.com/net
Programmeerimiskeeltena on vaikimisi võimalik kasutada (kompilaatorid sisalduvad .NET raamistikus) C#, hallatud C++, VB.NET ja J# keeli. Lisaks nendele pakutakse erinevate tootjate poolt veel ca 40 .NET keelt.
Microsoft on .NET raamistikust loonud juba mitmeid versioone. Selle materjali loomise hetkeks on väljas versioon  3.5 koos SP1 teenusepaketiga. Hea uudis nende paljude versioonide juures on see, et igas uues versioonis sisaldub ka vana e. midagi tuleb juurde, kuid kõik see, mis oli, töötab edasi!
Kui vaadelda erinevaid .NET raamistiku versioone siis selgub, et .NET põhifunktsionaalsus pärineb hetkel versioonist 2.0, millele on siis lisatud funktsionaalsust järgnevate versiooniuuendustega.
Versiooniga 3.0 lisati juurde:
WPF – Windows Presentation Foundation so uus kasutajaliidese ehitamise liides, mis asendab Winform’id. WPF baseerub XMLil ning vektrograafikal, mis oskab kasutada 3D arvutigraafika riistvara ning Direct 3D tehnoloogiat.
WCF – Windows Communication Foundation so teenusepõhine teadetevahetussüsteem, mis võidab programmidel suhelda nii lokaalselt kui ka üle võrgu. Asendab Web Serviced
WF – windows Workflow Foundation võimaldab automatiseerida tegevuste sooritamist ning luua erinevatest tegevustest transaktsioone kasutades töövooge.
Windows CardSpace – tarkvarakomponent, mis hoiustab turvaliselt kasutaja digitaalseid identiteetiteete ning pakub ühtset liidest identiteedi valimiseks erivatele transaktsioonidele nagu nt veebilehele sisselogimine.
Versiooniga 3.5 lisandus LINQ – Language INtegrated Query, mis pakub ühtset päringute kirjutamise liidest erinevat tüüpi andmeallikatele. Päringute loomise käsustik on integreeritud keele sisse, sellest tulenevalt kaasnevad .NET 3.5ga ka uued versioonid keeltest C# ja VB.NET. Esialgu on koos raamistikuga kaasas LINQ teenusepakkujad päringute tegemiseks objektidest , XMList ja SQL Serverist.
Lisainfot .NET raamistiku erinevate versioonide kohta leiate aadressilt http://en.wikipedia.org/wiki/.net_framework#versions/

C#

Mõnigi võib ohata, et jälle üks uus programmeerimiskeel siia ilma välja mõeldud. Teine jälle rõõmustab, et midagi uut ja huvitavat sünnib. Kolmas aga hakkas äsja veebilahendusi kirjutama ja sai mõnegi ilusa näite lihtsasti kokku. Oma soovide arvutile selgemaks tegemise juures läheb varsti vaja teada, "mis karul kõhus on", et oleks võimalik täpsemalt öelda, mida ja kuidas masin tegema peaks. Loodetavasti on järgnevatel lehekülgedel kõigile siia sattunute jaoks midagi sobivat. Mis liialt lihtne ja igav tundub, sellest saab kiiresti üle lapata. Mis esimesel pilgul paistab arusaamatu, kuid siiski vajalik, seda tasub teist korda lugeda. Ning polegi loota, et kõik kohe lennult külge jääks!?
Selle jaoks on teksti sees koodinäited, mida saab kopeerida ja arvutis tööle panna. Ning mõningase muutmise ja katsetamise peale avastada , mis mille jaoks on ning kuidas seda oma kasuks rakendada saab. Töötav näide on üks hea kindel tugipunkt nagu üks suur puu lagendikul, kuhu oskab alati tagasi minna. Juhul, kui muutmistega on õnnestunud oma koodilõik nii sõlme keerata, et see sugugi enam töötada ei taha, saab alati võtta materjalist taas algse töötava näite ning sealt juurest katsetama hakata.
Kes pikemalt mitmesuguseid rakendusi kirjutab, avastab mõne aja pärast, et samas keeles kirjutatud programm võib vähemalt esmapilgul mõnevõrra erinev välja näha sõltuvalt sellest, kas programm käivitatakse veebist, tegutsetakse nuppudega ja tekstiväljadega aknas , väljundiks on mobiiltelefon või piirdub kogu tegevus tekstiaknaga. Esimesel korral võib tunduda, et oleks nagu täiesti eri keeltes ja eri moodi kirjutamine. Ühes kohas on alati koodi juures salapärane button1_click, teises public static void Main ning kolmandas veel midagi muud. Aga sellest ei tasu ennast väga häirida lasta. Ehkki .NETi ja C# juures on püütud eri kohtades käivituvate rakenduste loomist sarnasemaks muuta, tuleb siiski kirjutamisel arvestada käivitumiskoha võimalustega. Siin materjalis keskendume C# keele ülesehitusega seotud teemadele, mis on ühised kõigi käivitumiskohtade puhul. Ning kasutajaliidesena pruugime programmeerimisõpikute traditsioonilist lihtsat ning väheste (eksimis)võimalustega tekstiakent - nii jääb rohkem aega tähelepanu pühendada keele enese konstruktsioonidele, mida siis edaspidi julgesti veebirakenduste juures ja soovi korral mujalgi pruukida. Kes aga tahab omale koodi kirjutamiseks rohkem abivalmis ning lisavõimalustega keskkonda, sellele soovitame lugeda peatükki nimega Visual Studio C# Expressi install – samm sammult juhis vastava keskkonna paigaldamiseks ning esimese rakenduse käivitamiseks. Edasine kirjutamine sarnaselt konspektis olevale.

Põhivõimalused

Kui rakendus juba mingitki elumärki annab, on see tunduvalt rohkem, kui lihtsalt hulk koodi, mis peaks "midagi arukat" tegema. Tunne, et suutsin programmi ise, omade roosade kätega käima panna, on hea. Ja annab kindlustunde, et järgmisel korral saab asi ainult paremaks minna. Kui käima on lükatud, siis edasi võib mõtelda juba juurde panemise peale. Nii nagu talumees, kes omale krati oli ehitanud, sai hakata talle ülesandeid andma alles siis, kui kratt hinge sisse võttis. Muul juhul on tegemist palja põhuhunnikuga, millele teivas sisse löödud ja vanad kartulikorvid külge riputatud - olgu need nii suured ja vägevad tahes. Tööle hakkamiseks on hinge vaja. Aga hinge ei saa enne sisse puhuda, kui väikegi tervik olemas. Ning C# puhul näeb lühim tervikprogramm välja ligikaudu järgmine:
using System;
class Tervitusarv1, arv2, arv1*arv2);
C:\Projects\oma\naited>Arvutus
Esimene arv:
3
Teine arv:
5
Arvude 3 ja 5 korrutis on 15
Ülesandeid
* Küsi kahe inimese nimed ning teata, et täna on nad
pinginaabrid
* Küsi ristkülikukujulise toa seinte pikkused ning arvuta põranda pindala
* Leia 30% hinnasoodustusega hinna põhjal alghind

Valikud

Ehk võimalus otsustamiseks, kui on vaja, et programm käituks kord üht-, kord teistmoodi. Allpoololev näide koos väljundiga võiks näidata, kuidas tingimuslause abil tehtud valik toimib.
using System;< elseConsole.WriteLine(.", tund);
D:\kodu\0606\opikc#>Kordus3
Sisesta tund vahemikus 0-23
32
Sisesta tund vahemikus 0-23
11
Tubli, sisestasid 11.
Ülesandeid
* Trüki arvude ruudud ühest kahekümneni
* Küsi kasutajalt viis arvu ning väljasta nende summa
* Ütle kasutajale "Osta
elevant ära!". Senikaua korda küsimust, kuni kasutaja lõpuks ise kirjutab "elevant".

Korrutustabel

... ehk näide, kuidas eelnevalt vaadatud tarkused ühe programmi sisse kokku panna ning mis selle peale ka midagi tarvilikku teeb.
Algul on näha, kuidas otse programmi käivitamise juures ka mõned andmed sinna kätte anda. Et kui kirjutan
Korrutustabel 4 5
siis saadakse sellest aru, et soovin korrutustabelit nelja rea ja viie veeruga. Nende käsurea parameetrite püüdmiseks on alamprogramm Main-i ümarsulgudes koht string[] argumendid. Kõik käsureale kirjutatud sõnad (ka üksik number on arvuti jaoks sõna) pannakse sinna argumentide massiivi ehk jadasse, kust neid järjekorranumbri järgi kätte saab. Andmetüüp string[] tähendabki, et tegemist on stringide ehk sõnede ehk tekstide massiiviga. Kirjutades massiivi järgi . Length , saab teada, mitu elementi selles massiivis on - mis praegusel juhul on võrdne lisatud sõnade arvuga käsureal. Kõik sõnad saab ka ükshaaval järjekorranumbri järgi kätte. Arvestama peab ainult, et sõnu hakatakse lugema numbrist 0. Nii et kui eeldatakse, et tegemist on kahe parameetriga, siis nende kättesaamiseks peame ette andma numbrid null ja üks.
Nagu tingimusest on näha: juhul kui argumente pole täpselt kaks, siis kasutatakse vaikimisi ridade ja veergude arvu ning joonistatakse korrutustabel suurusega 10 korda 10.
Tabeli trükkimiseks on kaks for-tsüklit paigutatud üksteise sisse. Selles pole midagi imelikku - iga rea juures trükitakse kõik veerud esimesest kuni viimaseni. Ning selleks, et erinevate numbrite arvuga arvud meie tabelit sassi ei lööks, on väljatrü. Ainsat Console.Write argumenti (järjekorranumbriga 0) trükitakse nõnda, et ta võtaks alati viis kohta.
using System;<", a, b, Korruta(a, b));
Console.WriteLine(Korruta(3, 5));
C:\Projects\oma\naited>Alamprogramm
4 korda 6 on 24
15
Ülesandeid
* Koosta alamprogramm kahe arvu keskmise leidmiseks
* Koosta alamprogramm etteantud arvu tärnide väljatrükiks. Katseta .
* Küsi inimeselt kolm arvu. Iga arvu puhul joonista vastav kogus tärne ekraanile

Massiivid

Kuna arvuti on mõeldud suure hulga andmetega ümber käimiseks, siis on programmeerimiskeelte juurde mõeldud ka vahendid nende andmehulkadega toimetamiseks. Kõige lihtsam ja levinum neist on massiiv . Iga elemendi poole saab tema järjekorranumbri abil pöörduda. Algul tuleb määrata, millisest tüübist andmeid massiivi pannakse ning mitu kohta elementide jaoks massiivis on. Järgnevas näites tehakse massiiv kolme täisarvu hoidmiseks. Kusjuures nagu C-programmeerimiskeele sugulastele kombeks on, hakatakse elemente lugema nullist. Nii et kolme massiivielemendi puhul on nende järjekorranumbrid 0, 1 ja 2. Tahtes väärtusi sisse kirjutada või massiivist lugeda, tuleb selleks kirja panna massiivi nimi (praeguse juhul m) ning selle taha kandiliste sulgude sisse järjekorranumber, millise elemendiga suhelda tahetakse.
using System;<;
Array.Sort(m);
for(int i=0; iMassiiv4
33
40
48

Osutid ja koopiad

Kui ühe hariliku täisarvulise muutuja väärtus omistada teisele, siis mõlemas muutujas on koopia samast väärtusest ning toimingud ühe muutujaga teise väärtust ei mõjuta. Massiividega ning tulevikus ka muude objektidega tuleb tähelepanelikum olla. Kui üks massiiv omistada teisele, siis tegelikult kopeeritakse vaid massiivi osuti, mõlema muutuja kaudu pääsetakse ligi tegelikult samadele andmetele. Nagu järgnevas näites: massiivid m2 ja m näitavad samadele andmetele. Kui ühe muutuja kaudu andmeid muuta, siis muutuvad ka teise muutuja kaudu nähtavad andmed nagu väljatrüki juures paistab. Algselt on massiivi m ja m2 elemendid 40, 48, 33. Pärast massiivi m elemendi number 1 muutmist 32ks, on ka massiivi m2 elemendid muutunud - väärtusteks 40, 32, 33. Nõnda on suurte andmemassiivide juures teise muutuja tegemine andmete juurde pääsemiseks arvuti jaoks kerge ülesanne. Samas aga peab vaatama, et vajalikke andmeid kogemata ettevaatamatult ei muudaks. <;
int[] m2=m; // Viide samale massiivile
Tryki(m2);
m[1]=32;
Tryki(m2);
Kui soovida, et kaks algsetest andmetest pärit massiivi on üksteisest sõltumatud, siis tuleb teha algsest massiivist koopia (kloon).
int[] m3=(int[])m.Clone(); //Andmete koopia
m[1]=20;
Tryki(m3);
Pärast kloonimist muutused massiiviga m enam massiivi m3 väärtusi ei mõjuta.
Soovides massiivi tühjendada, aitab klassi Array käsklus Clear , mis täisarvude puhul kirjutab etteantud vahemikus (ehk praegusel juhul kogupikkuses, 0 ja Length-i vahel) täisarvude puhul väärtusteks nullid .
Array.Clear(m3, 0, m3.Length); //Tühjendus
Massiivist andmete otsimiseks sobib käsklus IndexOf. Soovitud elemendi leidumise korral väljastatakse selle elemendi järjekorranumber. Otsitava puudumisel aga -1.
Console.WriteLine(Array.IndexOf(m,33));
Console.WriteLine(Array.IndexOf(m,17)); // puuduv element
using System;<,<
Console.WriteLine(m[0, 1]); //48
Console.WriteLine("M66dete arv: "+m. Rank );
Console.WriteLine("Ridade arv: "+m.GetLength(0));
Console.WriteLine("Veergude arv: "+m.GetLength(1));
//elemente mõõtmes nr. 1
int summa=0;
foreach(int arv in m){
summa+=arv;
Console.WriteLine("Summa: "+summa);
C:\Projects\oma\naited>Massiiv8
48
M66dete arv: 2
Ridade arv: 2
Veergude arv: 3
Summa: 197
Ülesandeid
* Küsi kasutaja käest viis arvu ning väljasta need tagurpidises järjekorras.
* Loo alamprogramm massiivi väärtuste aritmeetilise keskmise leidmiseks. Katseta.
* Loo alamprogramm, mis suurendab kõiki massiivi elemente ühe võrra. Katseta.
* Sorteeri massiiv ning väljasta selle keskmine element.
* Koosta kahemõõtmeline massiiv ning täida korrutustabeli väärtustega. Küsi massiivist kontrollimiseks väärtusi.

Käsud mitmes failis

Suuremate programmide puhul on täiesti loomulik, et kood jagatakse mitme faili vahel. Nii on hea jaotuse puhul kergem orienteeruda. Samuti on mugav terviklike tegevuste plokke muudesse programmidesse ümber tõsta, kui see peaks vajalikuks osutuma. Siin näites on kaks lihtsat arvutustehet omaette abivahendite klassis välja toodud.<);
foreach(string linn in linnad){
Console.WriteLine(linn);
Console.WriteLine(String.Join("; ", linnad));
D:\kodu\0606\opikc#>Tekst3
Tallinn
Tartu
Narva
Tallinn; Tartu; Narva
Ülesandeid
* Trüki inimese nime eelviimane täht
* Teata, kas sisestatud nimi algab A-ga
* Trüki sisestatud nimi välja suurtähtedega
* Teata, kas lauses leidub sõna "ja"
* Asenda olemasolu korral "ja" sõnaga "ning" ja teata asendusest
* Trüki välja lause kõige pikem sõna

Tekstifailid

Kui samu lähteandmeid on vaja korduvalt kasutada, siis on neid igakordse sissetoksimise asemel mugavam sisse lugeda failist . Samuti on suuremate andmemahtude korral hea, kui sisendi ja väljundi andmed jäävad alles ka masina väljalülitamise järel. Keerukama struktuuriga andmete ning mitme üheaegse kasutaja korral (näiteks veebirakendustes) kasutatakse enamasti andmebaasi. Käsurea- või iseseisva graafilise rakenduse puhul on tekstifail aga lihtne ja mugav moodus andmete hoidmiseks. Samuti on ta tarvilik juhul, kui juba pruugitakse eelnevalt tekstifaili kujul olevaid andmeid.

Kirjutamine

Andmete faili saatmiseks tuleb kõigepealt moodustada voog etteantud nimega faili kirjutamiseks. Edasine trükk toimub juba sarnaselt ekraaniväljundiga Write ning WriteLine käskude abil. Lõppu tuleb kindlasti lisada käsklus Close , et teataks hoolitseda andmete füüsilise kettale jõudmise eest ning antakse fail vabalt kasutatavaks ka ülejäänud programmide jaoks. Siinse näite tulemusena tekib käivituskataloogi lihtne fail nimega "inimesed.txt", kuhu kirjutatakse kaks nime. Tekstiekraanil enesel pole käivitamise järel midagi näha - aga see veel ei tähenda, nagu programm midagi ei teeks . Lihtsalt tema töö tulemus jõuab loodavasse faili.
using System;
using System.IO;<;
Console.WriteLine(nimed[r.Next(nimed.Length)]); //Juhuslik nimi
D:\kodu\0606\opikc#>Juhuarv1
0,74339002358885
11
95
Kati
Ülesandeid
* Trüki juhuslike teguritega korrutamisülesanne
* Kontrolli, kas kasutaja pakutud vastus oli õige
* Sõltuvalt vastuse õigsusest lase arvutil pakkuda olemasolevate hulgast valitud kiitev või julgustav kommentaar.

Omaloodud andmestruktuur

Standardandmetüüpe on .NET raamistikus kätte saada palju. Klasside arvu loetakse tuhandetes. Sellegipoolest juhtub oma rakenduste puhul olukordi, kus tuleb toimetada andmetega, mille hoidmiseks mugavat moodust pole olemas. Või siis on keegi kusagil selle küll loonud, aga lihtsalt ei leia üles. Harilike muutujate ja massiivide abil saab küll kõike arvutis ettekujutatavat hoida. Vahel aga on mugavam, kui pidevalt korduvate sarnaste andmete hoidmiseks luuakse eraldi andmetüüp. Siis on teada, et kokku kuuluvad andmed püsivad kindlalt ühes kohas koos ning pole nii suurt muret, et näiteks kahe firma andmed omavahel segamini võiksid minna.
Järgnevas näites kirjeldatakse selliseks omaette andmestruktuuriks punkt tasandil, kaks täisarvulist muutujat asukohti määramas.
structKui aga vähemalt üks programmeerija loodud konstruktor on olemas, siis seda nähtamatut konstruktorit ei tehta . Päriluse puhul kutsutakse alamklassi eksemplari loomisel alati välja ülemklassi konstruktor. Vaikimisi võtab kompilaator selleks ülemklassi parameetritega konstruktori. Kui see aga puudub või soovitakse käivitada mõnda muud, siis tuleb sobiva konstruktori väljakutse alamklassi juures ära märkida. Siin märgitakse näiteks Modelli loomise juures, et Modelli isendi loomise juures tehakse kõigepealt valmis baasklassi (inimese) isend , kellele siis Modelli enese konstruktoris vajalikud lisandused juurde pannakse. Ülemklassi konstruktori määramine on kohe Modelli konstruktori juures. Pärast koolonit olev base(vanus) ütleb, et kasutatagu inimese puhul seda konstruktorit, kus tuleb täisarvuline vanus kohe ette öelda.
public Modell(int vanus, int uymberm66t):base(vanus){
ymberm66t=uymberm66t;
Ehkki praegu tegelikult muud võimalust polnudki , tuleb see ikkagi arvutile ette öelda.
using System;<
public override void YtleVanus(){
Console.WriteLine("Minu vanus on "+(vanus-5)+" aastat"); <
public void Tervita(String tuttav){
Console.WriteLine("Tere, "+tuttav);<
public override double KysiKorgus(){return 1.5;}<",
t.KysiRuumala(), v.KysiRuumala());
D:\kodu\0606\opikc#>AbstraktseKlassiUuring
Ruumalad 12 ja 282,743338823081
Ülesandeid
* Lisa klassile Kujund abstraktne meetod PohjaYmbermoot ning meetod KyljePindala. Katseta - lisades vajalikud meetodid ka alamklassidesse.
* Loo Kujundi alamklass Risttahukas lisades talle vajalikud väljad kolme mõõtme hoidmiseks ja kattes üles Kujundi abstraktsed meetodid. Katseta mitmesuguste Risttahuka eksemplaridega.
* Koosta mitmesuguste Kujundite massiiv. Loo alamprogramm leidmaks massiivis olevate kujundite ruumalade summa. Loo eraldi alamprogramm leidmaks massiivis olevate kujundite pindalade summa.

Meetodite asendus

Harilikult kirjutatakse meetodite üle katmise juures ülemklassi meetodi ette virtual ning alamklassi juurde override. Sellisel juhul alamklassi (siinses näites Daami) objekti puhul kasutatakse alati seda meetodit, mis tema juurde käib - sõltumata, millisest tüübist on muutuja, mille kaudu eksemplari poole pöördutakse. C++ võimalusi säilitades aga on jäetud ka teine võimalus. Meetodi võib asendada nõnda, et tema kirjeldamise ette kirjutatakse sõna new. Sel juhul peidetakse vana meetod samuti ära. Vana meetodi saab aga kätte juhul, kui objekti poole pöörduda ülemklassi muutujast, kus vastav meetod vanal kujul kasutusel oli. Kui virtual/override puhul pidid parameetrid ja väljastustüüp samaks jääma, siis new loob täiesti uue ja eelmisest sõltumatu meetodi.
Järgnevas näites on ehitatud kunstlik pärilusahel. Ülemklassiks Inimene, kes ütleb oma vanuse nõnda nagu see on. Inimesest pärinenud Daam võtab ilma pikemalt mõtlemata 5 aastat maha. Daami alamklassiks olev Beib keeldub üldse vanuse teatamisest ning eriti kaugele arenenud KavalBeib palub kasutajal ise tema vanust pakkuda. Sõna sealed klassi juures näitab, et sellest klassist ei lubata enam edasi pärida. Selline määrang aitab kompilaatoril koodi optimeerida.
Alljärgnevalt katsetatakse, millist tüüpi muutuja kaudu millise tegeliku objekti poole pöördumisel milline tulemus saadakse. Et omistamine on võimalik ainult ülemklassi suunas, siis igaühe neist saab omistada Inimese tüüpi muutujale. Mida tase edasi, seda vähem on omistusvõimalusi.
Katsetamise käigus antakse Beiblastele vanuseks 17 aastat, teistele 40. Ning jälgitakse, milline meetod millise muutuja kaudu väljakutsel käima läheb. Kõige pikem ja keerukam lugu on Kavala Beibega. Et ta on pärimispuus kõige kaugemal, siis teda on võimalik omistada kõikide selles puus olevate tüüpidega muutujatele. Enese tüübi puhul küsib ta vanuseks 19, nagu käskluses öeldud. Ka lihtsalt Beib-tüüpi muutuja kaudu küsib ta enesele 19, sest klassi Beib meetod YtleVanus on virtual ning tegelikult käima läheb objekti enese ehk klassis KavalBeib loodud meetod.
Edasi muutub lugu keerulisemaks. Daami-muutujast välja kutsutav Kavala Beibe vanus tuleb 12, sest ta lahutab aastad maha nagu Daamile kohane. Ning ka hariliku inimese kaudu tuleb 12, sest virtual-piiritleja kaudu võetakse käsklus võimalikult objekti enese lähedalt.
using System;<
public override void YtleVanus(){
Console.WriteLine("Minu vanus on "+(vanus-5)+" aastat"); <
new public virtual void YtleVanus(){
Console.WriteLine("Minu vanus pole sinu asi, vot!");<
public override void YtleVanus(){
Console.WriteLine(" Arvareturn (string)esinemised[kuupaev];<
public int Minut(){return minut;}
public void tryki(){
Console.WriteLine(", tund, minut);
public static
Kellaaeg operator +(Kellaaeg k1, Kellaaeg k2){
return new Kellaaeg(k1.tund+k2.Tund(), k1.minut+k2.Minut());<
public int Minut(){return minut;}
public void tryki(){
Console.WriteLine(", tund, minut);
public static Kellaaeg operator+(Kellaaeg k1, Kellaaeg k2){
return new Kellaaeg(k1.Tund()+k2.Tund(), k1.Minut()+k2.Minut());
public static implicit operator int(Kellaaeg k){
return k.Tund()*60+k.Minut();
public static explicit operator double(Kellaaeg k){
//kohustuslik muunduse näitamine
return k.Tund()+k.Minut()/60.0;
public static explicit operator Kellaaeg(int minutid){
return new Kellaaeg(minutid/60, minutid%60);< catch(FormatException probleem){
Console.WriteLine("Viga sisendandmetega: "+probleem.Message);
} catch(OverflowException){
Console.WriteLine("Liiga suur arv.");
} catch(Exception){
Console.WriteLine("Tundmatu probleem");
}catch(FormatException probleem){
Console.WriteLine("Viga teisendusel: "+probleem.Message);
D:\kodu\0606\opikc#>Erind4
Palun arv:
5
Kirjutati: 5

Erindi heitmine

Sugugi ei pea leppima vaid arvuti enese antud veateadetega. Kui ikka oma programmis paistab, et midagi läheb väga käest ära, siis on vahel kasulik ise märku anda, et sarnaselt edasi toimida pole enam mõtet. Näiteks, kui arvutuse algandmed on ilmselgelt valed (kolmnurga üks külg pikem kui teised kaks kokku), siis võib julgesti enne arvutamist teada anda, milles asi ning heita selleteemalise erindi. Edasi on juba vastavat koodilõiku väljakutsuva programmeerija ülesandeks silumise käigus kindlaks teha, millest probleem tekkis ning vastavalt edasi toimida.
Siin näites lihtsalt keelati sajast suuremate arvude sisestus . Kui arv juhtub liiga suur olema, heidetakse erind. Lihtsuse mõttes pole oma tüüpi loodud, kasutatakse SystemExceptionit. Kuigi - vähegi pikema programmi selguse huvides oleks oma tüübi loomine kasulik. Et peaprogrammis pole SystemExceptioni jaoks veapüünist, siis tuleb ette süsteemne veateade, mille järele programmeerija peab juba ise edasi mõtlema, mida edasi teha.
using System;Console.WriteLine("Viga teisendusel: "+probleem.Message);
D:\kodu\0606\opikc#>Erind5
Palun arv:
789
Unhandled Exception: System.SystemException: Liiga suur arv
at Erind5.LoeArv()
at Erind5.Main(String[] arg)
Ülesandeid
* Katseta näite "Erind2" juures, kuidas käitub programm juhul, kui ette anda veatu arv.
* Muuda täisarvu käsklused reaalarvu omadeks ja leia, mis kasutamisel muutus.
* Loo tsükkel, mille abil küsitakse arvu senikaua, kuni saadakse sobiv sisend.
* Muuda näidet "Erind5" nõnda, et see annaks peaprogrammis viisaka seletuse ka omaheidetud erindi korral.
* Loo erindeid kasutades programm, mis suurendaks faili arv.txt sisu ühe võrra. Kui fail puudub, või failis pole arv, siis antakse selgitusega veateade.
* Kui failis olev arv ületab 365, siis anna välja omapoolne erind ning püüa sellele reageerida.

Enum

Ikka leidub kohti, kus on võimalik teha piiratud arv valikuid . Asukoht Eestis on ühes maakondadest. Ühissõiduk on üldjuhul rong , tramm, troll või buss jne. Kui programmikoodis tuleb leida käitumisjuhis ühele etteantud valikutest, siis on enum hea abivahend . Maakonna nime saab kirjutada mitmeti. Olgu siis " Harjumaa ", või "Harju maakond", rääkimata suurte ja väikeste tähtede ning tühikute erisusest. Andmebaaside puhul kasutatakse üldjuhul võimalust, et ei kirjutata inimese andmete juurde maakonna nime, vaid pannakse selle maakonna kood. Ning selle järgi on vajadusel võimalik teisest andmetabelist järele vaadata, millise maakonnaga siis päriselt tegu. Midagi sarnast toimub ka enumi puhul. Ehk siis vastavas loetelus kirjeldatakse ära kõik võimalikud väärtused. Ning hiljem programmi sees pole võimalik enam vastavat nimetust valesti kirjutada ilma, et kood kompileerimata jääks. Sedasi on võimalik vältida vigu, mis muidu üllatavatel hetkedel võiksid avalduda. Tüüpiliseks kasutuskohaks on näiteks alamprogrammi parameetrid, kus enumi abil määratakse, kuidas just sel korral vastavate andmetega tuleb käituda. Järgnevas näites siis tuuakse tugevuse kohta kolm konstanti: tumm, ühekordne ja mitmekordne. Ning praegusel juhul alamprogrammis esimese variandi puhul jäetakse etteantud tekst sootuks trükkimata. Teisel juhul trükitakse ühe korra ning viimasel juhul mitu korda. Kui aga ühekordne kirjutatuks nõrga g-ga, siis jäänuks kood kompileerimata. Pealtnäha iseenesestmõistetav. Aga kui enumi asemel olnuks kasutatud stringi, siis just sellised vead on kerged tulema.
using System;<;<", ht["Kati"]);
Kontrollitakse, kas Kati on nimede hulgas olemas. Kui jah, siis trükitakse ta hinne.
ht["Sass"]=((int)ht["Sass"])-1;
Sassi hinnet alandatakse ühe võrra.
ht.Remove("Mati");
Mati eemaldatakse nimekirjast.
Tahtes kõik andmed kätte saada, aitab jälle enumeraator, ainult et igal enumeraatori elemendil on võti ja väärtus. Siin trükitakse nad lihtsalt välja, aga eks igaüks tea ise paremini, mida tal oma programmis nendega kõige mõistlikum teha on.
IDictionaryEnumerator enumr=ht.GetEnumerator();
while(enumr.MoveNext()){
string eesnimi=enumr.Key as string;
int hinne=(int)enumr.Value;
Console.WriteLine(", eesnimi, hinne);
Ning kogu näide tervikuna.
using System;
using System.Collections;<", ht["Kati"]);
ht["Sass"]=((int)ht["Sass"])-1;
ht.Remove("Mati");
IDictionaryEnumerator enumr=ht.GetEnumerator();
while(enumr.MoveNext()){
string eesnimi=enumr.Key as string;
int hinne=(int)enumr.Value;
Console.WriteLine(", eesnimi, hinne);
D:\kodu\0606\dotnet>Kollektsioon4
5
Kati: 5
Juku: 3
Sass: 3
Ülesandeid
* Küsi kasutajalt arve, kuni ta sisestab nulli. Salvesta ArrayListi. Väljasta need arvud tagurpidises järjekorras.
* Proovi eelmine ülesanne lahendada LinkedListi abil. Omadus Last annab loetelu viimase elemendi, RemoveLast() kustutab viimase.
* Loe tekstifailist arvud, väljasta nad sorteerituna teise tekstifaili.
* Loe tekstifailist arvud. Teise tekstifaili väljasta, mitu korda iga arv esines.

Mallid

Objektorienteeritus võimaldab alamklasside eksemplare omistada ülemklassi tüüpi muutujatele. Nõnda saab lahendada enamiku olukordi, kus koodilt nõutakse paindlikkust ning võimet veidi erinevaid objekte ühiselt hoida või käidelda. Kus pole võimalik objekte omistada muidu pärimispuu järgi, seal tuleb appi teadmine, et kõik pärineb ühisest ülemklassist System.Object. Või siis saab eri pärimispuudest tulnud klasside ühiseid käsklusi kasutada liideste abil. Nii et kõik vajalik peaks sellega olemas olema.
Ometigi on C# juurde kaasa võetud C++ist mallid ehk šabloonid ehk geneerilisus. Ehk siis võimalus kasutatavaid andmetüüpe määrata pärast kasutatava klassi koodi enese valmiskirjutamist. Sellega kaasneb vähemasti kaks head omadust:
* Kui andmetüüp on täpselt määratud, siis on karta vähem valest omistamisest tingitud vigu.
* Kompilaatoril on võimalik koodi optimeerida konkreetse andmetüübi omadustest lähtudes ning programmi töö käigus ei pea kulutama aega tegeliku andmetüübi kontrollimisele.
Võimalust kasutatakse tihti geneeriliste andmekollektsioonide juures. Kui muidu oli hoiustatud andmete kohta teada ainult, et need on klassi Object järglased (ehk siis nagu polnudki tüübi kohta suurt midagi teada), siis geneerilise Listi puhul saab määrata näiteks, et loetelus esinevad elemendid on täisarvud. Ning selle põhjal on edaspidises kasutuses teada, et vastavast loetelust välja võetavad andmed on ka sama tüüpi. Nagu järgnevast näitest näha, siis ka loetelu läbimiseks mõeldud enumeraatorile tuleb sama tüüp määrata.
Andmestruktuuri ülesehituse eripärast lähtudes on LinkedListi läbikäimine enumeraatori abil tunduvalt ökonoomsem kui järjestikuste andmete küsimine elemendi järjekorranumbri järgi. Konkreetse järjekorranumbriga kohani jõudmiseks tuleb järjekorranumbri puhul enne kõik elemendid listisiseselt läbi jalutada. Enumeraator aga mõistab andmeid ilusti järjest võtta.
using System;
using System.Collections.Generic;< <<<; "+
"DBQ=d:\\kodu\\0606\\dotnet\\proovibaas2.mdb; "+
"Trusted_Connection=yes";
string lause="SELECT mark FROM autod";
OdbcConnection cn=new OdbcConnection(constr);
cn.Open();
OdbcCommand cm = new OdbcCommand(lause, cn);
OdbcDataReader reader=cm.ExecuteReader();
while(reader.Read()){
Console.WriteLine(reader.GetString(0));
cn.Close();
Kui aga tegemist pole Accessiga, vaid mõne muu andmebaasikeskkonnaga, mis aga sellegipoolest on Control Paneli kaudu ODBC alt kättesaadav, siis ka sealtkaudu saab oma andmetele ligi. Olgu näiteks olemas juba toimiv veebibaas PHP ja MySQLi abil – kuhu aga tahetakse ka kohalikus arvutis toimiva programmi kaudu pilku peale visata . Tehes see algne baas ODBC kaudu nähtavaks nime all näiteks proovibaas2, näeks sidepidamisprogramm välja nagu järgnevalt. Tasub tähele panna, et võrreldes SQL-serveriga on kasutatavateks objektiklassideks OdbcConnection ja OdbcCommand. Aga andmetega ümber käiakse ikka samamoodi.
using System;
using System.Data.Odbc;<
Ja ongi kogu näide, mida võib edaspidi sarnaste rakenduste loomisel aluseks võtta.
using System;< ({2})",
rdr.GetInt32(0),rdr.GetString(1),rdr.GetDecimal(2));
rdr.Close();

Transaktsioonid

Keerukate muutmistegevuste juures tuleb tihtipeale kasutada transaktsioone. Transaktsioon on tegevuste jada, kus kõik tegevused kas lõpevad edukalt või neid ei sooritata üldse.
Üheks lihtsamaks näiteks on pangaülekanne. Pangaülekanne koosneb kahest tegevusest: esmalt tuleb ühelt kontolt sobiv summa maha võtta ja seejärel tuleb teisele kontole sama summa juurde liita. Need tegevused peavad õnnestuma mõlemad, muidu läheb kusagilt raha kaduma või tekib lubamatult juurde.
Selliste tegevuste haldamiseks on 2 varianti. Esimene on kasutada SQL lauseid (vaata eestpoolt ), teine võimalus on korraldada transaktsioonid ADO.NET tasemel.
conn.Open();
SqlTransaction tran = conn.BeginTransaction();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.Transaction = tran;
cmd.CommandType = CommandType.Text;<;
Analoogselt võiks lisada ka piiranguid (Constraint) ja viiteid (Reference).
Andmetabelitesse saab lisaks reaalseid andmeid sisaldavatele väljadele lisada ka arvutatud välju. Nt kui teame, et hind on meil Eesti kroonides , siis võib tekkida vajadus esitleda hinda ka eurodes. Selleks võime lisada oma tabelisse arvutatud välja:
DataColumn hindEur = toode.Columns.Add(”HindEUR”, typeof(Decimal));
hind.Expression = ”Hind * 15,56”;
Loomulikult pole sellise tühja andmebaasiga midagi peale hakata. Selleks, et midagi huvitavat korda saata, tuleb DataSetis olevatesse tabelitesse ka andmeid lisada. Andmete lisamiseks on kaks moodust: me võime andmed ise tekitada ja rea kaupa tabelisse kirjutada või loeme andmed kusagilt andmebaasist.
Alustame käsitsi rea lisamisest. Selleks tuleb esmalt tekitada sobiva struktuuriga andmerea objekt.
DataRow rida = toode.NewRow();
Seejärel tuleb värskelt loodud ritta sisestada sobivad andmed. Väljade poole saab pöörduda nii välja nime kui ka positsiooni järgi.
rida[0] = 1;
rida[”Nimi”]=” Kapsas ”;
rida[”Hind”]=3.3;
Kui rida sobivate väärtustega täidetud, lisame ta sobivasse tabelisse.
toode.Rows.Add(rida);
Ridasid on võimalik lisada ka läbi objektide massiivi nagu näha allolevas koodireas.
toode.Rows.Add();
Tekkinud andmetabeli võime kuvada konsooliaknas nt järgmise for-lausega:
foreach (DataRow dr in toode.Rows)\t",o);
Console.WriteLine();
Loomulikult on olemas ka DataSetis olevate andmete kuvamiseks ning töötlemiseks mugavamaid vahendeid. Enne kui neid saame vaadata, tuleb aga üle vaadata graafilise kasutajaliidese (nt ASP.NET) põhitõed.
Ülesandeid
Koosta DataSet tabeliga autode andmete hoidmiseks. Mass tonnides arvutatakse kilogrammides olevate andmete põhjal automaatselt. Lisa mõned andmed. Trüki andmed ekraanile.

Olemasolevate andmete põhjal DataSeti loomine

Lisaks käsitsi andmete tekitamisele on võimalik DataSetis kasutada ka juba olemasolevaid andmeid. Olemasolevate andmete kasutamiseks on kaks võimalust:
  • kasutada sama metoodikat, mis käsitsi uute DataSettide loomisel ning andmed lisada rea kaupa kasutades XxxDataReader’it
  • kasutada DataAdapter objekti abi

DataSet on oma olemuselt andmebaasis olevate andmete koopia. Tegemist on väga kasuliku objektiga andmete töötlemisel. Samas pole ilma reaalseid andmebaasis olevaid andmeid värskendamata sellest võimsast vahendist eriti kasu.
Andmetabelis olevate andmete sünkroniseerimiseks
andmebaasiga on DataAdapter objekt. DataAdapter klass on kogumik andmebaasi käske ja ühendusi, mida saab kasutada tabelite täitmiseks e. lugemiseks andmebaasist ( Fill ) ja muudatuste ülekandmiseks andmebaasi (Update). Iga DataAdapter tegeleb vaid ühe tabeli andmetega. Kuna DataAdapter tegeleb otseselt andmebaasiga, tuleb valida DataAdapter vastavalt andmebaasile. .NET raamistikuga on kaasas kaks DataAdapteri klassi
  • OleDbDataAdapter – igasuguste andmeallikatega suhtlemiseks
  • SqlDataAdapter – Suhtlemiseks SQL Serveritega alates versioonist 7.0

XxxDataAdapteri kaudu on võimalik sooritada kõiki DML (Data Manipulation Language - andmetöötlus) tegevusi (andmete valimine, muutmine, lisamine, kustutamine).
DataAdapteri küljes on väga palju erinevaid omadusi ja meetodeid. Olulisemad neist on:
  • SelectCommand – Käsk, millega tuuakse andmed andmebaasist andmetabelisse
  • InsertCommand – Käsk, mis sisestab lisatud read andmebaasi
  • UpdateCommand – Käsk, mis viib andmetabelis tehtud muudatused andmebaasi
  • DeleteCommand - Käsk, mis kustutab andmetabelist kustutatud read ka andmebaasist
  • Fill meetod – täidab andmetabeli so SELECT lause või StoredProtseduuri tulemus
  • Update meetod – Kutsub vastavalt vajadusele välja vajalikud INSERT, UPDATE ja DELETE käsud
DataAdapteri kasutamiseks tuleb luua DataAdapteri objekt ning määrata vajalikud omadused.
SqlDataAdapter daTooted = new SqlDataAdapter();
SqlConnection yhendus = new SqlConnection(
”uid=KASUTAJANIMI;pwd=PAROOL;data source=dotnet;” +
”persist security info=False;initial catalog=KASUTAJANIMI”);
SqlCommand cmSelect = new SqlCommand(
"SELECT TOP 20 ToodeID, Nimi, Hind FROM Toode", yhendus);
daTooted.SelectCommand = cmSelect;
Selleks, et värskelt loodud adapteri abil täita andmetabel , tuleb välja kutsuda Fill meetod. Fill meetod on mitu korda üle kirjutatud/maskeeritud ning oskab täita nii DataSeti, DataTable’t kui ka mõnda konkreetset tabelit DataSetist.
Varem loodud DataSetis oleva tabeli Toode võime täita nt järgmise koodireaga.
int read = daTooted.Fill(ds, ”toode”);
DataAdapter on ise niipalju intelligente, et oskab enne andmete lugemist avada ühenduse andmebaasiga ning sulgeb selle, kui kõik andmed on käes.
Igal real DataTable’s on RowState omadus. Tegemist on ainult loetava omadusega, mis näitab, kas see rida on peale viimast andmete värskendamist muudetud, lisatud või kustutatud.
RowState võib omada järgnevaid väärtuseid:
RowState väärtus
Selgitus
DataRowState.Added
Uus rida
DataRowState.Deleted
Kustutatud rida
DataRowState. Modified
Real olevaid andmeid on muudetud
DataRowState.UnChanged
Andmeid ei ole muudetud
DataSet hoiab iga rea kohta kahte andmete komplekti: hetkel kehtivad andmed ja esialgsed andmed. DataSeti kasutades pääsete ligi mõlemale andmete komplektile.
DataRowVersion omaduse väärtuseks saab vastavalt vajadusele panna, kas DataRowVersion.Current või DataRowVersion. Original .
Järgnev näide vaatab läbi DataSet’is oleva tabeli kõik read ning näitab rea staatust. Kui rida on uus või muutmata, näidatakse andmete hetkel kehtivat versiooni. Kui rida on kustutatud, näidatakse esialgseid andmeid e. andmed, mis kustutati. Kui andmed on muudetud, näidatakse nii esialgseid kui ka uusi andmeid.
foreach (DataRow row in ds.Tables["toode"].Rows)
Console.WriteLine("Rea staatus: " + row.RowState);
switch (row.RowState){
case DataRowState.Added:
case DataRowState.Unchanged:
Console.WriteLine("Hetkel kehtivad andmed\n" +
row["ToodeID", DataRowVersion.Current] + ", " +
row["Nimi", DataRowVersion.Current]+ ", " +
row["Hind", DataRowVersion.Current] + "\n\n");
break;
case DataRowState.Deleted:
Console.WriteLine("Esialgsed andmed\n" +
row["ToodeID", DataRowVersion.Original] + ", " +
row["Nimi", DataRowVersion.Original]+ ", " +
row["Hind", DataRowVersion.Original] + "\n\n");
break;
case DataRowState.Modified:
Console.WriteLine("Esialgsed andmed\n" +
row["ToodeID", DataRowVersion.Original] + ", " +
row["Nimi", DataRowVersion.Original]+ ", " +
row["Hind", DataRowVersion.Original] );
Console.WriteLine("Hetkel kehtivad andmed\n" +
row["ToodeID", DataRowVersion.Current] + ", " +
row["Nimi", DataRowVersion.Current]+ ", " +
row["Hind", DataRowVersion.Current] + "\n\n");
break;
Selleks, et muudatused jõuaksid ka andmebaasi, tuleb DataAdapteri küljes ära määrata vajalike tegevuste käsud InsertCommand, UpdateCommand, DeleteCommand.
SqlCommand cmInsert = new SqlCommand(
"INSERT Toode (Nimi, Hind) VALUES (@Nimi, @Hind)", yhendus);
cmInsert.Parameters.Add(new SqlParameter("@Nimi",
SqlDbType.NVarChar, 100, ParameterDirection.Input, false,
0, 0, "Nimi", DataRowVersion.Current, null));
cmInsert.Parameters.Add(new SqlParameter("@Hind",
SqlDbType.Money, 8, ParameterDirection.Input, false,
0, 0, "Hind", DataRowVersion.Current, null));
daTooted.InsertCommand = cmInsert;
SqlCommand cmUpdate = new SqlCommand(
"UPDATE Toode SET Nimi = @Nimi, " +
"Hind = @Hind WHERE (ToodeID = @ToodeID)", yhendus);
cmUpdate.Parameters.Add(new SqlParameter("@ToodeID",
SqlDbType.Int, 4, ParameterDirection.Input, false,
0, 0, "ToodeID", DataRowVersion.Original, null));
cmUpdate.Parameters.Add(new SqlParameter("@Nimi",
SqlDbType.NVarChar, 100, ParameterDirection.Input, false,
0, 0, "Nimi", DataRowVersion.Current, null));
cmUpdate.Parameters.Add(new SqlParameter("@Hind",
SqlDbType.Money, 8, ParameterDirection.Input, false,
0, 0, "CustomerID", DataRowVersion.Current, null));
daTooted.UpdateCommand = cmUpdate;
SqlCommand cmDelete = new SqlCommand(
"DELETE Toode WHERE ToodeID = @ToodeID", yhendus);
cmDelete.Parameters.Add(new SqlParameter("@ToodeID",
SqlDbType.Int, 4, ParameterDirection.Input, false,
0, 0, "ToodeID", DataRowVersion.Original, null));
daTooted.DeleteCommand = cmDelete;
DataSetis olevate muudatuste salvestamine andmebaasi peaks käima 4 sammuga.
  • Kutsuda välja GetChanges meetod, mis tekitab uue DataSeti, millesse koondatakse vaid need kirjed, mis on muutunud. Muutunud kirjeid on võimalik leida vastavalt muudatuse tüübile. GetChanges meetodist on kasu juhul, kui soovitakse kontrollida, mis järjekorras muudatused andmebaasi salvestada.
  • Kutsuda välja iga vajaliku DataAdapteri Update meetodi, et muudatused jõustuksid andmebaasis
  • Kutsuda välja Merge meetodi mis ühendab kaks DataSeti taas üheks. Vajalik, kui GetChanges abil eraldatud DataSetist mingi osa.
  • Kasutada AcceptChanges meetodit, et kinnitada muudatused DataSetis
Koodis näeb see protseduur välja järgnev:
if (ds.HasChanges())’.", table.Name);
foreach(DataRow row in table.Rows){
if(row.HasErrors){
Console.WriteLine(
"Probleem tootegaConsole.WriteLine(", row.RowError);
foreach(DataColumn col in row.GetColumnsInError()){
Console.WriteLine(
col.ColumnName, "Probleem selle väljaga");
Console.WriteLine("Muudatus tühistati!\n”);
row.ClearErrors();
row.RejectChanges();
Kui probleemid lahendatud, lubame DataSetil muudatused salvestada:
daToode.AcceptChanges();
Kuigi selline
automaatne muudatuste tagasi lükkamine tagab programmi töö ka konfliktide tekkimise korral, on enamasti mõistlik lasta kasutajal otsustada, kas peale jäävad tema tehtud muudatused, või need andmed, mis on andmebaasis.
Lisaks eelpool mainitule on selle värskendamise protseduuri juures veel teine konks : nimelt kui andmebaasis on vahepeal midagi muudetud, siis neid muudatusi me oma DataSeti ei loe. Muudatuste lugemiseks on kaks meetodit: kas leiate mingi kavala SQLi abil read, mis on vahepeal muutunud ja vahetate need välja/lisate juurde või teete DataSeti tühjaks ja täidate uuesti. Viimast on oluliselt lihtsam rakendada. Selleks tuleb AcceptChanges asendada järgmiste meetodi väljakutsetega:
ds.Clear();
daToode.Fill(ds, "toode");
Kuigi DataSet on mõeldud peamiselt andmete hoidmiseks ühenduseta keskkonnas, oskavad mitmed Windowsi ja ASP.NET graafilise liidese komponendid (nt DataGrid jt) neid andmeid kuvada ja pakuvad juurde ka sorteerimise, muutmise jt võimalusi. Sellest aga lähemalt juba ASP.NET juures.
Ülesandeid
  • Täida DataSet autode tabelist tulevate andmetega
  • Muuda andmeid DataSetis
  • Kirjuta muutused baasis olevasse andmetabelisse
  • Katseta, mis juhtub, kui baasis olevaid andmeid on vahepeal muudetud. Püüa muutusi hallata, lasta kasutajal valida mida teha.

XML

Extensible Markup Language ehk XML on lihtne ja väga paindlik tekstiformaat, mis baseerub SGML’il (Standard Generalized Markup Language). XML töötati välja XML-töögrupi (algselt tuntud kui SGMLi redaktsiooniliselt läbivaatava nõukogu – SGML Editorial Review Board) poolt, mis loodi World Wide Web Konsortsiumi patronaaži all 1996. aastal. Töögruppi juhtis Jon Bosak, Sun Microsystemsist aktiivses koostöös W3C poolt organiseeritud XML-erihuvigrupiga (varem tuntud SGML-töögrupina).
XML’i loomise eesmärgid:
  • XML peab olema kasutatav üle Interneti.
  • XML peab olema loetav nii inimesele kui arvutile.
  • XML rakenduste ampluaa peab olema võimalikult lai: sisestamine , lehitsemine, otsing, infotöötlus, sisutöötlus.
  • XML ühildub SGMLga
  • XML dokumentide töötlemise programme peab olema lihtne kirjutada
  • XML disain peab olema formaalne ja kompaktne
  • XML dokumentide genereerimine peab olema lihtne. Kuigi XML dokumentide koostamiseks kasutatakse enamasti spetsiaalseid redaktoreid, peab nende tekitamine olema võimalik mistahes redaktoriga.
  • XML märgistuse napisõnalisuse nõue pole tähtis.
Aastal 1998 tuldi välja XML’i versiooniga 1.0, millele lisati väiksed täiendused aastal 2000 ning see versioon on ka hetkel ainukene.
XML failide loomiseks ei ole vaja spetsiaalseid programme, piisab vaid programmist, milles on võimalik tööd salvestada tekstifailina.
Kui RTF ja HTML failid on orienteeritud välisilmele ehk sellele, kuidas dokumente inimesele näidata, siis XML on orienteeritud andmete paremale kirjeldamisele e. kuidas andmeid võimalikult hästi programmidele arusaadavaks teha. Sellest tulenevalt on nendel failiformaatidel ka mõned olulised erinevused. RTF ja HTML failis paiknevad andmed ja nende kujundus läbisegi, XML’is moodustatakse eraldi failid nii andmetele, nende kujundusele ja struktuurile. See muudab XML andmete programse kasutamise oluliselt lihtsamaks, kui on seda RTF või HTML andmete töötlemine. Ühtlasi võimaldab anda samadele andmetele erinevaid kujundusi lihtsamalt.

XML’i kirjutamise reeglid

XML’i fail koosneb kahest osast: faili alguses on deklaratsioonid selle faili töötlemiseks ning sellele järgnevad andmed.

Reeglid

  • XML-dokumendi alguses peab olema näidatud, mis versiooni kasutatakse (töö kirjutamise hetkel on ainukeseks versiooniks 1.0)

  • XML-dokument peab omama ainult üht juurelementi, mis sisaldab kõiki teisi elemente dokumendis

...
  • Igal elemendil (ka tühjal) peab olema algusmärgis ja lõppmärgis
    Algusmärgis
    Sisu
    Lõppmärgis
    Ants
  • XML’is kasutatavad atribuudid peavad alati olema jutumärkide või ülakomade vahel. Ei ole vahet, kumba kasutada, kuid oluline on see, et alustav ja lõpetav märk oleksid samad. Seega võib juhtuda, et ühe elemendi üks atribuut on kirjutatud ülakomade, teine jutumärkide vahele.
  • XML’is tehakse vahet suur-ja väiketähtedel.
    Näiteks ja on erinevad elemendid
  • Alamelement peab lõppema enne peaelementi. Kui HTMLi vanemates versioonides on lubatud nt järgmine konstruktsioon , siis XMLis sellist asja olla ei tohi ehk korrektne oleks
Kui XML fail vastab eelpool loetletud reeglitele, on tegemist trimmis (Well Formed) XML’iga.

XML’i elemendid

XML-elementidele nimede panemisel kehtivad järgmised reeglid:
  • element esitatakse tagidena. Tage kirjutatakse järgmiselt: sisu. Esimest nimetatakse alustavaks tagiks, teist lõpetavaks.
  • nimi võib sisaldada tähti, numbreid ja mõningaid sümboleid (sümbolit „:” ei tohi kasutada, kuna see on kasutusel nimeruumidele viitamisel );
  • nimi ei tohi alata numbri või kirjavahemärgiga;
  • nimi ei tohi alata kombinatsiooniga xml (samuti ka XML või Xml jne);
  • nimi ei tohi sisaldada tühikut;
  • elementide nimedes tehakse vahet suurtel ja väikestel tähtedel
  • teinekord võib elementidel sisu puududa. Siis kasutatakse nn tühje elemente
    Näiteks element on sama, mis element
Sisu poolest võib elemendid jagada kolmeks:
  • tühjad elemendid
  • lihtsad elemendid
  • keerukad elemendid
Tühjad elemendid: tühjadeks nimetatakse elemente, millel sisu puudub ja nende esitamiseks on kaks võimalust:
  • kasutatakse alustatavat ja lõpetavat tagi , nii et nende vahele ei jää midagi
  • kasutada spetsiaalset tagi, kus tagi lõpp sisaldub alustavas tagis
Lihtsad elemendid: elemendid, kus alustava ja lõpetava tagi vahel on mingi lihtne väärtus, nt sõna, lause, kuupäev, number.
Mati
Keerukad elemendid: elemendid, mille sisuks on teised elemendid
AS Virumaa Mets
Metsa 7
0011223344
Loetavuse parandamiseks võib kasutada treppimist, sest XML’i parserid ignoreerivad tühiruumi1
Elementidele saab lisada ka atribuute.

Atribuudid

Atribuute on mõistlik kasutada andmete metadata jaoks (ehk atribuut on andmed andmete kohta). Atribuudid kirjutatakse elemendi alustava tagi sisse. Ühe elemendi sees peavad olema kõik atribuutide nimed erinevad. Atribuudid kirjutatakse kujul: atribuudinimi=väärtus. Väärtused peavad olema kas jutumärkide või ülakomade vahel.
Näiteks:
Ants Aavik
Atribuudinimedele kehtivad samad reeglid, mis elementide nimedele.
Võib tekkida küsimus, milliseid andmeid esitada elementidena, milliseid atribuutidena? Sellele küsimusele ühtset vastust ei ole, kõik sõltub vajadustest, kuid heaks tavaks on see, et atribuutides ei ole mitte andmed, vaid lisainfo andmete kohta ehk metadata. Samuti pannakse sinna vahel ka andmed, mis on lühikesed ning mille puhul on aimata, et neid pole põhjust hiljem laiendada (osadeks jaotada).

XHTML

XHTML on XML’i reeglite järgi kirjutatud HTML. Täiendavalt on kokkulepe, et kõik tag’id kirjutatakse väikeste tähtedega. Kui soovite kontrollida, kas teie poolt valmistatud HTML dokument on ka XHTML dokument, siis võite seda teha W3 portaalis paikneva DTD dokumendi abil:
Lehestiku kontrollimiseks sobib valideerimisteenus aadressil http://validator.w3.org/

Nimeruum

Mõnikord võib tekkida situatsioon, kus mitu osapoolt kasutavad XML- dokumentides ühte ja sama elementi erinevas tähenduses. Seetõttu on vaja eristada, millisesse sõnavarasse üks või teine märgis kuulub. Lahenduse antud probleemile toob XML-nimeruum (XML namespace).
W3C standardi järgi on XML-nimeruum nimede kollektsioon, mis on kasutusel XML-dokumendis elementide ja atribuutidena. Üks XML-dokument võib sisaldada elemente ja atribuute rohkem kui ühest nimeruumist.
Allolevas näites on kirjeldatud firma andmed nii, et firma nime ja registrinumbri kirjeldus on kirjeldatud nõnda, nagu riigis kokkulepitud. Kõigi ülejäänud elementide kirjeldused on väljamõeldud mingi firma enese poolt:
  • iga element, millel pole eesliidet, kasutab nimeruumi xmlns=”http:/www.mingifirma.ee/firma“
  • iga element, millel on eesliide ee: kasutab nimeruumi xmlns:ee=” http://www.riik.ee/firma”

AS Virumaa Mets
Metsa 7
0011223344

XML’i valideerimine

Et XML andmeid vahetada või töödelda, on vähe kasu teadmisest, et XML on WellForm, kuna XML’i moodustamise reeglid on väga lõdvad ja täpselt samu andmeid on võimalik esitada mitmel erineval moel. Et fikseerida, mis kujul andmed peaksid XML failis olema, on kasutusel XML’i valideerimine. Neid reegleid on võimalik seada kas kasutades DTD ( Document Type Definition) või XML skeeme (XML Schema ). Kui XML fail vastab DTD’s või XML skeemis kirjeldatud reeglitele, siis nimetatakse seda XML’i trimmis XML ( valid XML)
DTD kirjeldus võib paikneda XML andmetega samas failis või võib olla täiesti eraldi seisev fail. Nende lausetega pannakse paika, millised elemendid on nõutavad ja milline on elementide järjestuse kord.
DTD suurimaks puuduseks on see, et ei ole võimalik määrata, mis tüüpi peavad olema elementides või atribuutides olevad andmed (ainukene andmetüüp on tekst). Seetõttu kasutatakse keerukamate süsteemide puhul XML skeeme.

XML skeemid

XML skeemid on reeglite kogum, kus on kirjas, mis võib ja mis ei või olla XML-andmefaili erinevates osades. Reeglitega on võimalik määrata, millised elemendid, millises järjekorras peavad olema ning mis tüüpi andmeid võivad sisaldada atribuudid ja elemendid. Andmetüüpidele on võimalik lisada piiranguid, nt vähim või suurim võimalik väärtus numbrite puhul, tekstilistel andmetel teksti pikkus. Lisaks sellele on võimalik määrata konkreetset väärtuste hulka.
Skeemides jagunevad elemendid vastavalt sisule . Lihtsaks elemendiks (simple type) nimetatakse elemente, millel puuduvad atribuudid ja alamelemendid.
Näiteks: AS Virumaa Mets
XML skeemis võiks seda kirjeldada järgmiselt:
Antud XML failis peab esinema element Nimi vähemalt 1 korra, kuid võib esineda ka rohkem. Nimi on tekstilist tüüpi (string).
Elemendid, millel on atribuudid ja/või alamelemendid, on keerulised elemendid (complex type).
Näiteks:
AS Virumaa Mets
Metsa 7
0011223344
XML skeemis võiks seda kirjeldada järgmiselt:
Ülesandeid
  • Koosta XML-fail autode loeteluga
  • Koosta skeem ühe auto andmete hoidmise kirjelduseks
  • Koosta skeem autode loetelu andmete kirjelduseks

XMLi kasutamine SqlServeris

Juba alates SQL Server 2000st on SQL Serveris olnud XMLi tugi. SQL Server 2005s on seda oluliselt täiendatud. Juurde on tulnud isegi xml andmetüüp. Kuigi SQL päringuid tehes ei ole XML kujul palju rakendust, on see funktsionaalsus äärmiselt vajalik rakendustes, kuna .NET raamistik saab XML andmetega väga hästi hakkama.

XMLi genereerimine relatsioonilistest andmetest

Kõige lihtsam on SQL Serverist XMLi küsida SELECT lause abil, lisades lõppu FOR XML märksõnad. Näiteks järgmise SQL lause abil saame kolme toote nimed XML kujul
SELECT TOP 3 nimi, hind
FROM toode
ORDER BY nimi
FOR XML AUTO
Tulemus on:
Nagu näeme, on saadud XML ilma juurelemendita. See tähendab, et otseselt XML faili sellist tulemust salvestada ei saa, erinevad programmid sh .NET võtavad XMLi vastu ka ilma juurelemendita. Juurelemendi võite saadud XMLile lisada, kas käsitsi läbi programmi või siis SQLis lisades FOR XML ... lause lõppu, ROOT(’juurikanimi’).
Lisaks andmetele ühest tabelist on võimalik sama meetodiga pärida ka seotud andmeid. Tulemusena genereeritakse hierarhiline XML:
SELECT tellimus. klient , toode.nimi AS toode, toode.hind
FROM tellimus
INNER JOIN tellimustoode
ON tellimus.kood = tellimustoode.tellimus_kood
INNER JOIN toode ON tellimustoode.toode_kood = toode.kood
FOR XML AUTO
Tulemus on:
Loomulikult on võimalik kasutada ka teistsuguseid XML struktuure. Näiteks kui asendame SELECT lause lõpus märksõna AUTO märksõnaga RAW, tekitatakse meile iga kirje kohta üks XML element nimega row, kus kõik väljad on atribuutidena:
SELECT tellimus.klient, toode.nimi AS toode, toode.hind
FROM tellimus
INNER JOIN tellimustoode
ON tellimus.kood = tellimustoode.tellimus_kood
INNER JOIN toode ON tellimustoode.toode_kood = toode.kood
FOR XML RAW
Tulemus on:
Kui need kaks meetodit ei sobi, siis on loomulikult võimalik ka ise struktuur ette anda. Selleks tuleb SELECT lause abil moodustada universaalne tabel, kus oleksid järgmised väljad:
  • Tag – elemendi tase XML struktuuris
  • Parent – peaelemendi tase XML struktuuris
  • Väljad ja atribuudid, igaüks eraldi veerus. Väljade nimed tuleb kirjutada kujul Element!tase!atribuut!täpsustus
Üritame eelpool kasutatud tooted teisendada järgmisele XML kujule:
madis
jaan
anni
Selleks tuleb meil tekitada universaalne tabel, mis näeb välja järgmine:
Tag
Parent
Tellimus!
1!
TellimusID
Tellimus!
1!Klient!
element
Tellitud
Toode!2!
ToodeID
TellitudToode!2!Toode
Tellitud
Toode!2!
Hind
1
NULL
1
madis
NULL
NULL
NULL
2
1
1
NULL
1
kala
55,00
2
1
1
NULL
2
kurk
5,00
2
1
1
NULL
3
piim
7,00
1
NULL
2
Jaan
NULL
NULL
NULL
2
1
2
NULL
2
kurk
5,00
2
1
2
NULL
4
limonaad
5,00
1
NULL
3
Anni
NULL
NULL
NULL
2
1
3
NULL
5
kapsas
5,00
2
1
3
NULL
6
õun
10,00
Sellise tabeli tekitamiseks tuleb moodustada UNION päring, mis paneb taseme kaupa tabeli kokku. Esmalt loeme sisse tellimused ja seejärel tooted. Kuna XMLi hakatakse genereerima vastavalt ridade järjekorrale, siis peame ka selle eelnevalt fikseerima. Sorteerida tuleb esmalt TellimusID järgi, kuna me soovime, et üks tellimus oleks ühes elemendis ning seejärel Parent välja järgi, et esmalt oleks Tellimuse element moodustatud ning sinna järele tuleksid TellitudTooted. Kui päring valmis, tuleb lisada lõppu FOR XML EXPLICIT ning ongi valmis:
SELECT 1 AS Tag, null AS Parent,
kood AS [Tellimus!1!TellimusID],
klient AS [Tellimus!1!Klient!element],
null AS [TellitudToode!2!ToodeID],
null AS [TellitudToode!2!Toode],
null AS [TellitudToode!2!Hind]
FROM tellimus
UNION ALL
SELECT 2 AS Tag, 1 AS Parent, tellimustoode.tellimus_kood, null,
toode.kood, toode.nimi, toode.hind
FROM tellimustoode
INNER JOIN toode ON tellimustoode.toode_kood = toode.kood
ORDER BY 3, 2
FOR XML EXPLICIT
Ülesandeid
  • Koosta XML EXPLICIT abil ühe auto andmetele vastav dokument, kus mark on elemendina ning valmistamisaasta atribuudina märgitud
  • Koosta eelnevat näidet arvestades XML EXPLICIT jaoks tabel ning sealtkaudu XML-dokument, kus autode andmed on maakondade kaupa loetelus. Iga maakonna juures on näha ka maakonnakeskus autoregistri asukohana .

XML andmetüübi kasutamine

XML dokumentide ja XML dokumendi osade hoidmiseks SQL Serveris saab kasutada xml andmetüüpi. Ühele väljale saab panna kuni 2GB XML andmeid. Vajadusel saab xml välja siduda ka schemaga, mille järgi väljale sisestatavat XMLi kontrollitakse.
Näiteks loome ühe lihtsa tabeli, mis koosneb võtmeväljast ning XML väljast:
CREATE TABLE xmlstuff(
kood int IDENTITY(1,1) PRIMARY KEY,
xmljutt xml NOT NULL,
Lisame sinna ka mõned read. Allolevas näites on XMLi lühendatud. Terve lisatav XML on ära toodud eelmise peatüki näidetes ning ka järgmisel lehel olevas tabelis..
insert xmlstuff (xmljutt) VALUES(N'= 10]') AS xmljutt
from xmlstuff
where xmljutt. exist ('//toode') = 1
kood
Xmljutt
1
Ülesandeid
  • Loo tabel tulbaga autode andmete hoidmiseks XMLina
  • Küsi sealt välja talletatud toodete margid
  • Näita vaid nende autode andmeid, mis on valmistatud enne 1995ndat aastat.

XML andmete kasutamine .NET raamistikus

XML on väga hea vahend erinevatest andmeallikatest pärit andmete kokku koondamiseks ja haldamiseks. XMLi paremaks töötlemiseks on .NET raamistikus terve hulk erinevaid klasse, mis jagunevad mitmete nimeruumide vahel vastavalt W3 standarditele.
Olulisemad klassid, mida XMLiga töötades vaja läheb on:
Abstraktne klass
Kasutusala
Päritud klassid
XmlReader
XML voog (strem) XML andmete lugemiseks. Lugemise ajal on võimalik ka dokumentide kontrollimine e. valideerimine
XmlTextReader
XmlNodeReader
XmlWriter
Tekitab XML voo kusagile edasi saatmiseks (teine rakendus, andmekandja )
XmlTextWriter
XmlNavigator
Kasutatakse dokumendis liikumiseks, kui kogu dokumendi mällu laadimine ei ole otstarbekas
XmlPathNavigator
XmlResolver
Väliste XML ressursside leidmine URI abil
XmlUrlResolver

XMLi parsimine

Parsimine tähendab andmete lugemist ning seejärel loetud andmetega mingite tegevuste sooritamist. Parsimine võimaldab XML failist leida just seda infot, mida teil kõige rohkem vaja läheb.
Püüame lugeda XML andmeid kasutades XmlReader klassi. Raamistiku poolt on tehtud kolm erinevat klassi XML andmete lugemiseks. Kui nende funktsionaalsus ei ole piisav, siis võite ise alati neid klasse juurde tekitada.
XMLi lugemiseks saab kasutada tavalisi System.IO klasse. Läbi IO klasside on võimalik XMLi lugeda nii failist kui ka voost. Sisuliselt ei ole vahet, kumba meetodit kasutada aga, et oleks lihtsam jälgida, siis võite ette kujutada nii, et Fail on andmekandjale salvestatud nimeline baidijada, voog on aga kusagilt mujalt (võrk, andmebaas, jne) tulev baidijada.
Proovime alustuseks lugeda sisse tavalise tekstifaili.
Selleks on meil esmalt vaja System.IO nimeruumi
using System.IO;
ning seejärel kirjutame protseduuri, mis avab tekstifaili ja trükib selle rea kaupa ekraanile.
string FailiNimi = @"c:\mingifail.txt";
if (File.Exists(FailiNimi))='{1}'", MinuXmlLugeja.Name,
MinuXmlLugeja.Value);
MinuXmlLugeja.MoveToElement();
Nagu iga teisegi sisend/väljund protseduuri, nii ka XML parsimise juures võib tekkida vigu. Kui XmlReader avastab vea, annab ta sellest teada läbi XmlExeption’i. Seega peaks kogu XMLi lugemine olema try ... catch struktuuri sees:
XmlTextReader MinuXmlLugeja = new XmlTextReader("mingifail.xml");<",
MinuXmlLugeja.LineNumber, MinuXmlLugeja.LinePosition);
Ülesandeid
  • Koosta autode andmete fail XMLina
  • Tee kindlaks, mitme auto andmed on faili kirjutatud
  • Trüki välja leitud automarkide nimed.

XMLi valideerimine

XML failil on kaks staatust, mis näitavad tema kvaliteeti:
  • Well-Formed – korrektselt vormistatud, st XML vastab W3 poolt seatud XMLi reeglitele
  • Valid –Well-Formed ning lisaks vastab see XML teie poolt seatud reeglitele
Kasutades XmlTextReader klassi, saame vea siis, kui XML ei ole Well-Formed. Täpsemaid kontrolle (millised elemendid on olemas, kas nad on õiges järjestuses jne) aga ei rakendata.
XMLi täpsemaks kontrollimiseks on kaks moodust: DTD dokumendid ja XML Schema. Siinkohal ei hakka vaatama, kuidas neid dokumente moodustada, vaid vaatame, mis saab siis, kui teil on selline dokument olemas ja tahate teada, kas XML sisend vastab sellele.
Järgnevalt vaatleme kahte erinevat lähenemist XML valideerimisele. .NET raamistiku 1.x versioonis oli XMLi valideerimiseks XmlValidatingReader klass, raamistiku 2.0 versioonis seda enam ei ole ning selle asemel saab kasutada XmlReader klassi. Suurim erinevus nende kahe vahel seisneb selles, et kui ValidatingReader avastas vea, sai selle kinni püüda try ... catch konstruktsiooni abil, nüüd tuleb selleks aga kasutada sündmusi.
XmlReader on huvitav klass ka selle poolest, et lugemise määranguid ei edastata mitte omaduste kaudu, vaid spetsiaalse omaduste objektina. Seega, kui soovime XML failist lugeda ning samal ajal kontrollida, et loetav XML oleks korrektne, peame tegema lugemismäärangute objekti ning edastama selle lugeja objektile.
Valideerimiseks kasutame schemat, mis on määratud XML failis.
Esmalt vaatame, kuidas valideerida parsimise ajal:
XmlReaderSettings maarangud = new XmlReaderSettings();
// kontrollimiseks kasutame schemat
maarangud.ValidationType = ValidationType.Schema;
// schemat asukoht on näidatud XML failis
maarangud.ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation;
// probleeme lahendame meetodiga xvr_ValidationEventHandler
maarangud.ValidationEventHandler +=
new ValidationEventHandler(xvr_ValidationEventHandler);
// Teeme objekti XMLi lugemiseks
XmlReader lugeja = XmlReader.Create(@"C:\Erki\mingifail2.xml", maarangud);
// Hakkame parsema
while (lugeja.Read());
reader.Close();
Probleeme haldav meetod on üsna lihtsakoeline:
private void xvr_ValidationEventHandler(object sender,
ValidationEventArgs e)", e.Message);
Console.WriteLine(",
e.Exception.LineNumber,e.Exception.LinePosition);
Teine meetod on mitte XMLi jupi kaupa parsida, vaid lugeda kogu XML mällu. Kasulik väikeste XML failide juures. Et näide oleks põnevam, loeme XMLi kasutades andmevoogu, mille saame tavalisest faili lugemisest .
FileStream fs = File.Open(@"C:\Erki\mingifail2.xml", FileMode.Open);
XmlDocument xdoc = new XmlDocument();
XmlReaderSettings maarangud = new XmlReaderSettings();
maarangud.ValidationType = ValidationType.Schema;
maarangud.ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation;
maarangud.ValidationEventHandler +=
new ValidationEventHandler(xvr_ValidationEventHandler);
XmlReader lugeja = XmlReader.Create(fs, maarangud);
xdoc. Load (lugeja); // edaspidi on kogu XML kasutatav läbi xdoc’i
fs.Close();
Kui XML failis pole schemat määratud või lihtsalt soovite kontrollida mõne teise schema järgi, siis saate sobiva schema määrata programselt. Kontrolli võib teostada peale XML faili mällu laadimist kasutades Validate meetodit:
XmlDocument xdoc = new XmlDocument();
xdoc.Load("mingifail2.xml");
xdoc.Schemas.Add(null, " naidis .xsd");
ValidationEventHandler veh =
new ValidationEventHandler(xvr_ValidationEventHandler);
xdoc.Validate(veh);
Või XML faili laadimise ajal, määrates schema ära määrangutes:
FileStream fs = File.Open("mingifail2.xml", FileMode.Open);
XmlDocument xdoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(null, "naidis.xsd");
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler +=
new ValidationEventHandler(xvr_ValidationEventHandler);
XmlReader reader = XmlReader.Create(fs, settings);
xdoc.Load(reader);
fs.Close();
Lisaks XmlDocument objektile on võimalik XMLi laadida ka DataSet’i sisse. Kuna DataSet hoiab kõiki andmeid XML kujul, siis on XML andmete DataSeti laadimine tehtud äärmiselt lihtsaks. Järgnevalt loeme DataSeti XML faili, koos seal näidatud Schemaga:
myDS = new DataSet();
myDS.ReadXml("C:\Erki\mingifail2.xml", XmlReadMode.ReadSchema);
Kui XML failis ei ole Schemat näidatud, on võimalus see genereerida vastavalt laetava XML faili struktuurile:
myDS = new DataSet();
myDS.ReadXml("C:\Erki\mingifail.xml", XmlReadMode.InferSchema);
Loomulikult on võimalik ka ette määrata, kust tuleb schema ja kust tulevad andmed:
myDS = new DataSet();
myDS.ReadXmlSchema(@"C:\Erki\naidis.xsd");
myDS.ReadXml(@"C:\Erki\naidis.xml", XmlReadMode.IgnoreSchema);
Ülesandeid
  • Koosta skeem ühe auto andmete tarvis
  • Koosta skeem autode loetelu andmete tarvis
  • Kontrolli, kas olemasolev autoandmete dokument vastab loodud skeemile

XMLi salvestamine

Kõige lihtsam on XMLi salvestada, kui olete loonud XmlDocument objekti. Sellisel juhul tuleb välja kutsuda Save meetod ja ongi salvestatud.
xdoc.Save(@"C:\Erki\mingifail3.xml");
Loomulikult on võimalik genereerida XMLi ka siis, kui XmlDocument objekti ei ole. Sellistel puhkudel saab kasutada XmlTextWriter objekti.
XmlTextWriter XmlKirjutaja = new XmlTextWriter(
@"mingifail4.xml", Encoding.UTF8);
XmlKirjutaja.Formatting = Formatting.Indented;
Kui kirjutaja loodud, saate hakata moodustama XML faili:
XmlKirjutaja.WriteStartDocument();
XmlKirjutaja.WriteStartElement(" juurikas ");
XmlKirjutaja.WriteStartElement("tellimus");
XmlKirjutaja.WriteAttributeString("tellimusid", "1");
XmlKirjutaja.WriteElementString("klient", "madis");
XmlKirjutaja.WriteEndElement();
XmlKirjutaja.WriteEndElement();
XmlKirjutaja.WriteEndDocument();
XmlKirjutaja.Close();
Tulemuseks on Well-Formed XML:
madis
XMLi on lisaks eelnevatele meetoditele võimalik salvestada ka otse DataSetist. Selleks on DataSet’il kaks väga kasulikku meetodit:
myDS.WriteXml("C:\Erki\uus.xml", XmlWriteMode.IgnoreSchema);
myDS.WriteXmlSchema("C:\Erki\uus.xsd");
Ülesandeid
  • Küsi kasutajalt auto andmed ning väljasta need XML-faili. Aasta salvestatakse atribuudina, mark elemendina.
  • Loe andmebaasist autode andmed DataSeti. Salvesta andmed XML-faili. Salvesta skeem eraldi xsd-faili

LINQ - .NET Language-Integrated Query

LINQ lisab programmeerimiskeelde (nagu C#, VB.NET jne) päringute kirjutamise käsustiku, mille abil on võimalik andmeid valida, filtreerida ning teha kokkuvõtteid.
Kõik LINQ vahendid paiknevad System.Linq nimeruumis.
All olev näide kasutab LINQ päringut selleks, et töödelda massiivis olevaid andmeid.
using System;
using System.Linq;
using System.Collections.Generic;<;
IEnumerable query = from s in names
where s.Length == 5
orderby s
select s.ToUpper();
foreach (string item in query)
Console.WriteLine(item);
Tulemuseks on:
BURKE
DAVID
FRANK
LINQ mõistmiseks tuleks esmalt vaadelda programmi esimest lauset:
IEnumerable query = from s in names
where s.Length == 5
orderby s
select s.ToUpper();
Kohalik muutuja Query väärtustatakse päringu avalisega. Päringuavaldis võtab andmeid ühest või mitmest andmeallikast ning võimaldab sooritada mitmeid operatsioone. Antud päring kasutab kolme standardset operaatorit: Where, OrderBy ja Select.
Seega võiks seda päringut lugeda järgmiselt: loome loendatava teksti sisaldava massiivi Query, valides andmed tekstimassiivist names kus teksti pikkuseks on 5 märki ning sorteerime tulemuse tähestikuliselt ning tulemusena näitame sobivaid tekstiväärtusi suurte tähtedega.
LINQ päringuid saab teha kõigi loendatavate kollektsioonide ja massiivide peal.
Kõik LINQ päringud koosnevad kolmest tegevusest:
  • Andmeallika tekitamine
  • Päringu loomine
  • Päringu käivitamine
using System;
using System.Linq;
using System.Collections.Generic;<;
// 2. Päringu loomine.
// numQuery tekitatakse IEnumerable tüüpi
var numQuery =
from num in numbers
where (num % 2) == 0
select num;
// 3. Päringu käivitamine.
foreach (int num in numQuery)
Console.Write( ", num);

ASP.NET

ASP.NET on .NET raamistiku moodul, mis võimaldab sul luua veebirakendusi kasutades sealjuures minimaalselt koodi.
ASP.NET ei ole mitte ASP ( Active Server Pages) uus versioon, vaid täiesti uus lähenemine veebi rakenduste loomisele. Erinevalt ASPist ja ka PHPst, mis on peamiselt skriptimise keeled, on ASP.NET lehtede taga olev kood täielikult objektorienteeritud. Seega tuleks ASP.NETi võrrelda mitte PHP vaid JAVA rakendustega.
Koodi ASP.NET lehtede tarbeks võib kirjutada ükskõik millises .NET keeles. Lisaks veebivormidele on võimalik oma rakendust veebis serveerida ka läbi veebiteenuste.
Ka ASP. NETist on olemas mitmeid versioone. Kui võrrelda ASP.NET versioone 1.1, 2.0 ja 3.5 siis võib öelda, et palju on jäänud samaks, kuid üht teist on ka ümber tehtud ja lisatud. Hea uudis on see, et kõik vanad konstruktsioonid töötavad, kuid juurde on tulnud mitmed uued meetodid. Tänu provaideri( teenusepakkuja ) põhisele lähenemisele on rakenduse loomine alates 2.0 versioonist muutunud märksa abstraktsemaks ja lihtsamaks. Palju koodi on viidud lehekülje tagustelt koodilehtedelt teenusepakkujatesse. ASP.NET versioonis 3.5 on juurde tulnud toetus AJAXile (Asyncronious Java and Xml), mõned uued serveri kontrollid ning LINQ kasutamise võimalus. AJAX võimaldab andmeid lehel reaalajas muuta ilma, et peaks kogu lehte selle tarbeks uuesti laadima.
ASP.NET lehed koosnevad tekstifailidest, mida saab serveerida läbi IIS ( Internet Information Service) virtuaalkaustade. Lehtede loomiseks sobivad kõik tekstiredaktorid. Abivahendeid usaldavale inimesele on kõige parem kasutada kirjutamiseks sellised abivahendeid, mis lehtede loomisel kiirendavad koodi kirjutamist lõpetades alustatud sõnu, kontrollivad jooksvalt süntaksit ning aitavad HTMLi loomisel. Üheks selliseks abivahendiks on Visual Studio. Ehkki palja "rumala" tekstiredaktoriga kirjutamisel on eeliseks lihtsus, siis nt Visual Studio Web Developer Expressiga on lootus ka algajal nõnda läbi saada, et ta paljudesse menüüdesse ära ei upu.

Visual Studio paigaldamine

Visual Studio on arendusvahend, mida kasutavad väga paljud programmeerijad ning programmeerimisfirmad sh ka Microsoft. Visual Studio´st on olemas mitmeid versioone, neist enamus on mõeldud professionaalsetele programmeerijatele ning programmeerijate meeskondadele. Lisaks kommertsversioonidele on olemas ka tasuta versioonid (Express versioonid), mis on mõeldud lihtsalt programmeerimishuvilistele ning õpilastele.
Visual Studio Express versiooni saamiseks tuleb minna aadressile www.microsoft.com/express/ ning tõmmata endale sealt sobiv versioon. Veebilehestike koostamiseks nagu nimigi ütleb, sobib enesele laadida Visual Web Developer Express.
Lisaks Visual Studio´le oleks kasulik paigaldada ka andmebaasimootor SQL Server Express Edition koos SQLi haldus- ja arendusvahendiga SQL Server Management Studio Express.
WDE paigaldamiseks peaks arvutil olema vähemalt 600 MHz protsessor (soovitavalt üle 1 GHz), vähemalt 192 MB mälu (soovitav 256 MB või koos andmebaasiga 512 MB) ning sõltuvalt paigaldatavatest komponentidest 500 MB kuni 1,8 GB vaba kettaruumi. Enamuse sellest pea 2GB suurusest mahust võtab spikker (Help). Kui spikrit ei paigalda on vajalik kettaruum üle GB väiksem! Spikker on vajalik siis kui Teil ei ole pidevat Interneti ühendust või töötate kohtades, kus alati ei ole võimalik Internetti kasutada. Kui on olemas püsiv Internetiühendus võite kasutada veebis olevat spikrit, mis asub aadressil http://msdn.microsoft.co m. Online spikker on integreeritud ka WDE sisse, mis võimaldab sealt infot otsida ka WDE abil!
Installeerimiseks peavad teil olema arvutis administraatori (süsteemiülema) õigused!
Visual Web Developer 2008 Express Edition´i paigaldamiseks otsige see Microsofti veebist ülesse ning käivitage allalaadimine. Esmalt laetakse alla programm, mis tõmbab alla päris installika e. seda esimest allalaetavat 2,6MB rakendus ei ole mõtet salvestada – selle võib käivitada veebist.
Kui programm Internetist kohale jõuab käivitub WebDeveloperi install.
Järgnevalt avaneb teil võimalus jagada oma installeerimisekogemust Microsoftiga  Sisuliselt tähendab see seda, et peale installeerimise lõppu saadetakse Microsofti aruanne infoga, mida te valisite ja kuidas paigaldamine õnnestus.
Kui vajutate next avaneb litsentsileping (mis tuleks kindlasti läbi lugeda), millega tuleb jätkamiseks nõustuda. Lisaks sellele on teil võimalik tellida WebDeveloperi avalehele uudised temaatilise RSS kanali kaudu.
Installi järgmisest sammust saate valida, milliseid lisakomponente soovite koos WebDeveloperiga paigaldada. Nendeks komponentideks on:
  • Silverlight runtime, mis võimaldab vaadata animeeritud veebilehti.
  • SQL Server 2008 Express – lihtne andmebaasiserver andmebaaside haldamiseks ja kasutamiseks
Kui kõik vajalikud komponendid valitud saate näidata millisesse kausta WebDeveloper paigutada ning näete kokkuvõtet kõigist alla laetavatest ja paigaldatavatest komponentidest.
Komponentide hulk ja maht sõltu palju sellest, milliseid programme ja lisakomponente on sellesse arvutisse varasemalt installeeritud.
Järgnevalt saate rahulikult tegelda muude asjadega kuni kõik vajalik kohale tõmmatakse ning paigaldatakse 
Üldiselt on paigaldusprotsess täisautomaatne, kuid paigaldatavate komponentide hulgas võib olla ka selliseid komponente, mis vajavad peale paigaldamist arvuti taaskäivitamiseks.
Ja ongi Visual Web Developer 2008 Express edition paigaldatud.
Peale paigaldamist oleks kasulik toode registreerida. Sel juhul saate seda programmi kasutada rohkem kui 30 päeva!
Lisaks sellele tasuks minna Microsoft Update veebisaidile http://www.update.microsoft.co m ning paigaldada ka kõik kriitilised uuendused ja võib-olla ka mõned mittekriitilised täiendused!
Esimene Visual Studio käivitamine võtab pisut aega, kuid lõpuks ta siiski käivitub ning saate alustada ilusate veebisaitide loomisega. Kui te paigaldamise käigus tellisite ka RSS uudised siis need on nähtaval Visual Studio avalehel, koos viidetega juhenditele ning asjakohastele uudistegruppidele (newsgroups), foorumitele ja maililistidele (mailing lists).

Põhivõimalused

Lihtsa veebilehestiku loomine HTML keele abil

Esimene veebileht

Kõige lihtsam veebirakendus koosneb ühest lehest. Veebilehtede levinumaks keeleks on HTML, mida veebilehitsejad mõistavad lugeda ning loetud teksti põhjal kasutajale lehe ette kuvada. Mitmete veebitehnoloogiate (ASP.NET, Java servlet, PHP, Python ...) tulemusena lehitsejasse saadetav tekst on ikkagi „puhas“ HTML, nii et osava peitmise korral ei pruugi veebisaidi vaatajal kuidagi võimalik olla kindlaks teha, millise tehnoloogia abil vastav lehestik on kokku pandud. Ning nagu varemalt kombeks ning praegugi lihtsamate, pidevat muutmist mitte vajavate lehtede puhul kasutatakse, võibki veebileht olla üks harilik HTMLi reeglitele vastav tekstifail, mida veebilehitsejas näidatakse. Mitmesugused tehnoloogiad on lihtsalt leidnud võimalusi, kuidas võimalikult mugavalt lehtedel olevad andmeid määrata vastavalt kasutaja soovidele. Lihtsaim HTMLi reeglitele vastav veebileht näeb aga välja järgmine:
Minu esimene leht
Tere maailm
Selle võib salvestada omale sobiva tekstiredaktoriga (nt. Notepad või ka vastinstalleeritud Visual Web Developer). Panna failile laiendiks .html (siis teab veebilehitseja , et vastavat teksti tuleb kujundada HTML-i reeglitele vastavalt), jätta meelde kuhu fail salvestati.
Edasi juba lehitsejas avada nagu tavalist kohaliku masina faili (failimenüüst ava). Tulemuseks leht, kus ülal pealkirjariba peal on lehe pealkiri ning allpool sisu osas lehe sisu.
Veidi lähemad seletused, et mida miski HTMLi lehe osa tähendada võiks.
Avakäsklus teatab HTMLi versiooni. Nii nagu nt. Wordi dokumentidel on versioonid 2.0, 6.0, 97, 2000, 2003, 2007 jne, nõnda ka HTML on oma arengu käigus muutunud. Kõiki eri versioone ja „murrakuid“ lugedes saaks neid kokku õite mitukümmend. Siit võib välja lugeda, et versiooniks on XHTML 1.0 Transitional – ehk siis 1999ndast ligi kümnendi püsinud kirjapanekuvorming.
Edasi hakkavad HTMLi käsklused. Märkide vahel olevate sõnadega antakse teada, mis nüüd tulemas on. Esimese elemendi nimeks ongi html, ehk siis lehitsejale teadmiseks, et tulemas htmli dokument. Juuresolev atribuut xmlns (xml namespace) näitab, millise nimeruumiga elemendid seotud on. XHTML 1.0 Transitionali puhul siis järgnev nimi: http://www.w3.org/1999/xhtml . Näeb välja väga hüperlingi moodi. Aga selline kuju võeti nimeruumide nimetuste puhul ette vaid selleks, et kogemata ei satuks mitmel eri firmal ette samanimelist nimeruumi. Kas vastavale lehele ka selgitav tekst andmete kohta pannakse – see on juba vajaduse ja viisakuse küsimus.
Veebilehe kood koosneb kahest suhteliselt iseseisvast osast. Ühe nimeks head (päis) ning teiseks body (sisu). Esimesse neist pannakse pealkiri (title) ning soovi korral lisaks igasugu muud andmed lehe kohta, mida otse näidata ei soovita. Näiteks lehe autor, märksõnad, kooditabel jm.
Minu esimene leht
Sisu osa lehel on kõigile nähtav. Lihtsamal juhul ongi siin paljas tervitav tekst, aga eks hiljem saab kujundust keerukamaks hakata muutma.
Tere maailm
Nagu näha, siis kõik alustavad elemendid peavad kusagil ka lõppema. Lehe sisuosa tähistav element body lõpeb lõpetava tähisega ning dokumendi enese .
Et suurem lehekülg võib ülesehituselt päris keerukaks minna, siis on vaja abivahendeid kontrollimaks , kas kõik ikka reeglitele vastab. Enamik lehitsejaid suudab küll mõningad (trüki)vead ka ise ära aimata ning siiski lehe viisakalt välja näidata. Kuid sealjuures võib hakata tekkima probleeme. Näiteks, et kas tekstid olid mõeldud üksteise kõrvale või üksteise alla. Kui veebilehe looja on oma lehe validaatoris järgi kontrollinud, siis võib loota, et lehitsejad saavad sellest enamvähem sarnaselt aru. Ametlikuks veebilehe tehnilise korrektsuse kontrolliks on loodud teenus aadressil http://validator.w3.org . Seal võimalik kontrollida kas juba ülesriputatud lehe korrektsust, laadida üles fail või kopeerida olemasolev HTMLi kood otse tekstiaknasse. Lihtsa väikese koodi puhul, nagu siinne alustus, on viimatine võimalus ehk mugavaim. Kui mõni viga juhtub, antakse sellest teada. Muul juhul aga teatatakse uhkesti rohelisel kirjal, et sisestatud kood on reeglipärane.
Ülesandeid
  • Tee näide läbi. Vaata tulemust.
  • Lisa tervitusele hüüumärk. Salvesta ja vaata veebilehitsejas tulemust.
  • Veendu, et kood valideerub.
  • Tekita HTML-koodi sisse viga (nt. eemalda üks
  • Paranda kood taas õigeks. Kopeeri validaatori antud „kvaliteedimärgi“ lõik oma koodi sisse lehe lõppu (enne ). Veendu, et pilt tuli nähtavale.

Esimene veebileht Visual Studio abil

Nagu näha, võib lehti luua igasuguse tekstiredaktori abil. Piisab teksti kirjutamisest, salvestamisest ning veebilehitseja mõistab lehel olevate HTMLi käskude ning nende vahel oleva sisu põhjal tulemuse välja näidata.
HTMLi käske on aga palju ning kõik neist ei pruugi sugugi kohe tuttavad olla. Samas aga enamik meist on kujundanud tekste mõne redaktori abil, kus saab valida värve, suurust jm. Seetõttu võib esmane lehtede loomine minna libedamalt mõne selleks tarbeks mõeldud vahendi abil. Et siin materjalis tutvustatakse Microsofti veebivahendeid, jääb paratamatult ette Visual Web Developer, mil ka veebilehtede koostamiseks omaette nurk olemas.
Uue veebilehestiku loomiseks tasub valida failimenüüst „New Web Site“. Ning et liialt palju lehti silmade kirjuks muutmiseks ette valmis ei genereeritaks, siis sobib valikust Empty Web Site. Allpool tasub märkida/luua kataloog , kuhu sisse loodav lehestik tuleb.
Toimetuse tulemusena tekkis masinasse vastav kataloog ilma ühegi failita. Sellest ei tasu end segada lasta. Web Developeri paremas servas võiks olla nähtaval Solution Explorer . Või kui seda mingil põhjusel seal ei paista, siis võiks aidata View menüüst valitud Solution Explorer. Selles parem hiireklõps rakenduse kataloogi nime peal ning võib valida enesele veebilehestiku uue elemendi.
Sealt omakorda HTML-lehe ning lehe nimeks näiteks peokuulutus.html.
Tulemusena tekib HTMLi kest, mille sisse saab sobivaid teateid lisama hakata.
Pealkirjas oleva „Untitled Page“ asemele on mugav siin sobiv teade panna – hiljem kipub see kergesti ununema. Ning isegi tähtsates ametlikes lehtedes võib mõnikord näha kohti, kus see automaatselt pakutud „nimetu“ ilutseb. Edasi võib aga vaadete alt valida „Design“ ning saab lehte kujundada juba küllalt „tavalist“ redaktorit kasutades. Pealkirja tarbeks võib stiilide alt valida „Heading 1“ – selle tulemusena mõistetakse too rida juba ise nähtavamaks vormida.
Vahepeal võib huvi pärast lähtekoodi ehk Source vaatest piiluda, mis siis lehele pealkirja märkimise tulemusena tehti. Nagu näha, pandi sõna „Koolipidu“ h1-nimeliste käskluste vahele. Samuti pandi lõigumärk p (paragraph) ümber tavalisele nähtavale tekstile. Kui lõike oleks rohkem, siis saab nad lihtsalt nõnda üksteise järgi kirjutada, igaühele alustuseks ning
lõpetuseks.

Koolipidu


Septembri viimasel reedel kell 19 kooli saalis rebastega tutvumise ning nende ristimise pidu. Kogu koolirahvas oodatud!
Lehe vaatamiseks tasub Web Developeris vajutada nupule, mille kirjelduseks „View in Browser“. Tulemuseks pannakse kohalikus masinas tööle veebiserver ning veebilehitseja ja loodud serveri kaudu saab nimetatud lehte vaadata. Iseenesest poleks palja HTML-lehe tarbeks serveri käivitamine hädavajalik – seda saab vaadata ka lihtsalt failina kohalikust kataloogist. Aga kuna Web Developer pigem mõeldud siiski iga kord serveris uuesti genereeritavate lehtede loomise tarbeks, siis on talle vastav võimalus sisse ehitatud. Nii võibki lehte rahumeeli imetleda aadressilt, mis hakkab tähekombinatsiooniga http – HyperText Transfer Protocol , järgneb masina nimi, kust lehte vaadatakse. Nimi localhost tähistab kohalikku masinat. Edasi pordi ehk värati number mis vajalik, et samas masinas olevad mitmed veebiühendust pakkuvad programmid omavahel tülli ei läheks. Siis juba rakenduse nimi ja sealt seest rakenduse sees oleva faili nimi.
Kui tahta loodud kuulutus teistele üle võrgu ka kättesaadavaks teha, tuleb see laadida lihtsalt kohta, kus see kõigile näha. Olgu selleks õpilasele koolivõrgus eraldatud veebiruum või ka mõnes avalikus serveris asuv koht. Eestis näiteks on levinud hot.ee nimeline veebikeskkond, kus rahumeeli igaüks saab omi HTML-faile hoida ja teistele näidata. Kel konto olemas, võib Kodulehe sektsiooni vastava faili laadida.
Edasi piisab juba veebilehitsejasse aadressi kirjutamisest ning igaüks võib üle võrgu vastavat teadet vaadata. Koolis saab viite panna nt. avalehele või siis huvilistele kirja teel kohale saata.

Piltide kasutamine veebilehel

Veebileht võib piirduda ainult tekstilise teabega. Tahtes seda aga ilusamaks muuta, on pildid igati omal kohal. Kes autoriõigustega ei karda pahuksisse minna, saab omale veebist igasuguseid vahvaid kujutisi muretseda. Kui aga joonis ise kokku pandud, siis ei saa kellelgi muret olla, et seda üles panna ei tohiks. Siin kuulutuse juures joonistati kokku rebase moodi kujutis. Ning et seda oleks mugav veebilehestiku juures pruukida, siis salvestati olemasoleva HTML-failiga samasse kausta. Veebis enamvähem kindlapeale näidatavad vormingud on gif, jpg ja png. Esimene neist jooniste tarbeks, teine fotodele ning viimatine saab enamvähem kõigega viisakalt hakkama. Igasugu muude vormingute nagu näiteks bmp näitamine sõltub rohkem konkreetse veebilehitseja oskustest ja seadistustest. Siin salvestati siis peokuulutus.html-iga samasse kausta pilt nimega rebane .png.
Pärast pildi salvestamist ei ilmu see veel automaatselt failide juures nähtavale. Aga kui Solution Exploreris vajutada refresh-nuppu , siis peaks pildifaili nimi failide loetellu ilmuma.
Edasi võib pildi lihtsalt lehe teksti sees sobivasse kohta – näiteks lõppu – lohistada. Keskkond võib küsida alternatiivteksti – nende jaoks, kes mingil põhjusel pilte ei saa vaadata. Näiteks, kui tegemist mobiiliekraani kaudu veebi lehitsemisega ning kiiruse ja odavuse huvides on pildid välja lülitatud.
Kui lähtekoodi piiluda, siis on näha, et tekkis uus lõik (element nimega p). Lõigu sees pilt (element nimega img) ning viimasel küljes atribuutidena mõned andmed. Tähtsam neist pildifaili nimi, siin näites rebane.png . Teiseks kohustuslikuks väljaks pildi juures on toosama alternatiivtekst, mis sisestusaknast küsituna vastavasse kohta kirjutati. Kes veebilehte koodina kirjutab, mõistab selle sobivasse alt-kohta ka ise paigutada. Ning võibki pilti vaadata.
Kui nüüd pildiga kuulutus tahta kuhugi veebiserverisse nähtavale kohale üles panna, siis tuleb veebi kopeerida mõlemad failid. Nii pildifail kus rebane peal kui ka muudetud sisuga kuulutusfail, kus öeldud, kus kohal see pilt on vajalik lehel näidata. Enne kopeerimist tasub jälgida, et Web Developeris oleksid failid salvestatud. Pildi näitamine arendusvahendi lehel ei tähenda veel andmete jõudmist kettale. Et peokuulutus.html oli eelmises variandis olemas, siis mõnes kohas võidakse kopeerimisel uurida, et kas soovitakse vastavat faili üle kirjutada. Et soovime vana variandi uuega asendada, siis tuleb sellele küsimusele jaatavalt vastata.
Kui nüüd lehte uuesti vaadata, võiks pilt näha olla. Mõnel pool hoitakse veel vanu andmeid meeles – seega tuleb uue tulemuse nägemiseks mõnevõrra oodata. Või siis vajutada CTRL+ SHIFT +Reload.

Seotud lehed

Eelnevast näitest paistis , et paljaks tutvustuseks piisab ühest lehest. Rohkemate andmete põhjal pole aga põhjust kõike korraga näidata – vastavalt vajadusele saab lugeja valida omale parasjagu vajalikke lehti. Enne lehtede omavahelist sidumist tuleb aga need kõigepealt valmis teha – siis on mugavam teada anda, kust kuhu liigelda saab. Siin näites lisame peokuulutuse kõrvale lehe, kus kirjas, mille eest keegi korralduse juures vastutab. Ehk siis taas Solution Exploreris rakenduse kausta juures parem hiireklõps, sealt uus HTML-leht, mil nimeks vastutajad.html. Osa kujundust on mugav disainivaates teha. Et tulemuseks aga HTML-kood, siis ei saa disainivaates teha midagi sellist, mida otse koodi sisse kirjutada ei saa. Vastupidi aga küll. Üheks selliseks mooduseks on definitsiooniloend – sõna ja tema seletus. Ehk siin on sõna ehk definitsiooni rollis klassi number, selgituseks aga nende roll peol. Kogu selle loo ülesmärkimiseks on vaja kolme eri HTML-käsklust. Käsk dl ehk definition list teatab, et nüüd loetelu algab, nüüd lõpeb. Definition term ehk dt märgib seletatava termini, dd ehk definition määrab termini vaste. Ning nende abil saab iga klassi koos oma rolliga kirja panna.
Kood otse eraldi ka.
Peo vastutajad

Peo korralduse eest vastutajad


10. klass
Rebased
11. klass
Võistluste ja katsumuste läbiviijad
12. klass
Muusika eest hoolitsejad
Disainivaates on näha, et klassid on tõmmatud vasakule, nende juurde kuuluvad seletused aga mõningasse taandesse sinna kõrvale.
Kaks eraldi lehte olemas, nüüd siis tarvis nad omavahel siduda. Ja praegusel juhul soovitavalt mõlemat pidi – nii et avalehelt saaks vastutajate lehele ning viimasest omakorda tagasi avalehele. Viite loomiseks on vajalik teada anda kaks asja: mille peale vajutades viide käivitub ning kuhu vajutades satutakse. Viidetega ümber käimiseks on HTMLi sisse mõeldud element nimega a. Selline lihtne ühetäheline nimi, pärit sõnast anchor ( ankur ). Kõige lihtsam ühendusmoodus on avada avalehe lähtekood ning sinna sobivasse kohta lihtsalt vedada Solution Exploreri alt vastav fail. Ehk siis haaran hiirega kinni failinimest vastutajad.html ning sikutan ta lehe lähtekoodis kohta, kus võiks viide olla.
Tulemusena tekkis siis rida
vastutajad.html
Atribuudi href (hyperlink reference) juures on kirjas avatava faili nimi. Elemendi a sisu (ehk siis ja vahelt on lehel nähtav tekst. Praegu seal lihtsalt sama faili nimi, sest lohistamise peale ei mõistnud veebiredaktor sinna paremat selgitust anda. Ise aga saab sinna mõnevõrra pikemalt kirjutada. Näiteks
Peo osaliste tööjaotus
mis siis veebilehel näeb välja ilusasti viitena
Terviklik avalehe kood siis


Koolipidu


Septembri viimasel reedel kell 19 kooli saalis rebastega tutvumise ning nende
ristimise pidu. Kogu koolirahvas oodatud!
Peo osaliste tööjaotus
Sarnane viide ka vastutajate lehe koodi
Peo vastutajad

Peo korralduse eest vastutajad


10. klass
Rebased
11. klass
Võistluste ja katsumuste läbiviijad
12. klass
Muusika eest hoolitsejad
Avalehele
ning juba võibki viiteid pidi kahe lehe vahet liikuma hakata.
Viited aga ei pea sugugi olema vaid paari kohaliku lehe vahel. Kuna veebiaadressi kaudu saab ligi lehtedele üle Interneti, siis piisab sobiva viite lisamisest oma lehele. Lihtsa failinime puhul saab lehitseja aru, et seda otsitakse kohalikust kataloogist. Kui aga aadressil on kirjas ees http:// (või mõni muu protokolli tähis nt. ftp), siis teatakse , et vastavat faili tuleb välisvõrgust otsima hakata. Sellest ka põhjus, miks viidetele tuleb nood http-d ette kirjutada. Muul juhul kipub lehitseja otsima kohalikust kataloogist faili nimega www.ilm.ee (või näiteks faili nimega microsoft.com) ja ei leia kuidagi.
Peo osaliste tööjaotus
Vaata ilmateadet ja vali enesele sobiv riietus!
Käsklus br tähistab reavahetust (break). Segadust kipub vahel tekitama, miks tol elemendil on kaldkriips lõpus, kui mõneski muus kohas kipub kaldkriips olema enne elemendi nime. Selgituseks, et siin on elemendi algus ja lõpp koos, st. tegemist on käsu
lühendatud kujuga. XHTML vastab XMLi reeglitele ning sealtkaudu nõutakse iga elemendi puhul algust ja lõppu. Elemendil a on näiteks sinna vahele põhjust atribuudina panna avatav aadress ning tekstilise väärtusena kasutajale nähtav jutt. Käsk br tähistab aga ainult reavahetust ning kui sinna täiendavaid andmeid (nt. rea kõrgust) ei lisata, siis piisabki vaid elemendi nimest. Mille taga kaldkriips annab teada, et sellega on vastava elemendi mõjupiirkond ühtlasi lõppenud.
Lõpetuseks siis lehitsejas töötav viidetega leht.
ja tema lähtekood
Koolipidu


Koolipidu


Septembri viimasel reedel kell 19 kooli saalis rebastega tutvumise ning nende
ristimise pidu. Kogu koolirahvas oodatud!
Peo osaliste tööjaotus
Vaata ilmateadet ja vali enesele sobiv riietus!
http://video.msn.com/video.aspx?vid=ac6e0c0d-f8b9-46f6-ba9c-07fba46fa2fc
Ülesandeid
  • Loe näide mõttega läbi.
  • Koosta korvpallivõistluse tarbeks kuulutusleht.
  • Vaata lehte veebilehitsejas.
  • Otsi või joonista lehele sobiv pilt.
  • Koosta eraldi lehekülg, kus kirjas mängivate võistkondade nimed.
  • Seo lehed omavahel viidetega.
  • Pane avalehele viide korvpallireeglitele. Näiteks http://www.basket.ee/uploads/docs/korvpalli_reeglid.pdf
  • Otsi korvpalliga seotud pilte. Koonda nad ühele galeriilehele. Lisa viide avalehelt galeriisse ja tagasi
  • Koosta iga võistkonna kohta omaette väike tutvustav leht. Avalehelt tee viide lehele, kus asub võistkondade loetelu. Loetelust saab viite abil iga võistkonna juurde. Lisa ka tagasisuunas toimivad viited.
  • Võimaluse korral pane loodud lehestik üles avalikult kättesaadavasse veebiserverisse. Veendu, et kõik on ilusti nähtav. Serveri puudumisel püüa lehestik nähtavaks saada sõbra arvutis või oma arvuti teises kataloogis.
  • Tee oma lehestikus mõni täiendus (näiteks lisa üks korvpallimeeskond). Hoolitse, et uus versioon oleks nähtav ka ülespanekukohas.

Astmelised laadilehed (CSS) – cascading style sheets

Lehestiku kujundamisel on mitmesuguseid mooduseid. Üksiku väikese lehe puhul on tõenäoliselt lihtsaim variant graafilise redaktori abil sobivasse kohta suurused ja värvid määrata ning ongi valmis. Kui aga soovitakse, et mitmes kohas oleks sarnane kujundus – näiteks pealkirjad kindla suuruse ja paigutusega, viited üle kogu dokumendi ühtlased, siis pikema dokumendi või lehtede komplekti korral on viisakas vastavat tüüpi andmete kujundus eraldi ühes kohas määrata ning pärast seda määrangut kasutada. Liiatigi on nõnda võimalik kogu kasvõi suurema lehestiku põhikujundust hiljem muuta ilma, et peaks ükshaaval kõiki kohti läbi käima.
HTMLi varasemates versioonides oli hulk käsklusi kujundamise tarbeks. Leiti aga, et keelt tasuks lihtsamaks teha, kuna muidu on tülikas mobiilseadmetele ja muudele väiksema arvutusvõimsusega masinatele HTML-i lugejaid teha. Samas ei tahetud loobuda mitmekülgsetest kujundusvõimalustest. Nõnda koos XHTMLi tulekuga 1999ndal aastal otsustatigi enamik kujunduskäsklusi HTMLi keele seest välja visata või vähemasti ebasoovitavaks muuta ning selle asemel soovitatakse kasutada laadi- ehk stiililehtede võimalusi. Kui seade suudab sealseid kujundussoovitusi arvestada, siis ta arvestab. Kui mitte, siis mitte. Aga vähemasti põhitekst on igale kasutajale nähtav. Samuti on CSSi juures kujunduskäsklusi ja -võimalusi tunduvalt rohkem kui ennist HTMLi küljes.

Näite kopeerimine

Õppida ja katsetada aga on kindlam näite peal. Siis saab proovida ja vaadata, mis toimub. Võtame aluseks eelmises peatükis valminud koolipeo kuulutuse näite. Kui tahta, et vana näide tervikuna alles jääb ja uue peal rahus katsetada võib, siis on vanast hea koopia teha. Ning siinse veebirakenduse puhul tasub koopia teha tervest kataloogist. Enne tal nimeks koolipidu, uueks nimeks paneme koolipidu2. Tervikrakenduse avamiseks aitab Web Developeri failimenüü käsklus „Open Web Site“. Võidakse algul küsida, et kas soovime rakenduse versiooninumbrit muuta. Kuna aga tegemist puhaste HTML-lehtedega ilma mingi konfiguratsioonifailita, siis tasub pigem vastata, et ei soovi. HTMLid ikka igal pool ühesugused ning lihtsam, kui meile koodi ise juurde ei genereerita.

Pildi suuruse muutmine

Kui rakendust piiluda, siis ühes kohas ongi keskkond juba stiilikäskluse genereerinud. Pildi juures paistavad olema märgitud mõõdud
Tasub proovida neid muuta ja veenduda, et pilt ka rakenduse juures ekraanil muutub.
width-o.html">width : 50px; height : 165px" juures näiteks pressiti pilt kokku
lihtsalt juures aga määratakse laius kindalt paika, kõrgus võetakse proportsioonis vastavalt laiusele.

Käskluste valik

Laadikäskluse võib aga pea iga elemendi külge kirjutada. Ning keskkond on piisavalt tark, et sinna võimalikke käske juurde pakkuma hakata. Ehk siis kui esimese lõigu juurde sai kirjutatud style=““ , siis sinna juurde tekkis valikmenüü päris mitmesuguste käskudega, millest saab hakata omale sobivaid kombineerima. Nagu aimata võib – backgroundiga algavad käsud määravad tausta, borderiga jooned, color seab esiplaani värvi, font ja tekst teksti fondi, suuruse ja joondusega seotu .
Määrasin näiteks kuulutuselõigule omadused, et kaugus vasakust servast on 20 pikslit (ekraanipunkti), tekst on suur (large) ning värv roheline.
Septembri viimasel reedel kell 19 kooli saalis rebastega tutvumise ning nende ristimise pidu. Kogu koolirahvas oodatud!
Tulemust näeb pildil:

Valmisnäidete kasutamine

Edasi on juba proovimise ja katsetamise asi. Hulga ilusaid näiteid leiab veebiõpetuste lehelt w3schools.com aadressilt http://www.w3schools.com/css/css_examples.asp . Tuleb vaid omale sobiv jupp leida ning töötavana oma lehele üle kanda.
Muude hulgas paistab teksti joondamise näide ( align the text)
Sealt leiab järgneva näite<<<

This is header 1


This is header 2


This is header 3


Edasi tuleb nuputada, kuidas näitest omale kasulik rida ära näpata. Siin paistavad laadid olema kirjas lehe päiseosas (head). Kui praegu aga katsetame vaid ühele lõigule omaduste andmist, siis on meil vaja vaid sobiv käsklus õigesse kohta tõsta. Siin on märgitud kolme taseme pealkirjad. Ning ülal on igaühele neist määratud, kus ta paikneb. Teksti paremale joondamise käsuks on siis järelikult text-align:right. Tahtes näiteks tööjaotuse ja ilmateate lõigu paremale joondada, kopeerime vastava käsu sinna lõigu juurde.
Peo osaliste tööjaotus
Vaata ilmateadet ja vali enesele sobiv riietus!
ning pärast salvestamist võibki alumist teksti nõnda paremale joondatult vaadata.

Määramine päises

Elementide omadused aga saab määrata ka lehe päiseosas – samuti nagu w3schools.com näite juures tehti. Selleks head osa sisse element style, sinna määratava kujundusega HTMLi käskude loetelu ning iga elemendi taha looksulgudes ja semikoolonitega eraldatult need käsud, mis vastava elemendi külge tahetakse panna. <<
teatab siis, et lehe sisu (body) on kollase taustaga. Esimese taseme pealkiri (h1) asetseb keskel ning on punast värvi.
Ning selguse huvides ka kogu avalehe kood: <<

Koolipidu


Septembri viimasel reedel kell 19 kooli saalis rebastega tutvumise ning nende ristimise pidu. Kogu koolirahvas oodatud!
Peo osaliste tööjaotus
Vaata ilmateadet ja vali enesele sobiv riietus!

Laadileht eraldi failis

Lihtsa teksti puhul piisab kujunduse määramisest lõigu või sõna juures. Pikemal lehel tasub vähemasti korduvate elementide sõnad panna päisesse. Kui aga tahta sarnast kujundust kasutada mitme lehe juures, siis on viisakas kujunduskäsud tõsta eraldi faili ning need siis igal lehel sisse lugeda. Nii mõjuvad kujundusfaili käsud kogu lehestikule ning näiteks kõigi lehtede taust on kerge asendada sobivaga. Viimatises näites on määratud lehe taust ning esimese taseme pealkirja andmed. <<
Nende jaoks tekitamegi eraldi faili. Solution Explorer -> paremklõps rakenduse nimel -> Add New Item -> Style Sheet ning nimeks näiteks kujundus.css. Viimasesse on juba „seemneks“ pandud body-elemendi nimi. Kopeerin aga julgesti kogu olemasolevad kaks kujundusrida sinna faili ning algsest kustutan ära.
Nõnda läheb ülal määratud kujundus esimese hooga veebilehelt kaduma. Nii et veebilehitsejas paistab endine valge taustaga kuulutus, kus pealkiri on vasakul.
Edasi aga tasub kuulutuslehel öelda, et kujundus loetakse eraldi failist sisse. Selleks on CSSis käsk @import. Ehk siis päiseosas annan teada:
@import "kujundus.css";
ning leht on jälle kollane.
Kui nüüd soovida sama kollase tausta ja punase pealkirjaga kujundus panna ka tööjaotuse lehele, pole muud, kui sama @import ka sinna lisada.
Peo vastutajad
@import "kujundus.css";

Peo korralduse eest vastutajad


10. klass
Rebased
11. klass
Võistluste ja katsumuste läbiviijad
12. klass
Muusika eest hoolitsejad
Avalehele

Kujundusklass

Kujundusomadusi saab määrata elemenditüüpide kaupa nagu eelnenud näitest näha: kõik esimese taseme pealkirjad paigutati keskele ja värviti punaseks. Mõningaid omadusi aga soovitakse panna ainult mõnede vastavate elementide juurde või siis sootuks erisuguste elementide külge. Näiteks soovitakse kõik uued teated lehel eraldi ära märkida sõltumata sellest, kas teated on tabeli, loetelu, lõigu või mõne muu tehnilise vahendi abil lehele kuvatud. Siinses väljamõeldud näites sobib eraldi rõhutada vastavast klassist osalejate roll. 10. klassi rahvas on rebased, 11. klassi omad peo võistluste läbiviijad. Kujundusfailis võib defineerida rolli klassi, edasi juba määrata, milline sõna või lõik selle klassi järgi kujundatakse. Ning kui juhtub, et kujundusklass tahetakse kinnitada osa külge, mis pole eraldi elemendiga piiritletud, siis piiritlemiseks sobib element nimega span . Element ise ei tee midagi, küll aga saab sinna külge kujunduskäsklusi ja –klasse kinnitada. Lisan kujundusfaili rea<
ning vastutajate loetelu juures märgin ära, millised kohad tähistavad rolli.
10. klass
Rebased
11. klass
Võistluste ja katsumuste
läbiviijad
12. klass
Muusika eest hoolitsejad
Nagu näha, mõistab arenduskeskkond olemasoleva(d) klassi(d) ise välja pakkuda.
Ning ongi rolli tähistavad kohad alla joonitud.
Ülesandeid
  • Loo oma korvpallimeeskonna lehestikust koopia või koosta ise väike lihtne lehestik.
  • Värvi mõni lõik ja mõne lõigu taust, katseta teksti suuruse ja paigutusega.
  • Tutvu http://www.w3schools.co m css-i näidetega. Katsu sealt vähemasti kümmekond enesele üle võtta (nt borderi abil jooned koos värvi ja laiusega, joondus, rasvasus (font- weight )).
  • Määra lehe taust ja vaba serva laius (margin-left) päises. Katseta.
  • Tõsta need määrangud eraldi laadifaili. Veendu, et algsest lehest on kujundus kadunud.
  • Ühenda veebileht ja laadifaili @import käsu abil
  • Ühenda sama laadifail ka teise veebilehega ning veendu, et kujundus tuli mõlemasse üle.
  • Muuda laadifailis lehe tausta ja veendu, et see mõjub mõlemale lehele.
  • Loo klass nt. noortemeeskondade tähistamiseks. Sealne tekst rohelise värviga. Tähista noortemeeskondade nimed vastava klassiga. Veendu, et kõikidel lehtedel on nende nimed rohelised. Muuda noortemeeskondade klassi nõnda, et roheline pole mitte tekstivärv vaid taustavärv. Veendu muutuse toimumises.
  • Koosta täiesti uus lehestik näiteks kavandatava matka kohta. Märgi paberile üles teemad, mis võiksid lehestikus olla. Koosta paberile struktuur, kust lehelt kuhu võiks liikuda, mõtle lehtedele sobivad pealkirjad ning failinimed. Joonista valmis eskiisid, millised võiksid lehed välja näha – st. kas kõik lehed ühesuguse plaaniga või nt. avaleht ja menüülehed teistest erinevad. Koosta iga lehetüübi jaoks blankett . Stiilikäsklused koonda eraldi kujundusfaili, mis igasse blanketti imporditakse. Tee blankettidest iga lehe jaoks koopia, kuhu ainult märgitakse teema, näiteks „siia tuleb matka teise päeva söögikoha kirjeldus“. Seo lehed omavahel viidetega. Joonista matka marsruut kaardile ning pane ka see leht lehestikku. Palu naabril otsida üles soovitud leht ning vaata, kui kergesti ta selle menüüde kaudu leidis. Vajadusel lisa selgitusi või keerukamal juhul muuda oma lehestiku struktuuri. Mängi kujundusfailiga, et lehestik võimalikult meeldiv välja näeks. Täida lehed võimalikult meeldivalt ja usutavalt. Ning lõpetuseks – kui lehestik võimalikult hea ja nii omale kui ka sõpradele huvitav, siis tasub see matk võimaluse korral ka teoks teha :-)

Programmeeritavad veebilehed

Eelnevas peatükis kokku pandud veebilehti nimetatakse staatilisteks. See tähendab, et ükskõik kes või millal seda lehte vaatab – leht on ikka sama sisuga. Ning alles siis, kui autor midagi muudab võib lehe peal uut sisu nägema hakata. Nagu näha, nii peokuulutuse kui matkalehe kannatab sellisena täiesti kokku panna ning sageli polegi teabe edastamiseks rohkemat vaja. Selline veeb oli aga küllalt viisakal tasemel juba 1997ndaks aastaks olemas, edasi on jõudsalt mitmesuguseid lisavõimalusi arendatud, et just konkreetsele kasutajale meelepärane olla, või siis kasutajate sisestatud andmeid töödelda nõnda, et sellest midagi suurt ja ilusat sünniks. Kogu ASP.NET on taoliste võimaluste tarbeks loodud. Staatilisi lehti võiks südamerahus kirjutada ükskõik millega ja panna üles ükskõik kuhu. Visual Web Developeri juures on „hariliku“ lehe kujundusvahendid lihtsalt üks killuke paljude programmeerimisvahendite hulgas.
Programmeeritaval veebilehel e. aspx lehel on samuti võimalik kasutada staatilisi HTML elemente, kuid lisaks neile avaneb võimalus kasutada programmelt kontrollitavaid ja hallatavaid ASP.NET elemente e. ServerControl’e

Kellaaeg

Programmeerimisvahendite katsetamiseks loon uue tühja veebiprojekti (failimenüü  New Web Site  Empty Web Site, nimeks programmeerimine). Solution Explorerist taas New Item, aga sedakorda Web Form. Nimeks kellaaeg.aspx. Keeleks siinse konspekti edasise järgimise huvides Visual C# ning hoolitsen, et „Place code in separate file“ juures ei oleks linnukest – sedaviisi ei teki esialgu tarbetut lisafaili.
Keeleks C#!
Tekkis ilus lehe blankett, kuhu saab tasapisi omi andmeid kirjutama hakata.
Lähemal uurimisel paistab, et sealne kood nagu oleks HTML ja nagu ei oleks ka. !DOCTYPE on täiesti olemas. Samuti oma alguse ja lõpuga . Ja ja . Aga üles on ilmunud salapärane rida
Ning päris mitmel pool on juures runat=“server“. Nende järgi võib aimata, et tõenäoliselt on tegemist ASP.NETi lehega. Ehk pea kõik, mis on HTMLina, saadetakse otse veebilehitsejasse. Kus aga juures kirjas runat=“server“, selle osaga võib lehe serveerimise käigus midagi juhtuda – sinna võidakse miskit programmikoodi abil juurde kirjutada või seal midagi muuta. Samuti on võimalik otse HTMLi koodi programmi kaudu midagi juurde kirjutada. Viimast võimalust ei peeta küll kuigi viisakaks. Aga kuna vanem ASP just nõndaviisi käis ning nii on lihtsaid asju kerge näidata, siis vastav alustusnäide ka siia. DateTime.Now annab praeguse kellaaja, Kell on abil trükitakse see just sinna kohta lehele. Nii et siinne lihtne lehe kood
Kell on
annab kokku lehe, kus nähtaval praegune kellaaeg.
Tegemist siis kõige ehtsama dünaamilise veebilehega – iga kord kui avad, on sisu uus.

Arvutav veebileht

Inimeselt andmete kättesaamiseks tuleb luua sisestuskoht. Üsna lihtne vahend selleks on tekstiväli. Sisestus- ja muid elemente saab valida tööriistakastist ( Toolbox ). Kui seda pole parajasti näha, siis View-menüüst saab selle esile kutsuda. Lohistades tekstikasti HTML-koodis sobivasse kohta, ilmub sinna tekst, mille abil ASP.NET teab veebilehe avamisel tekstikasti HTML-käskluse kuvada.
Automaatselt pannakse elementidele ka id-d. Nende järgi on hiljem programmikoodis võimalik nende poole pöörduda. Ning runat=“server“ jällegi iga elemendi külge, et server sellega midagi peale hakata tohiks.
Tollide arv:
Sentimeetrites oleva tulemuse vaatamiseks piisab kohast, kuhu programmiga pääseb kirjutama. Tekstiväli lubab üldjuhul ka inimesel andmeid sisestada. Paljalt andmete näitamiseks on aga loodud element nimega Label. Selle siis lehele lohistamegi ning tulemuseks on järgnev koodilõik:
Tollide arv:
Sentimeetrite arv:
Et millegi peale oleks võimalik arvutama hakata, selleks tasub lehele lisada nupp – element tüübist Button . Ning et vastusesildile ei jääks sõna „Label“ vaid midagi selgitavamat, siis määrasin sinna teksti „Teadmata“, samuti nupule teksti „Arvuta“.
Tollide arv:
Sentimeetrite arv:
Nagu aimata, ei juhtu nupuvajutuse peale veel midagi – arvutile tuleb enne kõik asjad ette öelda. Saab küll tekstivälja kirjutada ning nupule vajutada, aga vastust ekraanile ei ilmu.
Vastuse leidmiseks tuleb nupu külge programmikoodi lõik siduda. Lihtsaimaks mooduseks on minna disainivaatesse ning vajutada nupule topeltklõps.
Tulemuse peale tehti koodis mõningad automaatsed täiendused.
protected void Button1_Click(object sender, EventArgs e)
Tollide arv:
Sentimeetrite arv:
Kui teraselt algse versiooniga erisusi piiluda, siis paistab, et ülesse script- ossa on tekkinud alamprogramm nimega Button1_Click. Ning veebilehe sisuosas on nupu külge tekkinud juurde sündmuse kirjeldus ="Button1_Click" . Viimane tähendab, et kui nupule hiirega vajutatakse, siis käivitub märgitud nimega käsklus. Erinevalt mõnest muust programmeerimiskeelest ei ole siin kohustuslikku seost käskluse (funktsiooni) nime ning vajutatava nupu (või muu elemendi) nime vahel. Mõnikord võib panna ka mitmed elemendid sama käsklust välja kutsuma ning funktsiooni parameetrite (nime järel sulgudes olevate andmete) kaudu saab teada, millisele nupule tegelikult vajutati. Aga kuna praegu meil ainult üks nupp, siis pole mõtet lugu segaseks ajada.
Nupuvajutuse juurde siis programmikood, mis sammu kaupa teeb kõik vajalikud toimingud, et tähtedena (tekstina, stringina) sisestatud tollide arvust saaks vastusesse ka tähtedena sentimeetrite arv. Aga vahepealsete arvutuste juures on vaja andmetüüpi muuta, sest tekstidega ei saa C# keeles matemaatilisi tehteid ette võtta. Küll aga on arvude jaoks loodud omaette andmetüübid. Komadega hakkama saavaks arvutüübiks on double, ainult täisarve tunnistavaks tüübiks int. Levinumate andmetüüpide (nagu näiteks string ja int ja double) omavaheliseks tüübiteisenduseks sobivad klassi Convert käsklused. Rida
double TollidArvuna = Convert.ToDouble(TollidTekstina);
võtab tekstina olevad tollid , teisendab nad arvutimälus ümber reaalarvuna kirjutatavateks andmeteks ning jätab tulemuse meelde muutuja (märksõna) TollidArvuna alla. Viimase saab juba koefitsiendiga läbi korrutada, tulemuse tekstiks muundada ning vastusesildi peal näidata.
protected void Button1_Click(object sender, EventArgs e)
string TollidTekstina = TextBox1.Text;
double TollidArvuna = Convert.ToDouble(TollidTekstina);
double koefitsient = 2.54;
double SentimeetridArvuna = TollidArvuna * koefitsient;
string SentimeetridTekstina = Convert.ToString(SentimeetridArvuna);
Label1.Text = SentimeetridTekstina;
Kes Excelis või mujal valemeid kirjutanud, teab, et sarnased arvutused saab mõnikord ka lühemalt kirja panna. Siinsel puhul siis näiteks annaks sama tulemuse rida
Label1.Text=Convert.ToString(Convert.ToDouble(TextBox1.Text)*2.54);
Mõnikord on ühte rida isegi kergem lugeda kui pikemat programmilõiku. Kui aga kood nagunii nõnda pikk, et ühe pilguga ei haara, siis pärastise kontrolli ja arusaamise huvides on vahel kasulik toimetused sammude kaupa välja kirjutada.
Mõningast tähelepanu võivad vajada komad ja punktid. Nagu näha, programmikoodi sees on tollide ja sentimeetrite vaheline kordaja murdosa eraldaja kirjutatud punktina – 2.54. Veebilehitseja akna ekraanil aga vastus 25,4 kirjas komaga . C# keeles tuleb koodi sees eraldaja kirjutada alati punktiga – nii nagu keele sünnimaal tavaks. Kui aga arvutil seadeteks valitud Eestimaa, siis mõistetakse andmed sisse lugeda ja väljastada kasutades murdosa eraldajaks koma.

Tehtevalikuga kalkulaator

Eelnev kalkulaator suudab vaid tolle sentimeetriteks teha. Kui on tegemist ühe teisendusega, siis piisab taolisest alusest täiesti. Võib kindla kursi alusel arvutada kroone eurodeks või untse grammideks. Samuti kannatab mõningase mõtlemise peale eelneva näite põhjalt ehitada võimaluse, kus kahe või enama sisendandme põhjal vastus arvutatakse. Olgu näiteks sisendiks kauba kilode hind ja kilode arv ning väljundiks makstav summa. Lihtsalt tekstikaste tuleb rohkem ning igal neist peab olema oma, teistest erinev ID, mille kaudu vastavat väärtust küsida. Arvutamiseks tuleb andmetüüp doubleks muuta ning pärast näitamise tarvis jälle tagasi.
Kui aga ei soovita, et kõik tuleks kasutajal ise sisse kirjutada, vaid osa andmeid saaks ka mugavamalt ja veakindlamalt valida – siis aitab rippmenüü, DropDownList. Üksikud valikud selle sees saab ListItemite abil ära märkida. Ning programmikoodis saab rippmenüüst valitud väärtust kasutada sarnaselt kui igast muust sisestuselemendist tulnut.
Järgnev kood siis kõigepealt lehe kujunduseks, kus andmete sisestamiseks kaks tekstivälja, nende vahele rippmenüü. Ning teise tekstivälja järele nupp arvutuse alustamiseks ja nupu taha silt tulemuse näitamiseks.
protected void Button1_Click(object sender, EventArgs e)
Tehtevalikuga kalkulaator
x
Nupu peal tekstiks võrdusmärk, sildi peal esiotsa tühjus. Et arendusvahendi disainivaates sildi olemasolu arusaadav oleks, selleks näidatakse seal kantsulgude vahel selle sildi nime. Veebilehel aga on vastaval kohal tühjus. Ning nupu külge siis taas seotud disainivaate topeltklõpsu kaudu onclick-sündmus, mille abil saab enesele vajaliku funktsiooni käima panna.
Funktsioonis nagu näha võetakse kõigepealt tekstikastidest välja väärtused ning teisendatakse need arvutamiseks sobivasse tüüpi. Millise tehte on inimene valinud, selle kindlakstegemiseks on üheks võimaluseks rippmenüü omandus SelectedIndex, mis annab valitud rea järjekorranumbri alates nullist. Iseenesest oleks võimalik ka rea väärtus SelectedValue abil kätte saada, aga järjekorranumber on kindlam. Näiteks rakenduse tõlkimise puhul võib nähtav jutt keelest sõltuda, kui aga järjekord samaks jätta, sama valiku peale saab ikka sama toimetuse teha.
Vastuse leidmiseks tuleb Vastuse muutuja kõigepealt deklareerida. Ning funktsiooni sees on kohustus sellele muutujale ka miski algväärtus anda. Ehkki me praegu teame, et tegemist on ühega neljast kindlaksmääratud valikust, tahetakse programmeerimiskeeles end kaitsta ka sellise võimaluse vastu, kus mõni valik on jäetud märkimata ning näitamiseks pole Vastusele kusagilt väärtust võtta. if-valikulausete abil tehakse sobiv tehe ning lõpuks näidatakse Vastus tekstiks (stringiks) muundatuna sildile Label1.
protected void Button1_Click(object sender, EventArgs e)
double Arv1 = Convert.ToDouble(TextBox1.Text);
double Arv2 = Convert.ToDouble(TextBox2.Text);
int Tehtenr = DropDownList1.SelectedIndex;
double Vastus = -1;
if (Tehtenr == 0)
if (Tehtenr == 1)
if (Tehtenr == 2)
if (Tehtenr == 3)
Label1.Text = Convert.ToString(Vastus);
Edasi võibki juba imetleda, kuidas me armas väike kalkulaator töötab.
http://video.msn.com/video.aspx?vid=166cb365-9733-4b8b-ac0e-a2089e3e6908
Ülesandeid
  • Võta aluseks tolle sentimeetriteks teisendav näide ning koosta selle põhjal leht, kus arvutatakse tunde ümber minutiteks.
  • Paiguta lehele kaks nuppu: ühe abil saab arvutada tunde minutiteks, teise kaudu minuteid tundideks.
  • Vali rippmenüüst kauba nimetus, kõrvale tekstivälja kirjuta kogus. Tulemusena väljasta makstav summa.
  • Selliseid rippmenüü ja koguse komplekte on lehel mitu. Rippmenüüs on esimeseks valikuks „kaup valimata“ väärtusega null krooni. Leia kokku vajalik makstav summa.
  • Tekstiväljadesse kirjutatakse auto kütusekulu liitrites saja kilomeetri kohta ning läbitavate kilomeetrite arv. Rippmenüüst valitakse bensiini mark millele vastavalt on programmiskoodis kirjas selle bensiini liitrihind. Arvutuse tulemusena väljastatakse sõidu maksumus.

Andmebaasipõhise veebirakenduse loomine

Eelnevalt näidatud kalkulaatoreid saab luua ka ilma veebipoolse programmeerimiseta – olgu siis Javaskripti, Flashi, Silverlighti või mõne muu kliendipoolse tehnoloogia abil. Kui aga soov otsida suurest andmehulgast serveris või sinna omapoolseid lisandusi teha – sellisel juhul on veebiserveripoolne programmeerimine vajalikum. Ning ASP.NETi juures on päris mitmekülgsed ja mugavad vahendid andmetabelitega ümberkäimiseks loodud.

Andmetabeli näitamine veebilehel

Alustame lihtsamast, ehk siis serveris tabelis olevate andmete vaatamisest Interneti kaudu. Nagu ikka, tuleb algul veebirakendus luua. Siiani olime lühiduse huvides valinud „Empty Web Site“. Kui soovida, et arenduskeskkond meile mõned vajalikud failid algul valmis genereeriks, siis sedakorda valime „ASP.NET Web Site“.
Võrreldes eelmise variandiga on juures Default.aspx-fail avalehe jaoks, App_Data kaust andmete salvestamiseks ning konfiguratsioonifail web.config.
Et andmeid kusagil hoida oleks, selleks loome App_Data-nimelisse kausta sisse SQL Serveri andmebaasi. Nagu valikutest näha, oleksid teisteks võimalusteks tekstifail ning XML-fail. Siin näites andmebaasifailile nimeks koertebaas.mdf.
Esimeses ja lihtsamas lähenduses on andmebaas andmetabelite komplekt, igas tabelis olemas read ja veerud. Kõigepealt luuakse veerud, märkides neile ära nime ja tüübi. Siinses võimalikult lihtsas näites püüame veebilehel näidata koeri , igaühel koeranimi ja sünniaasta. Lisaks on andmebaasitabelite juures poolkohustuslikuks tulbaks identifikaatortulp, näiteks nimega id. Miks see vajalik? Kes näiteks Exceli tabeleid loob, sel tulevad reanumbrid automaatselt. Saab alati selgelt öelda, et vastav tekst on millises reas ja millises veerus. Andmebaasitabelites aga sellisel kujul reanumbreid ei hoita. Isiku identifitseerijaks võib olla näiteks isikukood. Need aga ei lähe sugugi mitte järjest. Küll aga on andmetabelite juures igati kasulik, kui on võimalik mingi kindla tunnuse järgi rida eristada. Muidu võib kergesti juhtuda, et näiteks sisestamisel tekib kaks korduvat rida ning tavavahenditega ei saagi naljalt öelda, et kustuta üks rida ära ja jäta teine alles. Siin siis eristajaks tulp nimega „id“. Nime ette tasub hiire parema klahviga valida primaarvõtmemärk. Et andmebaasiprogramm taipaks automaatselt id-numbreid välja mõelda, selleks tasub alt veeru omaduste seast valida, et tulba omadus „identity“ on sisse lülitatud. Ning siis asutakse automaatselt alates ühest ühe kaupa reanumbreid panema.
Andmetüüp int tähendab täisarve, sobib nii id kui sünniaasta puhul. Koera nimeks sai nvarchar(50) ehk siis national (lubab täpitähti) varchar ehk muutuva pikkusega, kuni 50 sümboli pikkune tekst. Omadus allow Nulls kipub vahel esmakordsel tutvusel segadust tekitama. Kõige lihtsam on sealne kast võimalusel märkimata jätta. Sel juhul tühiväärtused, ehk nullid (sõnaga) ei ole lubatud. Kui sisestame koera, peame sisestama ka tema sünniaasta. Kui aastat ei tea, saame aasta väärtuseks panna ka näiteks 0 või -1. Aga ei saa aastat panemata jätta.
Edasi juba koerte eneste sisestamine. Selleks tuleb avada Database Explorer. Sealt valida tabelite alt koertetabel ning selle pealt parema hiireklahviga Show Table Data. Nimi ja sünniaasta tuleb kirjutada, id-number tuleb automaatselt juhul, kui Identity Specificationi juurde on ennist yes kirjutatud.
Nende toimetuste tulemusena on andmebaas ja andmetabel olemas. Edasi siis juba tasub vaadata, kuidas andmed veebilehele nähtavaks saab.
Andmete vahendamiseks on ASP. NETis andmeallikad, nende nime lõpus on DataSource. SQL Serveri jaoks sobib neist nagu nimigi ütleb SQL Data Source. Alustuseks tuleb Toolboxist andmeallikas oma lehele vedada. Tulemusena ilmub ta Visual Web Developeri lehele omaette elemendina. Veebilehe tarvis on aga tegemist nähtamatu elemendiga, st. lehitsejas avades andmeallikat eraldi näha pole.
Graafilise osa juurest saab allikat ka edasi konfigureerida. Allika peale hiirega minnes ilmub nähtavale väike kolmnurk . Sealt tasub valida „Configure Data Source“.
Praegu ainukesed andmed ongi App_Data kaustas olevas andmebaasifailis koertebaas.mdf. Selle valimegi.
Edasi pakutakse andmeühenduse seadistuste salvestuse võimalust. Et oleks võimalik edasi rakendust hiirevalikute abil koostada, tuleb nad salvestada. Samuti on võimalik nõnda sama ühendust tulevikus mujal kasutada ilma, et peaks taas valima ja sättima hakkama. Siin näites on tegemist ühe failiga rakenduse kataloogis ning seetõttu ligipääs lihtne.
Mõnikord võib aga andmetele ligipääsuks olla vaja läbida õiguste ja võrgupõhine rägastik. Sel juhul ühenduse andmete korduvkasutus eriti vajalik. Samuti annab ühenduse andmete salvestamine võimaluse hiljem muuta andmebaasi asukohta ilma, et peaks selleks kõiki rakenduses leiduvaid andmebaasiga suhtlevaid lehti eraldi ümber tegema. Nimeks pakutakse praegu lihtsalt ConnectionString. No las ta olla – ehkki keerulisemate rakenduste puhul on vahel kasulik nimi määrata selle järgi, kuhu parajasti ühenduda tahetakse.
Järgmise sammuna uuritakse, et milliseid andmeid soovitakse vaadata. Et baasis on esialgu ainult üks tabel, pole valida kuigi paljude kohtade vahel. Ning kui tulbanimede alt valida tärn, siis tähendab see, et soovime näha kõikide tulpade andmeid.
Enne päringu salvestamist on soovitav seda katsetada. Kuna küsisime kõiki koeri kõikide andmetega ja saime kõik koerad kõikide andmetega, siis võib andmeallika loomise õnnestunuks pidada.
Kui andmeallikas olemas, siis järgmiseks on näitamisvahendi valik. Tabeli kujul olevad andmed saab lehele kõige lihtsamalt GridView Abil. Seal näidataksegi andmeid ridade ja veergudena.
Ka GridView on graafilise liidese abil seadistatav. Kõigepealt taas hiirega sinna peale liikumisel tekkinud väikesest kolmnurgast avada menüü ning sealt valida vajalik andmeallikas. Et meil siin lehel ainult üks allikas on, siis tuleb valida seesama SqlDataSource1.
Sealtkaudu saadakse juba aru, et tulpadeks on id, koeranimi ja sünniaasta. Kannatab lisada mõne „linnukese“. Enable Paging ütleb, et andmeid näidatakse lehekülgede kaupa. Ehk kui koeri on väga palju, siis nad ei ilmu mitte kõik korraga ekraanile, vaid näiteks kümne või mõne muu eraldi märgitava arvu kaupa. Enable Sorting järjestab andmed selle tulba järgi, millise pealkirjale kasutaja vajutas.
Ja polegi muud. Leht veebilehitsejas lahti ning võib koeri imetleda.

Lähtekood

Ehkki koerte loetelu sai suuremalt jaolt „hiire abil“ kokku lohistatud, on masinate jaoks kandev osa ikkagi tekkinud tekstil (mis sellest, et märgatav osa tekstist genereeritud). Kes tahab lihtsalt kiiresti standardlehekülgi kokku panna ja mitte viimistlemisega vaeva näha, võib siinsest lõigust esialgu üle hüpata. Pärastiseks süvenemiseks aga siia mõned seletused, et „mis siis tegelikult juhtus“.
Lehe ASP.NETi päis genereeriti eelmisest mõnevõrra pikem.
Keelevalik (C#) nii nagu varasemateski lehtedes. AutoEventWireup näitab, et on võimalik mõningad toimetused automaatselt lehe avamise juurde kirjutada (mida siin praegu tegelikult ei kasutata). Koodifail määrab failinime, kuhu võimalik lehel toimuvat määrav programmikood kirjutada. Eelnevas kalkulaatorinäites kirjutati arvutusvalemid otse aspx-lehele. Kui aga programmiosa suurem, siis on viisakas see eraldi faili paigutada – kujundajad enamasti ei oska sellega midagi mõistlikku peale hakata, programmeerijat jälle häirivad liigsed HTML-i osad. Siin koertetutvustuse juures küll veel midagi programmikoodiga ei tehta, aga standardseadetes „ASP.NET Web Site“ annab just sellise mooduse, kus aspx-fail kujunduseks ning sama nimealgusega cs-fail võimalike arvutuste tarbeks. Et ei tekiks kiusatust ebaviisakat programmeerijat mängida ja aspx-lehele programmikoodi kirjutada. Inherits="_Default" läheb samasse valdkonda – seal kirjas cs-failis oleva koodiklassi nimi, kust seest lehe juurde kuuluvaid käsklusi loetakse.
Edasi HTML-kood nagu tavaliselt. Midagi põnevamat hakkab juhtuma alles andmetoimetuste juurde jõudes.
Andmeallikas, ehk lehel siis koodina kirja pandud element nimega asp:SqlDataSource. ID pandi talle automaatselt. Ühendusteksti ehk ConnectionStringi saamiseks oli ennist pikem toimetus – tuli määrata, millisest kohast või failist andmed leitakse. Ning otsimiskohaks paistab olema ConnectionStrings:ConnectionString. Tekst ise tegelikult paikneb rakenduse põhikaustas olevas web.config failis. Kui seal veidi otsida, leab sealt jaotuse connectionStrings ning selle alt praeguseks ainukese teksti nimega ConnectionString. Tema tegelik väärtus on siinsel juhul
"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\koertebaas.mdf; Integrated Security=True;User Instance =True"
Ehk siis kohaliku masina andmebaasiühendus nimega SQLEXPRESS, andmekataloogis (App_Data) asuv andmebaasifail koertebaas.mdf. Ning ühendumiseks kasutatakse Windowsi õiguste süsteemi. Ehk siis kui veebiserver jookseb administraatoriõigustes, siis pääseb ta vabalt ka andmebaasile ligi.
SQL-lause SELECT * FROM [koertetabel] ütleb, et küsigu välja kõik andmed koertetabelist. Kandilised sulud tabeli nime ümber pole kohustuslikud. Aga kuna need aitavad mõnikord erisümbolitega paremini hakkama saada, siis generaator paneb need sulud ümber. Et SQL ise on levinud ja küllaltki võimalusterohkem keel, siis rakendusi edasi arendades saab siia panna tunduvalt keerukamaid ja vajalikumaid päringuid kui esialgse hiirega kokkulohistamise teel.
Ning lõpetuseks andmete näitamise GridView
AllowPaging lubab andmeid reagruppide kaupa eraldi lehtedel näidata. AllowSorting vastava tulba järgi reastada. Kui AutoGenerateColums oleks True, siis igal lehe avamisel vaadatakse uuesti, et millised tulbad päringust tulevad. DataKeyNames ehk võtmeväljade nimi/nimed on tarvilikud alles siis, kui andmeid muutma/ kustutama hakatakse. Aga generaator paneb nad juba nüüd suure hooga kohale. Ning viimasena GridView jaoks ehk kõige tähtsam teave, et ehk kust need näidatavad andmed võetakse. Praegusel juhul siis andmeallikast IDga SqlDataSource1.
Et tulpi automaatselt genereerida ei lubatud, siis tuleb andmete nägemiseks ise kirja panna, et milliste tulpadega on tegemist.
Hiljem saab vajadusel siitkaudu ka tulpade kujundusi määrata. Nagu nimedest aimata võib, siis DataField näitab, et millise andmebaasi tulbaga seotud ollakse. HeaderText määrab veebilehel tabelis nähtava pealkirja. Ning SortExpressioni järgi reastatakse vastav tulp. Et siin kõik kokku langevad, see vaid praeguse lihtsuse küsimus. Tõlgitavas rakenduses võiks päise tekst vabalt muutuma hakata. Ning järjestamiseks ei pruugi alati sugugi olla kasvav järjekord, vaid võib näiteks olla hoopis isikukoodist välja võetud sünnikuude järjekord.
Nüüd aga lehe kood tervikuna.
Koerte leht
Koerte andmed
http://video.msn.com/video.aspx?vid=89746fe3-ab23-41d3-9963-df0fac04df52
Ülesandeid
  • Tee näide sarnaselt läbi, ainult, et koerte asemel võta inimeste nimed, pikkused ja massid. Veendu, et sortida saab iga tulba järgi.
  • Muuda lehe SQL-lauset nõnda, et näha oleksid vaid 170st sentimeetrist lühemad inimesed (SELECT * FROM inimesed WHERE pikkus

Andmete muutmine ja lisamine veebilehelt


Et töötav koerteleht jääks ilusti hilisema tutvumise jaoks alles, teeme uue sarnase andmevaatamismooduse kasside tarbeks ning püüame seda hiljem mõnevõrra võimalusterohkemaks teha. Alustuseks ikka aspx-leht ning omaette andmetabel
Kuna kasutame sama andmebaasi, saab andmeallika juures kasutada sama ConnectionStringi
Et SQL-lause oleks ülevaatlikum, selleks märgin kõik tulbad eraldi.
Lisaks Advanced -nupu alt linnuke sooviga, et genereeritaks lisaks SELECT´ile ka INSERT, UPDATE ja DELETE-laused, ehk siis käsud, mille abil andmeid lisada, muuta ja kustutada. Neid lauseid lubatakse genereerida vaid juhul, kui andmebaasitabelis on primaarvõti määratud.
Jällegi väike test veendumaks, et andmed liiguvad
Ning edasi lehele juba GridView
Kuna andmeallikas rohkem SQL lauseid genereeritud, siis pakutakse ka rohkem võimalusi linnukeste panekuks.
Kui muutmis - ja kustutusõigus märgitud, siis võib lehel asuda vastavaid toiminguid tegema.
Valides muutmise, saab olemasoleva teksti asemele sobilikuma kirjutada ning vajutada, et nüüd on paras aeg muutused salvestada.
ning veenduda, et nad muudetuna ka veebilehel nähtavad on.
Soovides rakendust maakeelseks muuta, tasub koodist GridView seest üles otsida CommandField ning määrata tekstidele sobiv tõlge.

Andmete lisamine

Andmete lisamiseks lihtsaimad abilised on FormView ja DetailsView.
FormView tuleb sarnaselt eelmisele Toolboxist lehe peale sikutada. Kuna andsime oma andmeallikale ka andmete lisamise oskuse, siis saame kasutada sama andmeallikat.
Omaduste (Properties) alt tasub valida avanemiskujuks (DefaultMode) Insert
ning selle peale muudetakse komponendi kuju juba sisestuse jaoks sobivaks .
Avades lehekülje veebilehitsejas, saab tekkinud vormi kaudu uusi andmeid sisse kirjutada
ning rõõmustada selle üle, et need ka salvestuvad.
Taas mõningased täiendused lähtekoodis asendades inglisekeelseid sõnu eestikeelsetega ning juba näebki leht ilusam välja.
Et aga FormView satub generaator põhjalikumalt lahti kirjutama kui GridView, siis tuleb muutusi teha ka rohkem kui ühes kohas. Sellest aga varsti allpool.

Lähtekood

Mitmelgi moel on siinne leht koeralehega sarnane. Märkimist väärivad aga lisandused/muutused.
Kuna andmeallika loomisel palusime, et loodaks laused ka muutmise ja kustutamise tarbeks, siis on nad nüüd olemas. SELECT-lause enamvähem sarnane nagu enne. Juurde on tulnud aga kustutamise (DELETE), lisamise (INSERT) ja muutmise (UPDATE) laused. Tasub neile lausetele lähemalt peale vaadata, sest need neli SQL-lauset on vajalikud enamiku andmebaasiga seotud rakenduste juures. Lausetest leiab salapäraseid @-märgiga sõnu. Näiteks kustutamise tarbeks loodud lause näeb välja
DELETE FROM [kassidetabel] WHERE [id] = @id.
Too tagumine @id on parameeter, mis tuleb kusagilt rakenduse seest saada. Altpoolt piiludes näeb, et selline parameeter on eraldi välja toodud.
ja määratud, et tüübiks on Int32 ehk siis täisarv. Samuti leiab selle GridView juurest. Selle järgi teatakse, et kui kasutaja vajutab kustutusviidet, siis saadetakse andmebaasile käsklus, et selle id-ga rida tuleb kassidetabelist ära kustutada.
Sarnaselt määratakse parameetrid ka teiste lausete puhul.
Lisamiseks
INSERT INTO [kassidetabel] ([kassinimi], [kassimass])
VALUES (@kassinimi, @kassimass)
ehk siis kõigepealt tabeli nimi kuhu lisatakse, seejärel sulgudes tulpade nimed kuhu lisatakse ja pärast sõna VALUES need väärtused, mis sinna tegelikult lähevad. Et neil on @-märgid ees, siis saab tegelikud väärtused taas töö käigus ehk parameetritena sisse anda.
Muutmiseks
UPDATE [kassidetabel] SET [kassinimi] = @kassinimi,
[kassimass] = @kassimass WHERE [id] = @id
määratakse kõigepealt tabeli nimi. Edasi hakatakse ükshaaval määrama, milline tulp millise uue väärtuse saab. Nagu INSERT-lause puhul, nii ka siin ei anta id-le uut väärtust. Lisamises id puudub sootuks, see pannakse automaatselt. Muutmise juures näitab id, millist tabeli rida muuta.
Siin rakenduses käib kogu suhtlus GridView kaudu, aga keerukamal juhul võivad andmed tulla hoopis mitmest sisestusväljast, teiselt lehelt või näiteks programmikoodi kaudu.
FormView näeb lähtekoodis mõnikord välja üllatavalt pikk: kogu kujundus on pikalt välja kirjutatud ning seda annab hiljem soovi korral märgatavalt sättida. Kui pikemalt peale vaadata, siis paistab, et koodi saab eraldada mitmeks üsna iseseisvaks osaks.
Ehk siis FormView sees on eraldi mallid ehk Templated andmete muutmiseks, lisamiseks ja kustutamiseks. Kuna me praeguses rakenduses kasutame FormViewd ainult andmete lisamiseks, siis tegelikult teised on kasutud. Aga generaator genereeris nad ikka igaks juhuks kõik – mine tea mis programmeerijal pärast võib pähe tulla. Ja olemasoleva koodi vahele millegi automaatselt juurde panek võib juba hoopis keerukaks osutuda.
Lisamislõik on peaaegu tavaline viisakas HTML. Vähemalt sellena ta lõpuks veebilehitsejasse näidatakse. Kui eelnevat lehepilti siinse koodiga võrrelda, siis paistab, et kõik on olemas. Teade kassinimi koos kooloniga on ilusti tekstina nähtav. Element asp:TextBox genereeritakse HTMLi vastavaks elemendiks. Sõna Bind tekstikasti omaduse Text sees näitab, et selle tekstivälja (mille nimeks on kassinimiTextBox) tekst seotakse andmeallika (ning sealtkaudu ühtlasi ka andmetabeli) tulbaga, mille nimeks kassinimi. Praegu kasutatakse seda seost andmete lisamisel. Hiljem aga muutmise puhul seesama Bind aitab väärtusi andmetabelist veebilehele ja tagasi liigutada.
nagu tähendab HTMLis reavahetust veebilehel (tavaline reavahetus koodis seda ei põhjusta). Märgend   (non-breaking space) paneb sobivasse kohta tühiku.
Lõppu siis lisamise ja lisamiskatkestuse nupud. Element asp:LinkButton näeb välja nagu viide, aga tema külge saab programmitoiminguid siduda. Siinsel juhul siis on need toimetused peidus FormView sees. Kuna viimane on seotud SqlDataSource1-ga, siis lisamisnupu peale võetakse andmed tekstiväljadest, saadetakse andmeallika parameetritesse ning sealt edasi INSERT-lause abil andmebaasi.
kassinimi:
kassimass:
 
Ning lõpetuseks lähtekood tervikuna.
Kasside leht
id:
kassinimi:
kassimass:
 
kassinimi:
kassimass:
 
id:
kassinimi:
kassimass:
 
 
http://video.msn.com/video.aspx?vid=e8670aed-904d-4e81-8e23-2ee583f52655
Ülesandeid
  • Tee kasside näide otsast lõpuni läbi, veendu, et toimib
  • Loo leht matkale inimeste registreerimiseks. Igaüks saab end lisada (eesnimi, telefon, elektronpost), lisatud andmed on vaid vaatamiseks.
  • Kui oli eelnevalt tehtud matka tutvustav lehestik, siis seo lisamisvorm selle lehestikuga. Kui mitte, koosta eraldi paar lehte matka marsruudi ja päevakava tutvustuseks. Kasuta lehtedel ühist kujundusfaili.
  • Lisa eraldi administraatorileht, kus saab vigaseid sisestusi kustutada ja muuta, kuid mitte lisada. Administraatorilehele pääseb ligi vaid failinime teades – otsest viidet sinna teistelt lehtedelt pole.
  • Koosta veebilehestik paari Põhja-Eestis oleva joa tutvustusega. Kasutajad saavad lehtede vahele liikuda ning iga joa juures tekkinud muljete kohta kommentaare lisada. Kommentaarid on vastava joa lehel nähtavad. Administraatorile tulevad lehel ette kõik kommentaarid. Ta saab sealt ebasoovitavana tunduvaid kustutada.

Otsing

Andmebaasipõhine veebilehestik osutub vajalikuks näiteks juhul, kui tuleb leida vaid osa andmeid suurema hulga seast. Mõnikord piisab otsimisest sisukorrast, mõnikord aitab väike Javaskriptijupp mured lahendada. Aga kui andmeid on ikka tuhandeid, siis on serveripoolne abi tarvilik. Siin näitena teeme eelnevalt kokkupandud kassiloetelule juurde otsingu. Alustuseks uus eraldi ASP.NETi veebivorm ehk aspx leht. Kuna otsest programmikoodi tarvis pole, siis eraldi cs-koodifaili pole juurde vaja.
Et otsisõna kuhugi sisestada oleks, selleks sikutame veebilehele tekstikasti, milleks pannakse automaatne nimi Textbox1.
Andmebaasi juurde saab kasutada juba loodud ühendust, sest tegemist sama baasiga.
Andmete vaatamiseks jällegi kõigepealt „tavaline“ SELECT-lause
Otsingu puhul tasub eraldi WHERE-osas asuda piiranguid sättima. Avanevas aknas on selle jaoks loodud abivahend. Nime järgi otsingul tuleb tingimusega seotud tulbaks kassinimi. Operaator LIKE võimaldab leida selliseid nimesid, kus otsitav täht või lõik sees. Kust see lõik saadakse, määratakse järgnevast rippmenüüst. Veebilehel olevad elemendid (näiteks tekstiväli) käivad nimetuse alla Control. Valime lehel oleva ainukese tekstivälja ehk kasti nimega Textbox1. Alla tekib niimoodi automaatselt genereeritav SQL.
Pärast Add-nupule vajutamist jäetakse lisand alla ritta meelde.
Testimise juures tasub loodud piirang järele proovida. Püüame näha kasse , kelle nimes sisaldub m-täht.
Ning need nimed tulidki nähtavale.
Nüüd on andmeallikas olemas ja seadistatud. Vaja veel abivahend, kust kaudu andmed ekraanile kuvada. Tuttav GridView saab sellega täiesti hakkama kui talle lihtsalt me ainuke ehk sobiv allikas määrata.
Veebilehelt otsime sedakorda kõiki kassinimesid, kelle nimi sisaldab lõiku „iisu“. Ning nagu selgub, võibki neid vaadata.
Graafiliselt programm kokku lohistada on tore küll. Aga vahetevahel on kasulik, kui ka koodipoolelt ülevaade säilib – hiljem nii kergem vigu otsida ja muutusi teha. Allpool siis andmeallika kood. ConnectionString ikka sama. SELECT-lausele on juurde tulnud piirang WHERE ([kassinimi] LIKE '%' + @kassinimi + '%'). Teades, et protsendimärk tähistab suvalist sümbolite jada, saab tingimuse lahti seletada nõnda, et kassinimi peab olema kujul hulk suvalisi sümboleid (ülakomade vahel protsent), siis parameetrina antud kassinime osa ning edasi taas suvaliste sümbolite hulk.
Eraldi asp:SqlDataSource alamelemendina on plokk SelectParameters. ControlParameter’i kaudu antakse teada, et SQL-lauses @-märgiga kassinime väärtus saadakse tegelikult elemendi TextBox1 väljalt Text. Nõnda seotaksegi otsad kokku ja kasutajal võimalik andmeid otsida.
Mõnikord aga tahetakse otsida rohkem kui ühe tunnuse järgi. Või kord ühe ja kord teise järgi. Või mõnikord ka kõiki andmeid näha. Selleks teeme lehele teise sisestusvälja juurde, sedakorda kassi massi tarbeks.
Edasi lisame andmeallika juurde uue tingimuse. Ning vaikimisi väärtuseks paneme 0. Ehk kui lahtrisse otsingulahtrisse andmeid ei kirjutata, siis näidatakse kõiki kasse, kelle mass on suurem või võrdne nulliga.
Ja ongi ilusti kaks piirangut kõrvuti.
Samuti näha pikk SQL päring, kus kirjas nii tulpade nimed kui piirangud.
Kui massi ei piirata, näeb lehel kõiki sobiva nimeosaga kasse.
Piiramise korral aga ainult neid, kes filtrist läbi lähevad.
Et ka tekstide puhul sarnane omadus kehtiks, et tühja teksti puhul kõiki kasse näidataks, selleks tuleb kassinime parameetri juurde lisada omadus
ConvertEmptyStringToNull="false"
ehk siis
Muul juhul kiputakse tühi lahter muudetama eriliseks NULL-väärtuseks ning sellele vastavat nime ei leita. Kui aga tühi tekst jääb viisakalt tühjaks tekstiks ning protsendimärgid ütlevad, et selle ees ja taga võib olla suvaline hulk suvalisi sümboleid, siis tulemusena näidatakse tühja teksti puhul kõiki kasse. Ehk siis kogu andmeallika kood:
Ning ka veebilehel kõik kassid ilusti nähtaval.
Piirates aga nähtavaks ainult n-i sisaldavad nimed, näeb neid
Ning kui massi alampiiriks panna kaks kilo, siis näha ainult pontsakamaid isendeid.
Ning töötavad ka mõlemad piirangud koos.
Ülesandeid
  • Otsi üles või koosta uuesti matkale registreerumise vorm, kuhu inimesed saavad omi nimesid ja kontaktandmeid salvestada.
  • Loo võimalus inimeste otsimiseks mitmesuguste andmete järgi: näiteks eesnimi, perekonnanimi, sünniaasta (või nende vahemik), sugu.
  • Loo eraldi lehekülg, kus näidatakse ainult pärast aastat 2000 sündinud inimesi (vajalik muuta SQL-lauset, tekstivälja ega parameetrit pole vaja).
  • Võimalda otsingul sugu valida rippmenüüst (leia, milline rippmenüü (DropDownList) omadus sobib siduda SQL-lausega).

Lehe kaitsmine parooliga

Avalik ligipääs on lihtne ja hea, aga millegipärast ikka ei suudeta veel kõiki inimesi usaldada. Või ka mõnikord usaldatakse, aga pannakse ikka sahtlile või majale lukk ette – et kogemata ei tekiks kiusatust näiteks lapsel nõudepesuvahendit juua või naabrimehel öisel ajal uksega eksida. Ja ka iseenese eest on vahel kasulik mõned asjad luku taha panna – et tasub enne mitu korda järele mõelda, kas ikka on midagi õrna või ohtlikku vaja niisama kätte võtta.
Sarnane lugu ka veebilehtede juures. Kui andmete muutmise ja parandamise tarbeks tuleb eraldi sisse logida, siis pole karta, et kogemata andmeid vaadates mõne hiireklõpsu peale miskit paigast ära läheb.
Parooliga kaitstud andmete leht on leht nagu iga teinegi. Lehe loomisel on aga kasulik märkida, et soovime eraldi koodifaili: sinna saab hiljem paigutada kasutaja andmete sobivuse kontrolli.
Kui osa lehe sisust on parooliga kaitstud, siis tuleb määrata, mida näidata anonüümsele ehk sisselogimata kasutajale ning mida sisenenud kasutajale. Sellise valiku jaoks on loodud element nimega LoginView
Nagu aimata võib, on elemendi sees kaks suuremat plokki: AnonymousTemplate ning LoggedInTemplate.
Korraga mõlemat ei näidata. Sisu tuleb vastavalt sellele, kummas seisundis kasutaja on.
Anonüümsele kasutajale on tõenäoliselt viisakas pakkuda sissemeldimisvõimalust. Selle jaoks on olemas standardne element nimega Login, kus küljes kasutajanime ja parooli sisestamise kohad. Samuti paik andmete sobivuse kontrolliks koodiga.
Sisselogitule on viisakas teatada, kes ta on. Selleks sobib kontroll nimega LoginName. Et taas välja pääseks, siis aitab LoginStatus, miss sisselogitule vaikimisi pakub võimaluse „logout“.
Tere. Oled tundmatu kasutaja.
Oled kasutaja nimega
Kui rõõmsasti leht käivitada, siis teatatakse, et olen kasutaja nimega JAAGUP\Jaagup Kippar. Nuputan, et kus ta küll seda võis teada. Aga siis meenub, et olen vastava nimega masinasse selle tunnusega sisse loginud. Ehk siis kui pole määratud teisiti, kasutatakse ASP.NETi juures Windowsi kasutajaid ning nende õigusi. Nii et juhul, kui koolis/asutuses on juba välja mõeldud korralik Windowsi kasutajate/gruppide süsteem ning tahetakse ka veebis samu tunnuseid ja õigusi kasutada, on sealtkaudu toimetamine mugav. Kasutajanimed ja paroolid jäävad samaks, lisada vaid vaja lehed, mis sobivaid andmeid serveerivad.
Mõnikord aga ei pruugi veebikasutajad ja kohalikud kasutajad kattuda. Et veebirakenduses õnnestuks kohalikke kasutajaid teha, selleks tuleb muudatus teha failis nimega web.config.
Mõningase otsimise peale peaks sealt leidma rea
mis tasuks asendada reaga
ehk siis Windowsi kasutajate põhine autentimine asendatakse vormist sisestatud andmete põhjal autentimisega. Kui nüüd loodud leht avada, siis teatatakse, et tegemist on tundmatu kasutajaga – pole ju veel kuhugi kasutajanime ja parooli löödud. Ja ega sellest löömisest poleks ju ka kasu veel – sest kusagil pole kirjas, mis vastava nime ja parooliga peale hakata.
Sisenemistunnuste kontrolliks üks mugav viis on registreerida programmikood Login-kontrolli sisestusnupu külge. Tasub disainivaates LoginView puhul ette manada AnonymousTemplate mood koos seal sees oleva Login elemendiga. LoginView puhul saab rippmenüüst valida, kumba malli parajasti kasutatakse.
Edasi topeltklõps sisenemisnupul tekitab koodifaili sisse funktsiooni nimega Login1_Authenticate ning kirjutab ka nupu juurde kuuluvasse ossa, et nupuvajutusel tuleb vastav funktsioon käivitada.
Tekkinud kohale tasub siis paigutada koodijupp kontrollimaks, kas sisestatud andmed sobivad. Nagu näha, tuli funktsioonile ehk alamprogrammile kaks parameetrit. Esimene (sender, tüübist object) näitab, millisele elemendile vajutati, ehk siis mis on sündmuse saatjaks/allikaks. Teine (nimega e, tüübist AuthenticateEventArgs ehk siis autentimisega kaasas käivad argumendid) on mõeldud kohaks, kuhu koodiga teada anda, kas andmed sobisid.
Esialgu piirdume lihtsa kontrolliga. Et allikaobjektist saaks mugavasti andmed kätte, selleks püüame ta muutujasse tüübist Login, nimega sisestusvorm. Nii nagu arve ja tekste saab meelde jätta, nii kehtib see ka muude ligipääsetavate elementide kohta. Objektimuutujast küsime eraldi väljadena välja kasutajanime ja parooli ning võrdleme neid juku ja kalaga . Tingimusele järgi käitumiseks on C# keeles if-käsklus. Tingimus pannakse ümarsulgude vahele. Võrdlemiseks kasutatakse kahte võrdusmärki. Kui soovitakse, et mitu tingimust oleks tõese väärtuse jaoks korraga täidetud, siis pannakse tingimuste vahele kaks &-märki. Ja tõese vää vahele. Sedakorda määratakse siis saabunud argumendi omadus Authenticated tõeseks, et ASP.NETi serveerija teaks arvestada, et sisestatud nimega kasutaja on sisse loginud.
protected void Login1_Authenticate(
object sender, AuthenticateEventArgs e)
Login sisestusvorm = (Login)sender;
if (sisestusvorm. UserName == "juku" &&
sisestusvorm.Password == "kala")
Nagu ülal olevast näites näha pärinevad kõik ASP.NET lehed System.Web.UI.Page klassist, kus on realiseeritud raamistik, mis vajalik lehe genereerimiseks ning kontrollide kasutamiseks.
Tegelikult on üsna uskumatu, kui palju on võimalik ära teha deklaratiivselt ilma koodi e. .cs faili poole pöördumata. Samas on enam kui selge, et kui funktsionaalsus läheb natukenegi keerukamaks, tuleb ka programselt üht-teist korda saata.
Näiteks sellel samal lihtsal lehel on võimalik kirjutada kogu tekst dünaamiliselt koodi abil. Selleks eemaldame teksti .aspx failist:
Ning lisame selle koodi abil:
using System;
public partial class _Default : System.Web.UI.Page
protected void Page_Load(object sender, EventArgs e)
Page.Title = "Minu esimene leht";
lblTere.Text = "Tere maailm!";
Page_Load on sündmus, mis tekib iga kord lehekülje laadimisel . Selleks, et uurida genereeritava asp.net lehe omadusi saame ära kasutada Page objekti.
Staatilise teksti kirjutamiseks on kõige mugavam kasutada lipikuid (asp:Label). See võimaldab hiljem lihtsa vaevaga teksti kujundada. Iga objekt, mille poole soovite koodis pöörduda peab omama unikaalset ID’ d! Teksti saab lipikule lisada läbi Text atribuudi. Lipikud genereeruvad enamasti SPAN html tagideks.
Läbi kontrollide teksti kirjutamisel on üks oluline eelis võrreldes staatilise tekstiga – kontrollidel olevat teksti on lihtne koodis kasutada ning seda on võimalik lihtsa vaevaga lokaliseerida! Seega on alati soovitav kirjutada teksti veebilehele kas asp:label või mõne muu serveri kontrolli kaudu.
Ülesandeid
* Installeeri Visual Web Developer või leia enesele ligipääs IIS serverile
* Koosta ja käivita tervitav leht
* Määra lehel olev tervitus programmijupi abil.
* Küsi inimeselt nimi ja nupuvajutuse peale tervita teda, kopeerides tekst tekstiväljast sildile

Seadistamine (Web.config)

Igal veebirakendusel peaks olema ka oma seadistuste fail. ASP.NET rakenduse seadistust on võimalik seadistada üsna mitmest kohast. Alustades raamistiku üldseadistustest machine.config (paikneb .NET raamistiku programmifailide hulgas), seejärel veebisaidi seadistus e. web.config fail juurveebis ning lõpetades veebsaidi juurkataloogis oleva web.config failiga. Lisaks on võimalik erinevatele alamkaustadele eriseadistuse andmiseks võimalik lisada igasse kausta oma web.config fail.
Lõpuks jäävad kehtima need määrangud, mis on leheküljele kõige lähemal! Kuna masina seadistusele ja veebisaidi seadistusele meil enamasti ligipääsu ei ole siis püüame kogu vajaliku seadistuse ära teha veebirakenduse juurkataloogis oleva web.config faili abil.
.config failid on XML failid, milles antakse lisainformatsiooni nii rakendusele endale kui ka .NET raamistikule ja kompilaatorile.
Kõik väärtused/muutujad, mida soovite, et programmi kasutaja/administraator saaks hiljem lihtsalt muuta tuleks sisestada web.config faili!
Esialgu võiks web.config fail näha välja järgmine:
Selle seadistusega ütleme, et meil on kõik nii nagu serveris ikka, kuid me soovime oma rakenduse juures näha lisainfot silumiseks. Kui programm saab valmis, peaks panema debug atribuudi väärtuseks ”false”. Silumisinfo olemasolul kuvatakse teile vigade tekkimisel konkreetsed koodiread.
ASP.NET veebi seadistus on mitmekihiline ning esmased seadistused teie veebisaidile võetakse masina ( veebiserveri ) seadistustest. Seejärel lisandub juurveebi seadistus ning alles seejärel jõutakse teie veebi seadistusteni.
Lisaks oma veebi juurkataloogis olevale seadistusele võite teatud seadeid muuta ka alamkaustades. Selleks on teil kaks võimalust:
  • Lisada alamkasuta eraldi web.confog fail, kus on vastavad seaded ümber tehtud
  • Lisada veebi juurkataloogis olevasse web.config faili location element, ning näidata ära, mida soovite ümber teha. Sellekohast näidet saad vaadata leheküljel 496.

Rakenduse jälgimine (Trace)

Nii ASPi kui ka PHP suur puudus on see, et programmi silumiseks või vea leidmiseks vajaliku metainfo kuvamine on väga keeruline. Enamasti lõppeb see metainfo kirjutamisega otse lehele, rikkudes sellega ära lehekülje üldise väljanägemise.
ASP.NETil on selle tarbeks märksa mugavam vahend – Trace. Selleks, et jälgida ühel lehel toimuvat on kõige lihtsam Page elemendis sisse lülitada Trace atribuut.
Selle ühe väikse atribuudi lisamisega lisatakse lehekülje lõppu terve hulk informatsiooni alustades sellest, mis moodi seda lehekülge küsiti ning kirjeldades ära kogu lehekülje loomise protseduuri (koos lehekülje struktuuriga) ning lõpetades loeteludega erinevatest muutujatest ( sessioon , programm, server jne).
Loomulikult on võimalik sinna abiinfosse lisada ka oma märkuseid. Jälitusinfo kuvamiseks ja uurimiseks on Trace klass. Jälitus infot kirjutada saab kahe meetodiga:
  • Trace.Write – lihtsalt jutt jälitusinfosse
  • Trace.Warn – hoiatus (kuvatakse jälitusinfot vaadates punasena)
Lisame näiteks pisut jälitusinfot oma default.cs faili:
using System;
public partial class _Default : System.Web.UI.Page
protected void Page_Load(object sender, EventArgs e)
Trace.Write("Alustan Page_Load meetodiga ...");
Page.Title = "Minu esimene leht";
lblTere.Text = "Tere maailm!";
Trace.Warn("Meetod lõpetatud");
Tulemuseks on kaks uut rida Traces, Begin Load ja End Load sündmuste vahel:
Kui soovite mingi sündmuse ilmnemisel natukene põhjalikumat analüüsi teha siis on kasulik enne analüüsi alustamist kontrollida, kas jälitus on üldse sisse lülitatud. Selleks saame uurida Trace objekti IsEnabled omadust. Väga kasulik nt Try ... Catch konstruktsioonides:
protected void Page_Load(object sender, EventArgs e)
try
object o = null;
Trace.Write("Alustan Page_Load meetodiga ...");
Trace.Warn("Tekitan vea", o.ToString());
Page.Title = "Minu esimene leht";
lblTere.Text = "Tere maailm!";
catch (Exception ex)
if (Trace.IsEnabled)
Trace.Warn("error", "Tekkis tõrge", ex);
// TODO: Siia tuleks teha analüüs, miks viga tekkis
Tulemuseks trükitakse detailne vea kirjeldus jälitusinfo sisse:
Lisaks lehekülje põhisele sisse-välja lülitamisele on võimalik jälitusinfot kontrollida ka keskselt. Selleks tuleb vastav viide panna web.config faili system.web elemendi alamelemendiga trace:
Nüüd ei kuvata enam infot mitte iga lehekülje lõpus vaid virtuaalse veebilehe trce.axd abil veebirakenduse juurkataloogis:
Klõpsates iga päringu järel oleval View Details lingil kuvatakse meile info, mis varem oli lisatud lehekülje lõppu.
Trace elemendil on lisaks enable atribuudile veel teisigi mis võimaldavad selle info kogumist paremini korraldada. Näiteks võime öelda, et
  • jälitusinfo on nähtav ainult konsoolil (localhost) ja üle veebi seda ei serveerita localOnly = „true” (default)
  • nähtavale jäävad kõige viimased päringud mostRecent = „true”. Vaikimisi näidatakse esimest x päringut!
  • Sorteerime päringud ajalisse järjekorda traceMode=”SortByTime”
  • Jätame meelde 100 päringut (10 asemel) requestLimit=”100”
  • Korjame jälitusinfo trace.axd sisse mitte ei pane lehekülgede lõppu pageOutput=”false”

PS! Jälitusinfot hoitakse mälus ning see kustub koos rakenduse mälust eemaldamisega.
Ülesandeid
* Lülita lehel sisse Trace, tutvu saada oleva teabega
* Trüki lehe koodis trace-teateid, loe neid.
* Vaata trace-infot nii lehe alt kui eraldi lehelt.

Vigade haldamine

Ükskõik kui väga me ka ei püüaks ikkagi esineb programmis vigu, olgu nad siis tingitud asjaolude kokkusattumusest, programmeerijapoolsest lohakusest või kasutaja pahatahtlikkusest.
.NET raamistik koos ASP.NETiga pakub vigade haldamiseks üsna mitmekihilist süsteemi. Loomulikult tuleks vead kõrvaldada nii vara kui võimalik, kuid alati tuleb arvestada asjaoludega, et kõike pole võimalik ette ennustada ja midagi võib jääda kahe silma vahele! Seega tuleks igal kihil pakkuda mingit lahendust vigade haldamiseks.
Kui Te jätate mõne vea kinni püüdmata siis teeb seda lõpuks ASP.NET ise, kuid nagu arvata võite, ei pruugi sealt tulevad veateated kasutajatele meeldida.

Rakenduse veebist eemaldamine

Kui rakenduses ilmnevad suuremad tõrked või on vaja teha hooldustöid on kasulik veebirakendus ajutiselt „maha võtta” e. muuta kasutajatele kättesaamatuks. ASPi ajal oli ainukeseks arvestatavaks meetodiks , kas rakenduse ümbernimetamine või veebiteenuse peatamine. ASP.NET pakub aga väga mugavat alternatiivi – nimelt tuleb rakenduse maha võtmiseks lisada veebirakenduse juurkataloogi fail app_offline.htm. Fail peab kindlasti olema htm mitte html laiendiga! Faili sisse kirjutage teade, mida soovite saidi külastajatele anda.
Näiteks võiks kirjutada midagi järgmist:
Teenus ajutiselt suletud

Teenus ajutiselt suletud!


Vabandame, seoses hooldustöödega ei ole veebirakendus hetkel kättesaadav.
Püüame probleemi kõrvaldada nii kiiresti kui võimalik.
Ootame teid peatselt tagasi!
Kui soovite rakenduse taas käima panna siis võib selle app_offline.htm faili ära kustutada või ümber nimetada.
Failide veebist väljaarvamiseks võib neile kirjutada .exclude laiendi . Sellise laiendiga faile veebi ei serveerita. Tulemuseks on HTTP error 403 (Page not served).

Globaalne veakontroll

Globaalne veakontroll on viimane kontrollliin enne raamistikku ning võimaldab reageerida vigadele vastavalt HTTP veakoodidele. Veakontrolli sisselülitamiseks tuleb web.configi system.web sektsiooni lisada customErrors element. Kõige lihtsama lahenduse jaoks on vaja moodustada üks lehekülg, mis hakkab kas viga programselt haldama või kuvab kasutajale mingi viisaka teate.
customErrors elemendil on kaks atribuuti:
  • mode näita, kuidas vea puhul käituda (On – näidata kõigile oma veateadet, Off – näidata kõigile süsteemset veateadet, RemoteOnly - näidata konsoolilt pöördujatele süsteemset veateadet ja teistele kohandatud veateadet8.
  • defaultRedirect näitab, kuhu kasutaja suunata, kui midagi konkreetsemat pole öeldud
Nt järgnev rida web.configis ütleb, et kui tekib mingi tõrge tuleb kasutaja suunata lehele error.html.
Kui soovite teatud HTTP vigade puhul anda mingi konkreetsema teate siis saate lisada customErrors elemendi alla täiendavad error elemendid.
Näiteks järgmise seadistusega ütleme, et kui tuleb HTTP viga 404 suuname kasutaja lehele error404.html, kui tuleb HTTP error 500 suuname kasutaja lehele error500.html, kui tuleb mingi muu viga suuname kasutaja lehele error.html.

Keskne veakontroll

Globaalsetele sündmustele saab reageerida globaalses koodifailis global .asax. Veakontrolli tarbeks on seal meetod Application_Error, mille sisse võite kirjutada oma vea haldamise protseduuri.
Application_Error meetod käivitatakse, kui programmis tekib viga, mida leheküljel ära ei lahendata. Tegemist on viimase programse võimalusega tekkinud vea viisakaks lahendamiseks.
Vea haldamiseks tuleb ära kasutada Server objekt. Server.GetLastError() annab tagasi Exception tüüpi objekti viimase veaga. Sealt saate teada missuguse veaga oli tegemist.
Peale seda kui olete pakkunud veale mingi viisaka lahenduse saate öelda, et viga on lahendatud kutsudes välja Server.ClearError() meetodi.
Nt moodustame järgmise global.asax faili:
void Application_Error(object sender, EventArgs e)
Response.Write("Tekkis viga
");
Response.Write(Server.GetLastError().Message);
Server.ClearError();
Response.Write("
Lahendasin ära ...");
Kui nüüd mõni leht tekitab vea, mida kohapeal ära ei lahendata (nt all olev protseduur) siis käivitub keskne veakontroll ning ASP.NETi süsteemset veateadet kasutajale ei näidata.
using System;
public partial class Default6 : System.Web.UI.Page
protected void Page_Load(object sender, EventArgs e)
object o = null;
Page.Title = "Globaalse veakontrolli test";
lblTere.Text = o.ToString();

Veakontroll lehel

ASP.NET leheküljele leheküljekeskse veakontrolli paigaldamiseks tuleb leheküljele lisada Page_Error meetod. Page_Error meetod on mõeldud olukordade jaoks kus viga ei ole võimalik meetodite siseselt kinni püüda ja lahendada või kui soovite pakkuda lehekülje lõikes keskset veakontrolli.
Vea uurimiseks on võimalik kasutada taas (nagu ka veakontrollis global.asax failis) Server objekti.
protected void Page_Error(object sender, EventArgs e)
Kui soovime, et meie default.aspx kasutaks seda pealehte, tuleb teha paar muudatust : lisada Page elemendi atribuutidesse MasterPageFile atribuut, nii et Page element näeb välja järgmine:
Viidates ASP.NET rakendustes teistele failidele, kasutatakse tihtipeale faili absoluutset aadressi rakenduse kausta suhtes. Rakenduse juurkaustale viitamiseks kasutatakse tildet „~” e. kui me vaatame ülal olevat näidet, siis paikneb fail tavaline.master rakenduse juurkataloogis.
Lisaks muudatusele lehekülje Page elemendi atribuutides, tuleb ära kustutada kõik, mis asub form elemendist väljaspool, kaasaarvatud form elemendi alustavad ja lõpetavad tagid. Selle asemele tulevad piirkonnad pealehelt. Seega näeb ülejäänud default.aspx välja järgmine:
Lehekülje koodis mingeid muudatusi teha ei tule.
Kui soovite kasutada mõnda pealehel olevat elementi või omadust aspx lehel, siis leiate lehe küljes oleva pealehe Page.Master omaduse alt. Samas pole see omadus otse kasutatav. See tähendab, kui näiteks teie pealehel on omadus jutt, siis ei ole võimalik seda muuta näiteks sellise lausega Page.Master.jutt = „mingi jutt”. Selleks, et saada ligi pealehe omadustele ja sealolevatele elementidele, tuleb Master all olev objekt teisendada õigesse tüüpi. Seega kui teie pealehe taga oleva klassi nimi on MinuPealeht, siis tuleks seal oleva omaduse jutt muutmiseks kirjutada järgnevalt:
((MinuPealeht)Master).jutt = ”mingi jutt”;
http://video.msn.com/video.aspx?vid=daa5ce9b-8c0f-40c8-adbf-e71784c4d9cd

Elemendid lehel

Lehekülje loomisel on meil võimalus kogu töö teha ära kasutades ASPist tuntud Response.Write meetodit, genereerides rea kaupa kliendile mineva HTMLi, kuid saame kasutada ka erinevaid kontrolle.
Elemendid võimaldavad läheneda leheküljele objekt-orienteeritud põhimõtteid kasutades. Elemente, mida kasutada, on lugematul hulgal. Suur hulk neist on kaasas koos .NET raamistikuga, väga palju saab tõmmata Internetist (osad on tasuta, osad tasulised) ning loomulikult on neid võimalik ka ise kokku panna.
Loomulikult ei jõua me siinkohal vaadata kõiki võimalikke kontrolle väga detailselt, kuid püüame anda ülevaate olulisemast ning sellest, mida kus ja kuidas kasutada.

Standardsed serveri elemendid

Alustame standardsete ASP.NET elementidega. ASP.NET Server elemendid on põhilised abivahendid veebirakenduste loomisel. Serveri elementidel on loogiline ja lihtsalt kasutatav objektmudel ning lisaks sellele oskab raamistik neid sõltuvalt kliendi veebisirvija võimekusest renderdada erinevateks HTML tagideks.
Standardsed ASP.NET kontrollid tunnete ära sellejärgi, et nende nime eesliide on asp:. Kõigil kontrollidel peab kindlasti olema täidetud:
  • runat=”server” atribuut, mis näitab, et kontroll tuleb renderdada serveris
  • ID atribuut, mis on selle kontrolli unikaalne tunnus. ID kasutatakse kontrolli poole pöördumiseks nii märgistuses kui ka koodis. Kõik ID peavad lehekülje piires olema erinevad!
Järgnevalt standardsete serverielementidele lühikirjeldused koos näidetega:
AdRotator
Näitab ühe kaupa, juhuslikus järjekorras andmeballikast leitud pilte. Kasulik nt banneri loomisel
BulletedList
Täppidega loend andmebaasis olevatest andmetest
Button
Nupud on mingite kasutaja poolt algatatavate tegevuste tegemiseks. Nupuvajutusele reageerimiseks tuleb realiseerida OnClick sündmus.
Calendar
Tekitab kalendri, mille pealt saab kasutaja valida kuupäeva. Kuupäeva kasutamiseks tuleb pöörduda kalendri SelectedDate atribuudi juurde
CheckBox
Tekitab märkeruudu, mille väärtust saate edaspidi kasutada läbi Checked atribuudi.
CheckBoxList
Tekitab märkeloetelu ruutude loetelu, kust on kasutajal võimalik valida mitmeid. Esimese valiku leidmiseks saate kasutada SelectedIndex, SelectedItem või SelectedValue atribuute. Kõigi valikute leidmiseks tuleb läbi käia Items kollektsioon ning kontrollida iga valiku Checked atribuuti.
DropDownList
Ripploend andmeallikast leitud andmetest. Valitud väärtuse leidmiseks saab kasutada SelectedIndex, SelectedItem või SelectedValue atribuute.
FileUpload
Võimaldab faile ülesse laadida. Kasutaja poolt valitud faili leiate PostedFile atribuudi alt. Faili saab kätte andmevoona PostedFile.InputStream atribuudist.
HiddenField
Peidetud väli, kus on võimalik hoida teksti, mida kasutajale näidata ei soovi.
HyperLink
Hüperlink, kus lingina võib toimida nii tekst kui ka pilt.
Image
Pilt, mis renderdub HTMLi IMG tagiks.
ImageButton
Pilt, mis reageerib hiire klikile e. töötab nagu tavaline nupp.
ImageMap
ImageMap tekitab pildi, millel on erinevaid piirkondi, kuhu kasutaja saab klõpsata. Klõpsatavate piirkondade tekitamiseks tuleb ImageMap elemendi sisse panna HotSpot alamelemendid. CircleHotSpot tekitab ringi kujulise piirkonna, RectangleHotSpot tekitab ristkülikukujulise piirkonna, PolygonHotSpot tekitab hulknurgakujulise piirkonna.
Kui keegi klikib mingil piirkonnal siis on võimalik, kas suunata nii uuele aadressile kui ka programselt klikki hallata. Programse haldamise jaoks tuleb ära realiseerida Click sündmus, kus on võimalik vaadelda parameetriga kaasa antud PostBackValue omadust
Label
Label on konteiner lehele dünaamilise sisu tekitamiseks. Selliseid konteinereid on kokku neli: Label, Literal, Panel, PlaceHolder.
Labeli peale saab panna staatilist teksti ja ka lihtsamaid HTMLi tage kuid pole võimalik lisada dünaamiliselt serveri kontrolle.
Label renderdub veebisirvijas SPAN tagiks.
LinkButton
Hüperlink, mis töötab nupuna e. kui hiirega klõpsata ei minda mitte uuele lehel vaid tekitatakse Click sündmus.
ListBox
Loend väärtustest, kust sõltuvalt seadistusest on võimalik valida, kas üks või mitu väärtust e. sõltuvalt seadistusest käitub analoogselt RadioButtonList’iga või CheckBoxList’iga. Kõige olulisem erinevus seisneb selles, et pikk loetelu on võimalik kokku suruda väga väiksele alale .
Literal
Literal on konteiner lehele dünaamilise sisu tekitamiseks. Selliseid konteinereid on kokku neli: Label, Literal, Panel, PlaceHolder.
Literal erineb Label elemendist selle poolest, et ta ei lisa dünaamilise sisu ümber mingit lisamärgistust. Sellest tulenevalt ei ole võimalik sisu stiilidega kujundada.
Localize
Erinevalt Literal kontrollist võimaldab Localize kontroll reserveerida koha lokaliseeritud sisu tarbeks. Muus osas on need kaks kontrolli täiesti ühesugused.
Erinevalt Label kontrollist ei lisa Localize sisu ümber mingit märgistust ega võimalda ka sisu kujundamist.
MultiView
Mingid asjad, mida näidata esimeses vaates
Mingid teistsugused asjad teises vaates näitamiseks
MultiView võimaldab teha leheküljel oleva info vaatamiseks erinevaid vaateid. Vaateid saab vahetada saab valida nii märgistuses kui ka programselt ActiveViewIndex atribuudi abil. Sisuliselt võimaldab MultiView integreerida ühele ASP.NET lehele mitmeid analoogseid veebilehti.
Panel
Panel on konteiner lehele dünaamilise sisu tekitamiseks. Selliseid konteinereid on kokku neli: Label, Literal, Panel, PlaceHolder.
Erinevalt Label ja Literal kontrollidest on võimalik sinna sisse paigutada ka teisi serveri kontrolle.
Panel kontroll paneb kogu dünaamilise sisu kas div või table elemendi sisse.
PlaceHolder
PlaceHolder on konteiner lehele dünaamilise sisu tekitamiseks. Selliseid konteinereid on kokku neli: Label, Literal, Panel, PlaceHolder.
PlaceHolder võimaldab analoogselt Panel kontrolliga lisada dünaamilisi teisi serveri kontrolle kuid erinevalt Panel elemendist mingit lisamärgistust nende ümber ei lisata.
RadioButton
Raadionupp võimaldab teha ühe valiku ette antud loetelust. Kui lehel on mitmeid loetelusid mitu on võimalik raadionupud jagada gruppidesse.
RadioButtonList
RadioButtonList võimaldab andmebaasis olevatest andmetest tekitada raadionuppudega loendi, kust saab valida ühe valiku.
Substitution
Substitution kontroll märgistab ära koha, mida puhverdatud (cached) lehel dünaamiliselt uuendatakse. Dünaamilise sisu peab tekitama staatiline, meetod, mis tagastab stringi.
Table
A veerg
B veerg
Lahter A1
Lahter B1
Lahter A2
Lahter B2
Table kontroll võimaldab tekitada tabeli, mida on võimalik väga lihtsalt programselt hallata. Eriti kasulik on see struktuur juhul kui soovite tabelit moodustada koodi abil, mitte lehekülje märgistuses.
TextBox
TextBox on kast, kuhu kasutaja saab sisestada mingit teksti. Tekstikaste on võimalik teha nii ühe kui ka mitmerealisi ning peidetud tekstiga paroolikaste. Sisestatud teksti saab hiljem kätte Text atribuudi alt.
View
Mingid asjad, mida näidata esimeses vaates
View kontrolle saab lisada ainult MultiView kontrolli sisse. Tegemist on ühega paljudest vaadetest MultiView sees.
Wizard
Mingi esimese sammu sisu
mingi teise sammu sisu
Võlur on sarnane MultiView kontrolliga võimaldades luua samadest andmetest mitmeid vaateid. Erinevalt MultiView’st on võluris ette määratud liikumise loogika ning info paigutus .
Võlureid on võimalik kasutada nii töövoogude (WorkFlow) kui ka pikemate vormide juures, kus on võimalik infot jagada mitmele lehele.
Võlur on mõeldud suuremahuliste sisestuste haldamiseks, näiteks küsitlused. Selle asemel, et kõik väljad koondada ühele lehele, võimaldab võlur tekitada mitu lehekülge andmete sisestamiseks, mille vahel võib kasutaja liikuda vastavalt vajadusele, kas lehtede järjekorras või vabal valikul.
Xml
Xml kontroll võimaldab veebilehel kuvada XML andmeid ja seda nii toorel kujul kui ka teisendatud kujul.
Loe lisaks ka XMLi peatükki.
Dünaamiliselt sisu tekitamisel on soovitus eelistada Literal või Localize kontrolli Labelile ning PlaceHolder kontrolli Panel kontrollile.

Programselt hallatavad HTML elemendid

Kui HTML elemendile lisada atribuut runat=“server“ siis on HTML elemendid programmis kasutatavad analoogsed Serveri elementidega. Erinevus võrreldes serveri elementidega seisneb selles, et nende objektmudel on moodustatud DHTMLi baasil ning nende haldamine ei ole nii lihtne kui serveri elementide puhul. Samuti ei oska .NET neile pakkuda alternatiivseid renderdusi sõltuvalt veebisirvija võimekusest.

Sisendi kontrollimise elemendid (Validators)

Kõige rohkem tööajal tekkivatest vigadest ja ka rakenduses olevatest turvaaukudest on tingitud kasutajate poolt tehtavatest ootamatutest sisestustest. Validation kontrollid on mõeldud kasutaja poolt sisestatud info kontrollimiseks ning on väga olulised vormide ehitamisel .
Kontrollimine käib enamasti kahes etapis :
  • Kontrollitakse, kliendi poolel ehk veebisirvijas, javascripti abil, kas andmed on korrektsed. See võimaldab anda kasutajale märksa kiiremaid vastuseid kui tehes sama kontrolli serveris.
  • Kontrollitakse serveris, kas kõik on korrektne. Kaitseb teie veebirakendust vigaste sisestuste eest. Kui kasutaja väga tahab, siis võib ta JavaScripti välja lülitada ning sellisel juhul kliendipoolne kontroll ei toimi. Teile on aga oluline, et andmed oleksid korrektsed ennem kui Te hakkate neid edasi töötlema. Seega on serveri poole kontroll väga oluline. Enamgi veel - kliendi poolsest kontrollist on võimalik loobuda aga serveris tuleb alati kontrollida, muidu muutub loodav veebrakendus väga ebastabiilseks ning ohtlikuks.
Kõigil validaatoritel on mõned olulised omadused, mis peaks olema alati määratud:
  • Display – kas kontrolli positsioonil reserveeritakse veateate jaoks ruum või mitte
  • ControlToValidate – kontroll, mida validaatoriga valideerida
  • ErrorMessage – täispikk veateade. Näidatakse juhul kui kontroll ebaõnnestub
  • SetFocusOnError – kas vea puhul muudetakse vea põhjustanud kontroll aktiivseks
  • Text – lühike veakirjeldus. Näidatakse juhul kui kontroll ebaõnnestub
  • ValidationGrupp – juhul kui samal lehel on mitu iseseisvat andmekogumit on võimalik ka kontrollid jagada gruppidesse ning kontrollida iga gruppi eraldi.
RequiredFieldValidator
Kontrollib, et väli oleks täidetud.
RangeValidator
Tunneb erinevaid andmetüüpe ning kontrollib, et sisestatud väärtus oleks etteantud vahemikus.
RegularExpressionValidator
Kontrollib sisestuse sobivust regulaaravalisega
CompareValidator
Võrdleb sisestust teise kontrolli sisuga. Kasulik nt paroolivahetuse vormi juures, kus tuleb uut parooli sisestada kaks korda
CustomValidator
Ise tehtud validaator. Kontrollib täpselt nii nagu ise soovid.
Validaatorit ehitades tuleb kindlasti realiseerida ServerValidate sündmus ning kui soovite ka veebisirvijas kontrolli rakendada siis JavaScripti abil ka kliendi poolne kontroll. JavaScripti funktsiooni nime saate sisestada ClientValidationFunction atribuudile.
ValidationSummary
Kokkuvõte vigadest. Kui lehel on ValidationSummary kontroll siis validaatori positsioonil näidatakse lühikest veakirjeldust (Text atribuut) ning ValidationSummary näitab pikka vea kirjeldust (ErrorMessage atribuut).
Selgitavaks näiteks siia juurde ülalpool andmebaasipõhise rakendusena kasside lisamislehe juurde kuuluv kontroll, et kassinimi oleks olemas ning kassi mass kassile sobilikus vahemikus.
kassinimi:
kassimass:
Nagu näha, ei saa lisamata jätta kassi nime.
Samuti peab olema kassi mass mõistlikus vahemikus nagu ülalt koodist MinimumValue ja MaximumValue vahelised piirid määravad.
Ülesandeid
* Katseta mitmesuguseid kontrolle.
* Püüa nende väärtusi programmiga lugeda ja kätte saada.
* Kontrolli validaatori abil, et tekstiväli oleks täidetud

Navigeerimiselemendid

Navigeerimiseks mõeldud serveri kontrollid pakuvad mugavaid veebirakenduses navigeerimise võimalusi. Navigaatoreid on kokku kolm.
SiteMapPath
SiteMapPath näitab kasutajale loogilist paiknemist veebirakenduse struktuuris. Paiknemist näidatakse analoogselt URLile või failisüsteemis kataloogiteekonnale.
SiteMap kasutamiseks tuleb veebi juurkataloogi lisada web.sitemap fail, milles kirjeldate ära veebi loogilise struktuuri. Web.sitemap on XML fail, mis vastab SiteMap-File skeemile (schema). Faili sisu võiks siis välja näha midagi sellist:
Sitemap failis peab ära kirjeldama kõikide lehekülgede loogilise positsiooni, kuhu kasutaja võib sattuda. Vajadusel saab seal pakkuda isegi erinevaid lahendusi vastavalt URLis nähtavatele parameetritele.
Kuna veebisirvija Back nupu programne haldamine on väga keeruline siis kasutatakse tagasi liikumise võimaldamiseks enamasti SiteMapPath kontrollil baseeruvat struktuuri. Mõnikord kutsutakse sellist navigeerimisvahendit ka leivapuruks (kunstmuinasjutu järgi, kus leivapuru järgi püüti koju tagasi minna).
Menu
Menüü võimaldab kasutajal lihtsalt leida veebirakenduses olevat informatsiooni. Menüü sisu on võimalik sisestada nii staatiliselt (nagu on näha ülalolevast näitest), kui ka lugeda andmebaasist.
TreeView
TreeView võimaldab vaadelda hierarhilisi andmeid puu kujul. Puud on võimalik moodustada nii staatiliselt (nagu näha ülal olevast näitest) kui ka moodustada dünaamiliselt andmebaasis olevate andmete järgi.
Ülesandeid
* Koosta menüüga pealeht (master) ning sealt viited mitmele alamlehele
* Lisa lehestikus asukohta näitav SiteMap
* Paiguta lehestiku lehed mõttes puukujulisse struktuuri. Aita navigeerimisel kasutajat TreeView-ga

Omaloodud elemendid (UserControl)

Lisaks pealehtedele saab programmiloogikat jagada ka läbi isetehtud graafilise kasutajaliidese elementide (User Controls) e. kasutaja kontrollide (KK). KK on ASP.NET leht ASP.NET lehe sees. KK abil saab kapseldada mingite graafilise liidese elementide kooslust ning funktsionaalsust.
Näiteks lisame oma veebilehele lisaks sildile veel tekstikasti ja nupu ning ütleme, et me soovime reageerida sündmusele, kui keegi klikib sellel nupul. Peale seda väikest täiendust näeb default.aspx content elemendi sisu välja järgmine:
Nüüd tuleb teha ka väikesed täiendused lehekülje koodis default.aspx.cs. Esmalt muudame ära Page_Load sündmuse, kus ütleme, et kui sellele leheküljele tullakse 1. korda, siis tuleb labeli sisu ära kustutada. Kui sama sessiooni ajal tullakse lehele 2st, 3ndat jne korda, siis ei tehta midagi. Lehekülje objekti küljes olev omadus IsPostBack on true, kui ei olda lehel esimest korda.
protected void Page_Load(object sender, EventArgs e)
if (!Page.IsPostBack)
lblInf.Text = "";
Lisaks peame tekitama protseduuri nupu klikile reageerimiseks. Kui keegi klikib nupule, siis muudame ära labeli teksti vastavalt tekstikastis olevale jutule.
protected void bOK_Click(object sender, EventArgs e)
lblInf.Text = "Sa kirjutasid tekstikast: " + txtKast.Text;
Kui me nüüd avastame, et sellist tekstikasti, labeli ja nupu interaktiivset kooslust läheb meil ka mujal vaja, siis on mõistlik see funktsionaalsus realiseerida KK abil. KK lehed e. .ascx lehed on oma ülesehituselt väga sarnased .aspx lehtedega seega on üsna tavaline, et esmalt realiseeritakse mingi funktsionaalsus .aspx lehel ning seejärel teisendatakse see leht KK-ks.
KK-l on võrreldes .aspx lehega 4 erinevust:
  • faililaiend on .ascx
  • Page element on asendatud Control elemendiga, millel on peaaegu samad atribuudid.
  • kuna tegemist on osaga lehest, siis ei saa seal kasutada ei form elemente ega content elemente
  • KK taga olev klass päritakse System.Web.UI.UserControl klassist
Seega võiks meie kolme komponendiga kk.ascx näha välja järgmine:
Ning kood selle KK juures (failis kk.ascx.cs) näeks välja selline:
using System;
using System.Web.UI;
public partial class kk : System.Web.UI.UserControl
protected void Page_Load(object sender, EventArgs e)
if (!Page.IsPostBack)
lblInf.Text = "";
protected void bOK_Click(object sender, EventArgs e)
lblInf.Text = "Sa kirjutasid tekstikast: " + txtKast.Text;
Selleks, et oma värskelt loodud KK’d kasutada, peame selle paigutama mõnele aspx lehel. Kuna tegemist ei ole raamistikku kuuluva elemendiga, tuleb see esmalt registreerida. Selleks lisame lehekülje algusesse peale Page elementi ning enne igasuguseid teisi elemente Register elemendi, milles ütleme, millises failis meie KK paikneb, ning kuidas me soovime temale viidata.
Ning kohas, kus see KK peab paiknema, lisame vastava kirjeldusega elemendi:
Antud juhul võiks selleks kohaks olla Content element default.aspx lehel. Kuna kogu eelnev funktsionaalsus sai KK’sse üle viidud, siis võiks kogu ülejäänud sisu Content elemendi seest ära kustutada. Ühtlasi tuleks kustutada ka kogu kood default.aspx.cs seest e. alles jääb vaid tühi klass.<
Sama KK’d võib ühel ja samal lehel kasutada mitmes eksemplaris ning samuti võime selle KK registreerida nii mitmele lehele kui soovime.
Seega võiks kokkuvõtteks öelda, et läbi pealehtede MasterPage ühtlustame üldise elementide paigutuse aspx lehtedel. KK abil kapseldame kasutajaliidese elementide kooslust.
Ülesandeid
* Kasuta näites loodud kasutajakontrolli oma lehel
* Loo kontroll kahe arvu korrutamiseks. Katseta.

Veebilehtede kujundamine kasutades nägusid (Themes)

Üldiselt on tuntud tõde, et hea programmeerija ei ole tavaliselt hea disainer ning hea disainer ei ole enamasti hea programmeerija. Luues aga veebirakendust, on vaja, et hästi oleks tehtud nii disain kui ka funktsionaalsus. See tähendab aga seda, et ühe veebilehega tegelevad korraga kaks inimest. Juba ASP.NET esimeses versioonis oli võimalik kood ja kujundus üksteisest eraldada (aspx fail kujunduse ja paigutuse jaoks, .cs fail koodi jaoks), kuid sellel lähenemisel oli kaks nõrka kohta:
  • Läbi aspx faili ei saa kujundada dünaamiliselt tekitatud objekte
  • Ühtse kujunduse hoidmine on raske, kuna kujundust tuleb igas aspx failis iga kontrolli juures uuesti korrata.
Üks lahendus on kasutada vana head stiilifaili .css, kuid raamistiku poolt genereeritud HTML objektide stiiliga kujundamine on üsna raske. Raskeks teeb selle asjaolu, et genereeritud struktuurid võivad tulla väga keerulised ning aeg-ajalt on väga raske ennustada, milliseks HTML objektiks üks või teine kontroll renderdub.
Lahendusena neile probleemidele pakub ASP.NET 2.0 välja näod e. Theme ’d. Ühe näo alla koondatakse hulk kujundusi, mida on mugav tervele lehele peale panna. Nägu koosneb kahte liiki kujundustest:
  • nahad ( skin ), on mõeldud serveri kontrollide kujundamiseks
  • stiilid (css), on mõeldud HTML tagide kujundamiseks
Kõik näod tuleb paigutada veebi juurikas asuvasse App_Themes kausta. Sinna tuleb teha alamkaust iga vajaliku näo jaoks. Loodud alamkaustadesse saate hakata paigutama .skin ja .css faile.
Loome nt näo nimega DefKujundus ning selle alla naha nimega nahk.skin. Naha sisse saate kopeerida .aspx failist kogu kujunduse. Näiteks on meil vaja kujundust tabelivaatele ja kahele erinevale kalendrile. Sellisel juhul võiks nt nahk.skin näha välja järgmine:
Nagu näha, on nahas olevad serveri elemendid peaaegu samasugused kui .aspx lehel. Ainukeseks erinevuseks on see, et kogu funktsionaalne osa on eemaldatud , so igasugused meetodid sündmustele reageerimiseks jne. Kujundusi saame teha kahte moodi:
  • peakujundus – serveri kontroll, millel puudub kujunduse ID
  • spetsiaalkujundus – serveri kontroll, millele on lisatud atribuut SkinID. Vastavad SkinIDd peavad olema samad nii aspx failis kui ka .skin failis.
Kui me soovime seda nahka kasutada oma .aspx lehe kujundamisel, siis tuleb meil:
  • lisada lehekülje päisesse (Page element) atribuut Theme=”DefKujundus”
  • kustutada kõigilt serveri kontrollidelt kõik kujundusega seonduv
  • kontrollidele, mis vajavad spetsiaalkujundust, lisame atribuudi SkinID
Tulemusena on ilus ja lihtne aspx fail, kus on ainult funktsionaalsust puudutavad määrangud.
Ülesandeid
* Lisa Themes kausta kujundus SinineKujundus, milles määratakse nupu (asp:Button) värv siniseks.
* Katseta seda oma lehel, määrates näo (Theme) lehe algul
* Lisa teine kujunduskaust PunaneKujundus, kus nupu värv määratakse punaseks
* Veendu, et kujunduse vahetamisel muutub nupu värv.
* Püüa kujundust muuta programmi abil (Page.Theme="PunaneKujundus"). Seda on võimalik teha lehe preInit meetodi juures.

Väärtuste tööaegne meelespidamine

Muutuvate väärtuste meeles pidamiseks on lugematul hulgal erinevaid võimalusi alustades lokaalsetest muutujatest ning lõpetades andmebaasiga. Järgnevalt vaatleme vahendeid, mida pakub ASP.NET

Veebi globaalsed muutujad ( Application variables)

Läbi Application klassi on võimalik jagada infot kõikjale terves veebirakenduses: see info on saadaval kõigil lehtedel terves rakenduses sõltumata sellest, milline kasutaja neid vaatab.
Application klassi väärtuse salvestamine käib järgmiselt:
Application[”ProgrammiMuutujaNimi”] = ”Mingi väärtus”;
Lugemine käib loomulikult vastupidises omistamisega, kuid lugemisel tuleks alati arvestada asjaolu, et võib-olla ei ole seda muutujat veel tekitatud või ei ole sinna veel ühtegi väärtust salvestatud. Seega tuleks lugemisel esmalt kontrollida, kas üldse on midagi lugeda:
Object oAppVar = Application[”ProgrammiMuutujaNimi”];
if (oAppVar != null)
Label1.Text = (string)oAppVar;
Sellised globaalsed muutujad on kasulikud jooksva statistika nt aktiivsete külastajate arvu jms tarbeks.
PS! Kõiki globaalseid muutujaid hoitakse arvuti mälus e. nendes muutujates ei tohiks hoida suuri andmehulki nagu nt tabelid jms

Andmete puhverdamine ( Cache variable)

Application klass ei ole hea koht suurte andmehulkade hoidmiseks, kuna see raiskab palju arvuti mälu.
Cache klassi kaudu on samuti võimalik jagada infot kõikjale terves veebirakenduses: see info on saadaval kõigil lehtedel terves rakenduses sõltumata sellest, milline kasutaja neid vaatab. Info säilib Caches kuni arvutil jätkub ressurssi info hoidmiseks või kuni teie poolt määratud ajani.
Kõige lihtsam meetod Cache väärtuse salvestamiseks on järgmine:
Cache[”CacheMuutujaNimi”] = ”Mingi väärtus”;
Sellisel kujul salvestatud info säilib mälus kuni ressurssi jätkub, st kui arvuti vaba mälu hulk muutub kriitiliseks, visatakse vähem kasutatud andmed mälust välja. Kui soovite neid andmeid veel kasutada, tuleb andmed uuesti mällu laadida.
Mälust kustutamise aega saame ka ette määrata. Selleks on kaks võimalust: absoluutne aegumise aeg ja dünaamiliselt muutuv aeg.
Absoluutse aegumise aja kasutamiseks tuleb väärtuse Cache salvestamiseks kasutada Cache.Add või Cache.Insert meetodit.
Järgnevalt lisame info cache' i täpselt kümneks minutiks:
Cache.Insert("CacheMuutujaNimi", "Mingi väärtus", null,
DateTime.Now.AddMinutes(10),
System.Web.Caching.Cache.NoSlidingExpiration);
Selles näites salvestame infot cache' i nii, et info säilib 10 minutit viimasest kasutamisest: esmalt säilib info 10 minutiks salvestamisest, kui keegi selle aja jooksul infot kasutab, säilib see veel 10 min jne. Kui keegi pole 10 minuti jooksul infot kasutanud, info kustub.
Cache.Insert("CacheMuutujaNimi", "Mingi väärtus", null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
TimeSpan.FromMinutes(10));
Lugemisel tuleb arvestada, et cache’ is olev info võib kaduda ning tuleks alati mõelda välja kaks sündmuste käiku: juhuks kui info on cache' is ja juhuks kui ei ole.
Object oCacheVar = Cache[”CacheMuutujaNimi”];
if (oCacheVar != null){
// info on Caches ning kasutame seda
Label1.Text = (string)oCacheVar;
}
public override bool EnablePasswordRetrieval<
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
throw new Exception("The method or operation is not implemented.");
public override MembershipUserCollection FindUsersByName (string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
throw new Exception("The method or operation is not implemented.");
public override int MaxInvalidPasswordAttempts<
public override int MinRequiredNonAlphanumericCharacters<
public override int MinRequiredPasswordLength<
public override int PasswordAttemptWindow<
public override MembershipPasswordFormat PasswordFormat<
public override string PasswordStrengthRegularExpression<
public override bool RequiresQuestionAndAnswer<
public override bool RequiresUniqueEmail<
public override string ResetPassword(string username, string answer)
throw new Exception("The method or operation is not implemented.");
public override bool UnlockUser(string userName)
throw new Exception("The method or operation is not implemented.");
public override void UpdateUser(MembershipUser user)
throw new Exception("The method or operation is not implemented.");
public override bool ValidateUser(string username, string password)
SqlCommand cmd = new SqlCommand("TuvastaKasutaja_proc",
new SqlConnection(ConfigurationManager.ConnectionStrings["yhendusTekst"].ConnectionString));
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@username", SqlDbType.NVarChar, 50).Value = username;
cmd.Parameters.Add("@password", SqlDbType.NVarChar, 50).Value = password;
cmd.Parameters.Add("@KasutajaID", SqlDbType.Int).Direction = ParameterDirection.Output;
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
bool KasutajaOK = false;
if (cmd.Parameters["@KasutajaID"].Value != System.DBNull.Value)
HttpContext.Current.Session["ActiveInimeneID"] = cmd.Parameters["@KasutajaID"].Value.ToString();
KasutajaOK = true;
return KasutajaOK;
#endregion

Kasutajagruppide hoidmine andmebaasis – RoleProvider

using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
public class SqlRoleProvider : RoleProvider
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "AddUserToRole_proc";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = new SqlConnection(ConfigurationManager.ConnectionStrings["yhendusTekst"].ConnectionString);
cmd.Parameters.Add("@UserName", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@RoleName", SqlDbType.VarChar, 50);
cmd.Connection.Open();
foreach (string user in usernames)
cmd.Parameters["@UserName"].Value = user;
foreach (string role in roleNames)
cmd.Parameters["@RoleName"].Value = role;
cmd.ExecuteNonQuery();
cmd.Connection.Close();
public override string ApplicationName
get
return "Tallinna Täiskasvanute Gümnaasiumi testimiskeskus";
set
throw new Exception("The method or operation is not implemented.");
public override bool IsUserInRole(string username, string roleName)
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "IsUserInRole_proc";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = new SqlConnection(ConfigurationManager.ConnectionStrings["yhendusTekst"].ConnectionString);
cmd.Parameters.AddWithValue("@UserName", username);
cmd.Parameters.AddWithValue("@RoleName", roleName);
cmd.Parameters.Add("@OK", SqlDbType.Bit).Direction = ParameterDirection.Output;
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
return Convert.ToBoolean(cmd.Parameters["@OK"].Value);
public override string[] GetRolesForUser(string username)<;
return rollid;
public override void CreateRole(string roleName)
if (HttpContext.Current.User.IsInRole("ADMINISTRATORS"))
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "CreateRole_proc";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = new SqlConnection(ConfigurationManager.ConnectionStrings["yhendusTekst"].ConnectionString);
cmd.Parameters.AddWithValue("@RoleName", roleName);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
bool tulemus = false;
if (HttpContext.Current.User.IsInRole("ADMINISTRATORS"))
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = new SqlConnection(ConfigurationManager.ConnectionStrings["yhendusTekst"].ConnectionString);
cmd.Parameters.AddWithValue("@RoleName", roleName);
cmd.Connection.Open();
if (throwOnPopulatedRole)
cmd.CommandText = "RolePopulated_proc";
cmd.Parameters.AddWithValue("@Tulemus", throwOnPopulatedRole).Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
if (Convert.ToBoolean(cmd.Parameters["@Tulemus"].Value))
throw new Exception("Ei saa kustutada rolli, kuhu kuuluvad kasutajad!");< else {
Console.WriteLine("Mind pole homme kodus.");
Kordus while abil
int nr=1;
while(nr
Vasakule Paremale
Nimetu #1 Nimetu #2 Nimetu #3 Nimetu #4 Nimetu #5 Nimetu #6 Nimetu #7 Nimetu #8 Nimetu #9 Nimetu #10 Nimetu #11 Nimetu #12 Nimetu #13 Nimetu #14 Nimetu #15 Nimetu #16 Nimetu #17 Nimetu #18 Nimetu #19 Nimetu #20 Nimetu #21 Nimetu #22 Nimetu #23 Nimetu #24 Nimetu #25 Nimetu #26 Nimetu #27 Nimetu #28 Nimetu #29 Nimetu #30 Nimetu #31 Nimetu #32 Nimetu #33 Nimetu #34 Nimetu #35 Nimetu #36 Nimetu #37 Nimetu #38 Nimetu #39 Nimetu #40 Nimetu #41 Nimetu #42 Nimetu #43 Nimetu #44 Nimetu #45 Nimetu #46 Nimetu #47 Nimetu #48 Nimetu #49 Nimetu #50 Nimetu #51 Nimetu #52 Nimetu #53 Nimetu #54 Nimetu #55 Nimetu #56 Nimetu #57 Nimetu #58 Nimetu #59 Nimetu #60 Nimetu #61 Nimetu #62 Nimetu #63 Nimetu #64 Nimetu #65 Nimetu #66 Nimetu #67 Nimetu #68 Nimetu #69 Nimetu #70 Nimetu #71 Nimetu #72 Nimetu #73 Nimetu #74 Nimetu #75 Nimetu #76 Nimetu #77 Nimetu #78 Nimetu #79 Nimetu #80 Nimetu #81 Nimetu #82 Nimetu #83 Nimetu #84 Nimetu #85 Nimetu #86 Nimetu #87 Nimetu #88 Nimetu #89 Nimetu #90 Nimetu #91 Nimetu #92 Nimetu #93 Nimetu #94 Nimetu #95 Nimetu #96 Nimetu #97 Nimetu #98 Nimetu #99 Nimetu #100 Nimetu #101 Nimetu #102 Nimetu #103 Nimetu #104 Nimetu #105 Nimetu #106 Nimetu #107 Nimetu #108 Nimetu #109 Nimetu #110 Nimetu #111 Nimetu #112 Nimetu #113 Nimetu #114 Nimetu #115 Nimetu #116 Nimetu #117 Nimetu #118 Nimetu #119 Nimetu #120 Nimetu #121 Nimetu #122 Nimetu #123 Nimetu #124 Nimetu #125 Nimetu #126 Nimetu #127 Nimetu #128 Nimetu #129 Nimetu #130 Nimetu #131 Nimetu #132 Nimetu #133 Nimetu #134 Nimetu #135 Nimetu #136 Nimetu #137 Nimetu #138 Nimetu #139 Nimetu #140 Nimetu #141 Nimetu #142 Nimetu #143 Nimetu #144 Nimetu #145 Nimetu #146 Nimetu #147 Nimetu #148 Nimetu #149 Nimetu #150 Nimetu #151 Nimetu #152 Nimetu #153 Nimetu #154 Nimetu #155 Nimetu #156 Nimetu #157 Nimetu #158 Nimetu #159 Nimetu #160 Nimetu #161 Nimetu #162 Nimetu #163 Nimetu #164 Nimetu #165 Nimetu #166 Nimetu #167 Nimetu #168 Nimetu #169 Nimetu #170 Nimetu #171 Nimetu #172 Nimetu #173 Nimetu #174 Nimetu #175 Nimetu #176 Nimetu #177 Nimetu #178 Nimetu #179 Nimetu #180 Nimetu #181 Nimetu #182 Nimetu #183 Nimetu #184 Nimetu #185 Nimetu #186 Nimetu #187 Nimetu #188 Nimetu #189 Nimetu #190 Nimetu #191 Nimetu #192 Nimetu #193 Nimetu #194 Nimetu #195 Nimetu #196 Nimetu #197 Nimetu #198 Nimetu #199 Nimetu #200 Nimetu #201 Nimetu #202 Nimetu #203 Nimetu #204 Nimetu #205 Nimetu #206 Nimetu #207 Nimetu #208 Nimetu #209 Nimetu #210 Nimetu #211 Nimetu #212 Nimetu #213 Nimetu #214 Nimetu #215 Nimetu #216 Nimetu #217 Nimetu #218 Nimetu #219 Nimetu #220 Nimetu #221 Nimetu #222 Nimetu #223 Nimetu #224 Nimetu #225 Nimetu #226 Nimetu #227 Nimetu #228 Nimetu #229 Nimetu #230 Nimetu #231 Nimetu #232 Nimetu #233 Nimetu #234 Nimetu #235 Nimetu #236 Nimetu #237 Nimetu #238 Nimetu #239 Nimetu #240 Nimetu #241 Nimetu #242 Nimetu #243 Nimetu #244 Nimetu #245 Nimetu #246 Nimetu #247 Nimetu #248 Nimetu #249 Nimetu #250 Nimetu #251 Nimetu #252 Nimetu #253 Nimetu #254 Nimetu #255 Nimetu #256 Nimetu #257 Nimetu #258 Nimetu #259 Nimetu #260 Nimetu #261 Nimetu #262 Nimetu #263 Nimetu #264 Nimetu #265 Nimetu #266 Nimetu #267 Nimetu #268 Nimetu #269 Nimetu #270 Nimetu #271 Nimetu #272 Nimetu #273 Nimetu #274 Nimetu #275 Nimetu #276 Nimetu #277 Nimetu #278 Nimetu #279 Nimetu #280 Nimetu #281 Nimetu #282 Nimetu #283 Nimetu #284 Nimetu #285 Nimetu #286 Nimetu #287 Nimetu #288 Nimetu #289 Nimetu #290 Nimetu #291 Nimetu #292 Nimetu #293 Nimetu #294 Nimetu #295 Nimetu #296 Nimetu #297 Nimetu #298 Nimetu #299 Nimetu #300 Nimetu #301 Nimetu #302 Nimetu #303 Nimetu #304 Nimetu #305 Nimetu #306 Nimetu #307 Nimetu #308 Nimetu #309 Nimetu #310 Nimetu #311 Nimetu #312 Nimetu #313 Nimetu #314 Nimetu #315 Nimetu #316 Nimetu #317 Nimetu #318 Nimetu #319 Nimetu #320 Nimetu #321 Nimetu #322 Nimetu #323 Nimetu #324 Nimetu #325 Nimetu #326 Nimetu #327 Nimetu #328 Nimetu #329 Nimetu #330 Nimetu #331 Nimetu #332 Nimetu #333 Nimetu #334 Nimetu #335 Nimetu #336 Nimetu #337 Nimetu #338 Nimetu #339 Nimetu #340 Nimetu #341 Nimetu #342 Nimetu #343 Nimetu #344 Nimetu #345 Nimetu #346 Nimetu #347 Nimetu #348 Nimetu #349 Nimetu #350 Nimetu #351 Nimetu #352 Nimetu #353 Nimetu #354 Nimetu #355 Nimetu #356 Nimetu #357 Nimetu #358 Nimetu #359 Nimetu #360 Nimetu #361 Nimetu #362 Nimetu #363 Nimetu #364 Nimetu #365 Nimetu #366 Nimetu #367 Nimetu #368 Nimetu #369 Nimetu #370 Nimetu #371 Nimetu #372 Nimetu #373 Nimetu #374 Nimetu #375 Nimetu #376 Nimetu #377 Nimetu #378 Nimetu #379 Nimetu #380 Nimetu #381 Nimetu #382 Nimetu #383 Nimetu #384 Nimetu #385 Nimetu #386 Nimetu #387 Nimetu #388 Nimetu #389 Nimetu #390 Nimetu #391 Nimetu #392 Nimetu #393 Nimetu #394 Nimetu #395 Nimetu #396 Nimetu #397 Nimetu #398 Nimetu #399 Nimetu #400 Nimetu #401 Nimetu #402 Nimetu #403 Nimetu #404 Nimetu #405 Nimetu #406 Nimetu #407 Nimetu #408 Nimetu #409 Nimetu #410 Nimetu #411 Nimetu #412 Nimetu #413 Nimetu #414 Nimetu #415 Nimetu #416 Nimetu #417 Nimetu #418 Nimetu #419 Nimetu #420 Nimetu #421 Nimetu #422 Nimetu #423 Nimetu #424 Nimetu #425 Nimetu #426 Nimetu #427 Nimetu #428 Nimetu #429 Nimetu #430 Nimetu #431 Nimetu #432 Nimetu #433 Nimetu #434 Nimetu #435 Nimetu #436 Nimetu #437 Nimetu #438 Nimetu #439 Nimetu #440 Nimetu #441 Nimetu #442 Nimetu #443 Nimetu #444 Nimetu #445 Nimetu #446 Nimetu #447 Nimetu #448 Nimetu #449 Nimetu #450 Nimetu #451 Nimetu #452 Nimetu #453 Nimetu #454 Nimetu #455 Nimetu #456 Nimetu #457 Nimetu #458 Nimetu #459 Nimetu #460 Nimetu #461 Nimetu #462 Nimetu #463 Nimetu #464 Nimetu #465 Nimetu #466 Nimetu #467 Nimetu #468 Nimetu #469 Nimetu #470 Nimetu #471 Nimetu #472 Nimetu #473 Nimetu #474 Nimetu #475 Nimetu #476 Nimetu #477 Nimetu #478 Nimetu #479 Nimetu #480 Nimetu #481 Nimetu #482 Nimetu #483 Nimetu #484 Nimetu #485 Nimetu #486 Nimetu #487 Nimetu #488 Nimetu #489 Nimetu #490 Nimetu #491 Nimetu #492 Nimetu #493 Nimetu #494 Nimetu #495 Nimetu #496 Nimetu #497 Nimetu #498 Nimetu #499 Nimetu #500 Nimetu #501 Nimetu #502 Nimetu #503 Nimetu #504 Nimetu #505 Nimetu #506 Nimetu #507 Nimetu #508 Nimetu #509 Nimetu #510 Nimetu #511 Nimetu #512 Nimetu #513 Nimetu #514 Nimetu #515 Nimetu #516 Nimetu #517 Nimetu #518 Nimetu #519 Nimetu #520 Nimetu #521 Nimetu #522 Nimetu #523 Nimetu #524 Nimetu #525 Nimetu #526 Nimetu #527 Nimetu #528 Nimetu #529 Nimetu #530 Nimetu #531 Nimetu #532 Nimetu #533 Nimetu #534 Nimetu #535 Nimetu #536 Nimetu #537 Nimetu #538 Nimetu #539 Nimetu #540 Nimetu #541 Nimetu #542 Nimetu #543 Nimetu #544 Nimetu #545 Nimetu #546 Nimetu #547 Nimetu #548 Nimetu #549 Nimetu #550 Nimetu #551 Nimetu #552 Nimetu #553 Nimetu #554 Nimetu #555 Nimetu #556 Nimetu #557 Nimetu #558 Nimetu #559 Nimetu #560 Nimetu #561 Nimetu #562 Nimetu #563 Nimetu #564 Nimetu #565 Nimetu #566 Nimetu #567 Nimetu #568 Nimetu #569 Nimetu #570 Nimetu #571 Nimetu #572 Nimetu #573 Nimetu #574 Nimetu #575
Punktid 5 punkti Autor soovib selle materjali allalaadimise eest saada 5 punkti.
Leheküljed ~ 575 lehte Lehekülgede arv dokumendis
Aeg2013-08-08 Kuupäev, millal dokument üles laeti
Allalaadimisi 33 laadimist Kokku alla laetud
Kommentaarid 1 arvamus Teiste kasutajate poolt lisatud kommentaarid
Autor Õppematerjali autor

Kasutatud allikad

Sarnased õppematerjalid

Veebistuudium arendus ASP NET
212
docx

Veebistuudium arendus ASP.NET

Andmebaasipõhiste veebirakenduste arendamine Microsoft Visual Studio ja SQL Server'i baasil ASP.NET Tallinn 2011 ASP.NET ASP.NET on .NET raamistiku moodul, mis võimaldab sul luua veebirakendusi, kasutades sealjuures minimaalselt koodi. ASP.NET ei ole mitte ASP (Active Server Pages) uus versioon, vaid täiesti uus lähenemine veebirakenduste loomisele. Erinevalt ASPist ja ka PHPst, mis on peamiselt skriptimise keeled, on ASP.NET lehtede taga olev kood täielikult objektorienteeritud. Seega tuleks ASP.NETi võrrelda mitte PHP vaid JAVA rakendustega. Kasutaja saab, kuid ei pruugi täpselt mõelda HTMLi eripärade peale. Pigem määrab ta, milliseid komponente ta soovib veebilehel näha ning need näidatakse, arvestades vajadusel kasutaja veebilehitseja eripäradega ­ eriti kehtib see mobiilseadmete kohta. Koodi ASP.NET lehtede tarbeks võib kirjutada ükskõik millises .NET keeles. Lisaks veebivormidele on võimalik oma

Veebiprogrammeerimine
C-materjal
85
doc

C# materjal

C# õppematerjal 2006 Sisukord Sisukord...................................................................................................................................... 2 Sissejuhatus.................................................................................................................................5 Põhivõimalused...........................................................................................................................6 Käivitamine.............................................................................................................................8 Ülesandeid...........................................................................................................................9 Suhtlus arvutiga.......................................................................................................................9 Arvutamine................................................................................................

Programmeerimine - c sharp
Andmebaasipõhiste veebirakenduste arendamine Microsoft Visual Studio ja SQL Server’i baasil
184
docx

Andmebaasipõhiste veebirakenduste arendamine Microsoft Visual Studio ja SQL Server’i baasil

Andmebaasipõhiste veebirakenduste arendamine Microsoft Visual Studio ja SQL Server'i baasil C# Tallinn 2011 C# Mõnigi võib ohata, et jälle üks uus programmeerimiskeel siia ilma välja mõeldud. Teine jälle rõõmustab, et midagi uut ja huvitavat sünnib. Kolmas aga hakkas äsja veebilahendusi kirjutama ja sai mõnegi ilusa näite lihtsasti kokku. Oma soovide arvutile selgemaks tegemise juures läheb varsti vaja teada, "mis karul kõhus on", et oleks võimalik täpsemalt öelda, mida ja kuidas masin tegema peaks. Loodetavasti on järgnevatel lehekülgedel kõigile siia sattunute jaoks midagi sobivat. Mis liialt lihtne ja igav tundub, sellest saab kiiresti üle lapata. Mis esimesel pilgul paistab arusaamatu, kuid siiski vajalik, seda tasub teist korda lugeda. Ning polegi loota, et kõik kohe lennult külge jääks!? Selle jaoks on teksti sees koodinäited, mida saab kopeerida ja arvutis tööle panna. Ning mõningase muu

Algoritmid ja andmestruktuurid
C-Progammeerimise keel
16
doc

C# Progammeerimise keel

C# - PROGRAMMERIMISE KEEL Programm on eeskirjade (käskude) kogum, mis määrab, milliseid operatsioone ja tegevusi peab arvuti täitma andmetega antud klassi kuuluvate ülesannete lahendamiseks. Andmed on informatsiooni formaliseeritud esitus kujul, mis võimaldab informatsiooni salvestamist ja töötlemist arvutis. Eristatakse mitut liiki andmeid: arve, tekste, graafikakujundeid, heli jm. Programmide koostamiseks on loodud spetsiaalsed programmeerimiskeeled. Taolisi keeli on palju, kuid enamiku ülesehitus ja käsutamise põhimõtted on analoogilised. Kasutamisvaldkonna järgi jagatakse keeled kahte rühma: universaalsed ehk üldkeeled ja spetsialiseeritud keeled. Üldisi programmeerimiskeeli käsutatakse suvaliste rakendus- ja süsteemi-programmide loomiseks, mis töötavad autonoomselt või koos teiste programmidega. Praegusel ajal on levinud järgmised üldised programmeerimiskeeled C, ++, Visual ++, Visual Basic, Java, Pascal, Fortran, Cobol. C# Spetsialiseeritud k

Arvutiõpetus
Programmeerimine PHP
134
pdf

Programmeerimine PHP

Programmeerimine keeles PHP Andrei Porõvkin Tartu Ülikool (2009) 1 1.1 Üldinfo Alguses oli interneti lehed omavahel seotud staatiliste html dokumentide süsteemina, aga selleks, et mingis dokumendis muutusi teha oli vaja lehti failisüsteemis käsitsi muuta. Kahjuks selline staatiline mudel ei jõua kiirelt muutuva kaasaegse maailma progressile järgi. Seega võeti kasutusele dünaamiline mudel. Dünaamilise mudeli korral ei hoita serveris staatilisi html lehte vaid neid genereeritakse selleks spetsiaalselt välja töötatud programmidega, mis serveril töötavad. Antud kursuse jooksul tutvume klient-server arhitektuuriga, installeerime enda arvutisse veebiserveri ja php interpretaatori ning saame baasteadmisi serveripoolsest keelest PHP. Kursuse teemad on pühendatud ainult PHP keelele (väljarvatud seitsmes teema), aga see ei tähenda, et sellest piisab suure ja eduka veebilehe loomiseks. Mahuka infosüsteemi ei saa ette kujutada ilma andme

Allika?petus
Objektorienteeritud programmeerimise loengutekst
40
odt

Objektorienteeritud programmeerimise loengutekst

1 Loeng. Sissejuhatus Võtmesõnad: abstract assert boolean break byte case catch char class const* continue default double do else enum extends final finally float for goto* if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while NB! Tunduvad võtmesõnadena, aga on literaalid: false null true Algtüübid: Täisarvud · byte(8-bitiline), short(16-bitiline ), int(32-bitiline), long(64-bitiline) Ujukomaarvud · float(32-bitiline), double(64-bitiline) Tõeväärtused · boolean(true, false) Sümbolid · char(16-bitiline Unicode-sümbol, 'u0000'(0) kuni 'uffff'(65535)) Nimi: · on tõstutundlik · võib sisaldada tähti, numbreid, _ , $ · ei tohi alata numbriga · ei tohi olla Java võtmesõna, · ei tohi olla true, false, null Ühiksuurendamine, ühikvähendamine ++muutuja : Muutujat suurendatakse

Programmeerimine
Java programmeerimise konspekt
49
doc

Java programmeerimise konspekt

Meetod (alamprogramm) Java rakendus sisaldab põhiprogrammi (main), millest tõenäoliselt pöördutakse ka mingite alamprogrammide poole. Javas nimetatakse alamprogramme meetoditeks (tulenevalt selle keele objektorienteeritusest) ning meetodid on rühmitatud klasside kaupa. Meetodid võivad olla kas programmeerija enda poolt loodud või Javasse sisse ehitatud (nn. API meetodid, mille kirjelduse leiab Java dokumentatsioonist). Sõltumata sellest, kust meetod pärineb, võib see olla kas klassi- või isendimeetod. Klassimeetod (class method) , mida Javas kirjeldab võtmesõna static, on kasutatav n.ö. "igas olukorras", s.t. ei ole vajalik objektorienteeritud paradigma järgimine (esialgu püüame oma kursuses läbi ajada klassimeetoditega). Täpsemalt öeldes - klassimeetodi poole pöördumiseks ei ole vajalik objekti olemasolu. Klassimeetodi poole pöördumiseks kirjutatakse reeglina: Klassi_nimi . meetodi_nimi ( faktilised_parameetrid ); Kui meetod on defineeritud jooksvas klassis,

Java programmeerimine
PHP EDASIJÕUDNUD RAAMAT
210
docx

PHP EDASIJÕUDNUD RAAMAT

01 - PHP ja MySQL - Sissejuhatus Teemad  Sissejuhatus  Mis on MySQL  Mis on SQL  Andmebaasi haldamine Sissejuhatus Millega ma nüüd jälle hakkama sain? Nimelt otsustasin vana php mooduli lüüa vähemalt kaheks ning kirjeldada iga teema täpsemalt lahti. Esimene osa peaks olema php põhikursus, kus õpime aluseid ning selles teemas nihutame latti kõrgemale ja omandame keerulisemaid asju. Näiteks õpime kuidas siduda php andmebaasiga, kuidas saada paremini läbi vormidega, mida hakata peale sessioonidega jne. Alustamegi kohe andmebaasi tutvustamisega, milleks meil seda vaja on ja kuidas andmebaasi hallata. Mis on MySQL? Niisiis, php alused mooduli alguses paigaldasime arvutisse WAMP serveri, mis paigaldas meie arvutisse Apache veebiserveri, MySQL andmebaasi ja Php mooduli. Kuigi tihti öeldakse MySQL kohta lihtsalt andmebaas, siis on tegemist tegelikult andmebaasihalduriga või siis kaandmebaasimootoriga. See sisaldab endas:  andmebaasi serverit

Informaatika




Meedia

Kommentaarid (1)

mantonio profiilipilt
mantonio: Tundub, et see ei ole C. See on C#.
19:51 01-03-2016



Sellel veebilehel kasutatakse küpsiseid. Kasutamist jätkates nõustute küpsiste ja veebilehe üldtingimustega Nõustun