Microsoft Visual Studio 2005



Samankaltaiset tiedostot
Microsoft Visual Studio 2005

Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Anne Benson. Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen:

Web Services tietokantaohjelmoinnin perusteet

Olio-ohjelmointi Javalla

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Tietokannat II -kurssin harjoitustyö

AJAX-konsepti AJAX. Asynkronisuus. Nykyisten web-ohjelmien ongelmia. Asynchronous JavaScript And XML

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Mikä yhteyssuhde on?

Ohjelmoinnin perusteet Y Python

Java ja tietokannan käsittely (JDBC)

JUnit ja EasyMock (TilaustenKäsittely)

14. Poikkeukset 14.1

Ohjelmoinnin perusteet Y Python

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

5. HelloWorld-ohjelma 5.1

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

7. Näytölle tulostaminen 7.1

14. Poikkeukset 14.1

Tech Conference Visual Studio 2015, C#6,.NET4.6. Heikki Raatikainen. #TechConfFI

Sisältö. 2. Taulukot. Yleistä. Yleistä

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Jypelin käyttöohjeet» Ruutukentän luominen

A TIETORAKENTEET JA ALGORITMIT

Javan perusteita. Janne Käki

7. Oliot ja viitteet 7.1

Sisältö. 22. Taulukot. Yleistä. Yleistä

Osio 4: Graafinen käyttöliittymä

Ohjelmoinnin perusteet Y Python

Listarakenne (ArrayList-luokka)

Delegaatit ja tapahtumakäsittelijät

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

C# Windows ohjelmointi perusopas

Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen

Testivetoinen ohjelmistokehitys

Ohjelmointi 2 / 2010 Välikoe / 26.3

Metodien tekeminen Javalla

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

PROSEDUURIT, FUNKTIOT JA HERÄTTIMET - ESIMERKKEINÄ ORACLE, SQL SERVER, MYSQL JA OCELOT JOUNI HUOTARI K2009

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

1. Omat operaatiot 1.1

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Luokat ja oliot. Ville Sundberg

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

UML ja luokkien väliset suhteet

Osio 4: Graafinen käyttöliittymä

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

12. Näppäimistöltä lukeminen 12.1

Harjoitus 5 (viikko 48)

Tietokantasovellus (4 op) - Web-sovellukset ja niiden toteutus

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

OHJE Jos Kelaimeen kirjautuminen ei onnistu Mac-koneella Sisällys

Proseduurit, funktiot ja herättimet - esimerkkeinä Oracle, SQL Server, MySQL ja OCELOT. Jouni Huotari S2008

HELIA 1 (15) Outi Virkki Tietokantasuunnittelu

Ohjelmointityö 3. Mikko Laamanen

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Rajapinta (interface)

YHTEYSSUHDE (assosiation)

Luokan sisällä on lista

KOHDELUOKAN MÄÄRITTELY

käännös käännösvaiheessa tarkasettaan linkitys

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Java-kielen perusteet

5 Näppäimistö. 5.1 Näppäimistön eventit

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Web järjestelmän ohjelmointi Kevät 2012 Hans Nieminen

Tietokannat II -kurssin harjoitustyö

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

Ohjelmoinnin perusteet Y Python

EXEC SQL BEGIN DECLARE SECTION

Java-API, rajapinnat, poikkeukset, UML,...

TIETOKANTOJEN PERUSTEET MARKKU SUNI

Yksikkötestaus. Kattava testaus. Moduulitestaus. Ohjelman testaus. yksikkotestaus/ Seija Lahtinen

Ohjelmoinnin peruskurssi Y1

Rinnakkaisohjelmointi, Syksy 2006

Visma Avendon asennusohje

Poikkeustenkäsittely

8. Näppäimistöltä lukeminen 8.1

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

Pikaohje formaatin valmistamiseen

ITKP102 Ohjelmointi 1 (6 op)

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Java-kielen perusteet

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Lohtu-projekti. Testiraportti. Versiohistoria: syklin toteutuksen testit. 1. ajo Virve

5. HelloWorld-ohjelma 5.1

Transkriptio:

Sovelluksen jako palvelimiksi: Palvelin on sille annettuun vastuulliseen tehtävään erikoistunut sovellusosa. Käyttöliittymäpalvelin (Web-palvelin) vastaa käyttöliittymän toteuttamisesta. Web-palvelin toteuttaa käyttäjän tarvitsemat HTML-sivut ja ASP-sivut. Liiketoimintapalvelin on vastuussa käyttäjän tarvitsemien palvelujen toteuttamisesta. Käyttäjän käyttöliittymä on yhteydessä ainoastaan liiketoimintapalvelimeen. Tietovarastopalvelin on vastuussa tiedon välityksestä liiketoimintapalvelimen ja tietovaraston kesken. Tietovarastopalvelin tarjoaa sekä tiedon tallentamispalveluja että tiedon hakupalveluja liiketoimintapalvelimelle.

Mistä palvelimet löytyvät: Liiketoimintapalvelin Tiedonhallintapalvelin Käyttöliittymä (Web-palvelin)

Sovelluksen jako palvelimiksi: Käyttöliittymäpalvelin (Web-palvelin) toimittaa käyttäjälle kahden tyyppisiä XHTML-sivuja: Staattiset sivut ovat vakiomuotoisia XHTML-sivuja, jotka toteutetaan Web-palvelimessa htm-tarkentimella varustettuina sivuina. Dynaamiset sivut ovat sisällöltään muuttuvia sivuja, jotka toteutetaan Web-palvelimessa ASP.NET-sivuina. ASP.NET-sivujen sisältöön vaikuttaa tyypillisesti mm. tietokannasta saatava tieto.

Sovelluksen jako palvelimiksi: ASP.NET- sivut esiintyvät webpalvelimessa tarkentimella aspxvarustettuina sivuina. aspx-tarkentimella varustettu sivu muodostuu tavallisesta XHTML-koodista sekä koodiin upotetusta ASP.NET -koodista. ASP.NET-sivun koodi sisältää ensisijassa kontrollien esittämiseen ja käyttöön tarvittavaa tietoa. Kuhunkin aspx-tarkentimella varustettuun sivuun liittyy valitun ohjelmointikielen mukainen koodisivu (code-behind). jossa on mm. varsinaisen aspx-sivun kontrollien tapahtumankäsittelijät.

Kuinka ASP.NET sivu toimii? Käyttäjän pyytäessä Web-palvelimelta aspx-tyyppistä ASP.NET sivua Web-palvelin käynnistää ns. ISAPI-filtterin. Ensimmäisellä kutsukerralla ISAPI-filtteri lähettää käyttäjän selaimelle XHTML-sivun koodin sekä tähän koodiin upotetut kontrollit. Kontrollit on varustettu tapahtumantunnistimilla. Kun käyttäjä sivun saatuaan täyttää sivun ja painaa komentopainiketta, aktivoi ISAPI-filtteri komentopainikkeeseen liittyvän tapahtumankäsittelijän aspx-sivuun liittyvällä koodisivulla.

Kuinka ASP.NET sivu toimii? Tapahtumankäsittelijän tehtävänä on suorittaa kaikki komentopainikkeen painamiseen liittyvät tehtävät. Tehtävien suorittaminen tapahtuu sekä ASP.NET aspx-sivuun liittyvälle koodisivulle toteutettujen funktioiden että liiketoimintakerroksessa olevien palveluiden avulla.

Sovellettava rakennemalli: Tieto siirretään käyttöliittymästä liiketoimintaluokkiin Tieto siirretään liiketoimintaluokista tietokantaan (transaktioita käyttäen) Web-palvelin (Käyttöliittymä) Liiketoimintapalvelin Tiedonhallintapalvelin Tieto siirretään liiketoimintaluokista käyttöliittymään Tieto siirretään tietokannasta liiketoimintaluokkiin

Sovellettava rakennemalli: Web-palvelimen (käyttöliittymän) vastuut: toteuttaa käyttöliittymään liittyvät staattiset xhtml-sivut toteuttaa käyttöliittymään liittyvä tyyli tyylisivujen avulla toteuttaa käyttöliittymään liittyvät ASP.NET sivut Web-palvelimen ASP.NET-sivujen tapahtumankäsittelijöiden vastuut: säilyttää käyttöliittymän toiminnallisuus käyttötilanteen mukaisena (mm. aktivoimalla ja passivoimalla komentopainikkeita) pyytää liiketoimintakerrokselta tarvittavat palvelut siirtää liiketoimintakerrokselle käyttäjän käyttöliittymään syöttämät tiedot toimenpiteitä varten

Sovellettava rakennemalli: Liiketoimintapalvelimen vastuut: luoda palvelujen edellyttämät kohdeluokkien oliot. Rakennemallissamme vain liiketoimintapalvelimella on oikeus luoda kohdeluokkien olioita luoda palvelimeen kohdeluokkien vaatima oliohierarkia ja oliohierarkian vaatimat tekniset luokat vastata niistä eheyssäännöistä, jotka on asetettu liiketoimintapalvelimen vastuulle toteuttaa käyttöliittymään tarvitsemat palvelut pyytää tiedonhallintapalvelimelta niitä palveluita, joita käyttöliittymän tarvitsemien palvelujen toteuttaminen edellyttää

Sovellettava rakennemalli: Tiedonhallintapalvelimen vastuut: luoda palvelujen edellyttämä SQL-koodi. Rakennemallissamme vain tiedonhallintapalvelimella on oikeus luoda SQL-koodia luoda yhteys tiedonhallintajärjestelmään palvelujen toteuttamista varten toteuttaa liiketoimintapalvelimen pyytämiä palveluita. Rakennemallissamme tiedonhallintapalvelimen palveluita saa käyttää vain liiketoimintapalvelin. vastata niistä eheyssäännöistä, jotka on asetettu tiedonhallintapalvelimen vastuulle vastata tapahtumankäsittelyn vaatimasta eheyden valvonnasta ja tietokannan tietojen versioinnista

Esimerkin alkutilanne (löytyy zip-tiedostosta FillariVaihe1.zip): Sovelluksen aloitusikkuna (staattinen xhtml-sivu):

Esimerkin alkutilanne: Sovelluksen asiakastietoikkuna (ASP.NET-sivu):

Esimerkin alkutilanne: Sovelluksen kohdeluokat: Osoite Osoite + <property> lahiosoite + <property> postitoimipaikka + <property> postinumero tai Asiakas Asiakas + <property> asiaksnumero + <property> nimi + <property> alennusprosentti + <property> versio

Tiedon siirtäminen käyttöliittymästä liiketoimintaluokkiin. Aluksi aspx-sivuun liittyvään koodisivuun toteutetaan metodi, joka siirtää tiedot käyttöliittymäkontrolleista liiketoimintakerroksen kohdeluokkiin. Metodi voi olla esimerkiksi seuraavan tapainen: private bool RuudultaOlioon(Asiakas asi) { try { asi.asiakasnumero = Int32.Parse(TexAsiakasNumero.Text); asi.nimi = TexAsiakasNimi.Text; asi.lahiosoite = TexLahiosoite.Text; asi.postitoimipaikka = TexPostitoimipaikka.Text; asi.postinumero = TexPostinumero.Text; asi.alennusprosentti = Int32.Parse(TexAlennusProsentti.Text); asi.versio = Int32.Parse(LabVersio.Text); catch { LabVirhe.Text = "Joko asiakasnumero tai alennusprosentti ei ole numeerinen."; return false; LabVirhe.Text = ""; return true; Parametrina viitemuuttuja Asiakas-olioon Muutetaan merkkijono kokonaisluvuksi konversion avulla try-catch lohko tarvitaan mahdollisia konversiovirheitä varten Palautetaan tarvittaessa selväkielinen virheilmoitus

Tiedon siirtäminen liiketoimintaluokista käyttöliittymään. Vastaavasti aspx-sivuun liittyvään koodisivuun toteutetaan metodi, joka siirtää tiedot liiketoimintakerroksen kohdeluokasta käyttöliittymäkontrolleihin. Metodi voi olla esimerkiksi seuraavan tapainen: private bool OliostaRuudulle(Asiakas asi) { try { TexAsiakasNumero.Text = asi.asiakasnumero.tostring(); TexAsiakasNimi.Text = asi.nimi; TexLahiosoite.Text = asi.lahiosoite; TexPostitoimipaikka.Text = asi.postitoimipaikka; TexPostinumero.Text = asi.postinumero; TexAlennusProsentti.Text = asi.alennusprosentti.tostring(); LabVersio.Text = asi.versio.tostring(); catch { LabVirhe.Text = "Asiakkaan tietojen esittäminen ei onnistu."; return false; LabVirhe.Text = ""; return true; Parametrina viitemuuttuja Asiakas-olioon Muutetaan kokonaisluku merkkijonoksi konversion avulla try-catch lohko tarvitaan mahdollisia konversiovirheitä varten Palautetaan tarvittaessa selväkielinen virheilmoitus

Tiedon siirtäminen käyttöliittymästä liiketoimintaluokkiin. Seuraavaksi liiketoimintapalvelimelle toteutetaan AsiakasKontrolkontrollikuokka käyttöliittymän asiakkaaseen liittyvien palveluiden toteuttamista varten. AsiakasKontrol-luokassa on ominaisuutena viitemuuttuja Asiakas-olioon. Asiakas-oliohan oli kohdeluokan ilmentymä, joten sen saa luoda vain liiketoimintapalvelimeen kuuluva luokka. AsiakasKontrol + <property> asi :Asiakas Asiakas + <property> asiaksnumero + <property> nimi + <property> alennusprosentti + <property> versio

Tiedon siirtäminen käyttöliittymästä liiketoimintaluokkiin. Tiedon siirtäminen käyttöliittymäkontrolleista liiketoimintakerroksen kohdeluokkiin edellyttää, että käytettävissä on viitemuuttuja tarvittavaan kohdeluokkaan. Liiketoimintakerroksen kontrolliluokan tehtävänä on luoda tarvittavat kohdeluokat ja luovuttaa niiden viitemuuttujat käyttäjille. Kontrolliluokan toteutus saattaa näyttää alkuosaltaan tältä: public class AsiakasKontrol { private Asiakas asi; public AsiakasKontrol() { asi = new Asiakas(); public Asiakas LuovutaAsiakas () { return asi ;.

Tiedonhallintapalvelin: Liiketoimintapalvelin tarvitsee omien palveluidensa toteuttamista varten tiedonhallintapalvelimen. Tiedonhallintapalvelinta edustaa sovelluksessa luokka Tietokanta. Toistaiseksi luokassa ei ole ominaisuuksia eikä metodeita. Tietokanta-luokan lisäämisen jälkeen Solution Explorer kehys näyttää tältä:

Seuraavaksi selvitetään mitä sovelluksessa tapahtuu kun käyttäjä yllä olevassa tilanteessa haluaa tallentaa uuden asiakkaan tiedot ja painaa Tallenna komentopainiketta.

Asiakkaan lisääminen (katso edellinen kalvo): 1. Asiakas painaa komentopainiketta Tallenna 2. Asiakkaan selaimesta siirtyvät näytön tiedot Web-palvelimelle HTTP-protokollan avulla. 3. Web-palvelimessa aktivoituu lomakkeen Tallenna-komentopainikkeeseen liittyvän Clicktapahtuman tapahtumankäsittelijä ButTallenna_Click 4. Tapahtumankäsittelijä luo liiketoimintapalvelimen AsiakasKontrol-olion 5. AsiakasKontrol-olion oletusmuodostin luo Asiakas-olion 6. Tallenna-komentopainikkeen tapahtumankäsittelijä pyytää AsiakasKontrol-oliolta viitemuuttujan luotuun Asiakas-olioon 7. Tallenna-komentopainikkeen tapahtumankäsittelijä siirtää käyttöliittymän tiedot Asiakasolioon 8. Tallenna-komentopainikkeen tapahtumankäsittelijä pyytää AsiakasKontrol-oliota tallentamaan uuden asiakkaan tiedot 9. AsiakasKontrol-olio luo uuden Tietokanta-olion 10. AsiakasKontrol-olio pyytää Tietokanta-oliota tallentamaan asiakkaan tiedot ja antaa Tietokanta-oliolle parametrina viitemuuttujan Asiakas-olioon 11. Tietokanta-olio palauttaa tiedon asiakkaan lisäämisen onnistumisesta AsiakasKontrololiolle 12. AsiakasKontrol-olio palauttaa tiedon asiakkaan lisäämisen onnistumisesta Tallennakomentopainikkeen tapahtumankäsittelijälle 13. Tallenna-komentopainikkeen tapahtumankäsittelijä palauttaa tiedon uuden asiakkaan lisäämisen onnistumisesta käyttäjälle

Tapahtumankäsittelijän toteuttaminen Tallenna-komentopainikkeelle: protected void ButTallenna_Click(object sender, EventArgs e) { bool b; string s = ""; AsiakasKontrol ask = new AsiakasKontrol(); b = this.ruudultaolioon (ask.luovutaasiakas()); if (ButPoista.Enabled == false) { b = ask.lisaa(ref s); if (b == true) { ButPoista.Enabled = true; LabVirhe.Text = "Asiakkaan lisääminen onnistui."; return; else { LabVirhe.Text = s; return; Tapahtumankäsittelijä Luodaan AsiakasKontrol-olio Viedään tiedot Asiakas-olioon Tutkitaan, oliko tehtävänä uuden asiakkaan lisääminen tai vanhan muuttaminen. Kutsutaan Lisaa-metodia suorittamaan asiakkaan tietojen lisääminen Onnistuiko? Vanhan tiedon muuttamista ei ole toistaiseksi toteutettu

Lisää-metodin toteuttaminen AsiakasKontrol-luokkaan: public bool Lisaa(ref string message) { bool b; Tietokanta tk = new Tietokanta(); b = tk.asiakaslisaa(asi); if (b == false) { message = "Asiakkaan tietojen lisääminen ei onnistunut."; else { message = ""; return b; Lisaa-metodi palauttaa sekä totuusarvon että tarvittaessa virheilmoituksen (ref string message) Luodaan Tietokanta-olio Kutsutaan tietokantaolion AsiakasLisaa-metodia Onnistuiko lisäys?

Tietokanta luokan toteuttaminen (jatkuu seuraavassa kalvossa):.. using System.Data.SqlClient; /// <summary> /// Tietokanta-luokka on vastuussa: /// - yhteydenpidosta tietokantaan /// - transaktioista /// - commit- ja rollback -operaatioista /// - SQL-lauseiden muodostamisesta /// - SQL -lauseiden suorittamisesta /// - operaatioiden turvallisuudesta. /// </summary> public class Tietokanta { private SqlTransaction dbtrans; private SqlConnection dbconn; // Connection string tietokantaan static private string cnstr = "; public Tietokanta() {. Tarvitaan kirjastoa System.Data.SqlClient Tietokanta on monesta vastuussa SqlTransaction -luokka on tarpeen transaktioiden käyttämisessä SqlConnection luokka vastaa yhteyden muodostamisesta tiedonhallintajärjestelmään Connection string löytyy automaattisesti seuraavan kalvon ohjeiden avulla. Muista, että kenoviiva \ vaatii kaksi kenoviivaa \\ C#-merkkijonovakiossa Oletusmuodostin on tyhjä

Tietokannan connection string muuttujan arvon automaattinen haku: 1. Osoita Server Explorer kehyksessä ylinnä olevaa Data Connection ikonia hiirellä ja paina hiiren oikeaa näppäintä 2. Valitse valikosta toiminto Add Connection. 3. Esiin tulee Add Connection dialogi. Anna Data Source kentän arvoksi Microsoft SQL Server (SqlClient). 4. Aseta Server Name kentän arvoksi do3023l18\sqlexpress, missä do3023l18 on koneesi nimi tai tunnus 5. Valitse kirjautumistavaksi Use Windows Authentication 6. Valitse yhteydenmuodostamistavaksi Select or enter a database name ja valitse alasvetovalikosta käsittelemäsi tietokanta 7. Paina Test Connection komentopainiketta. 8. Mikäli saat palautteeksi tiedon onnistuneesta yhteydenmuodostamisesta paina lopuksi sivun alareunassa olevaa OK-komentopainiketta. Muussa tapauksessa korjaa virheellinen määrittely 9. Osoita hiirellä juuri muodostamaasi yhteyttä Server Explorer kehyksessä. Properties-kehykseen ilmestyy yhteyden ominaisuudet. Niiden joukosta löytyy myös yhteyden Connection String. 10. Kopioi Connection String arvo tietokantaluokkasi staattiseen muuttujaan ja muista korvata merkkijonossa esiintymä kenoviiva kahdella kenoviivalla.

Toteutuksen viestiyhteyskaavio: : käyttäjä : asiakas : AsiakasKontrol : Asiakas : Tietokanta Tallenna New LuovutaAsiakas New RuudultaOlioon Asiakasnumero Nimi Lisaa New AsiakasLisaa Asiakasnumero Nimi

public bool AsiakasLisaa(Asiakas asi) { bool b; try { dbconn = new SqlConnection(cnstr); Määritellään SqlConncetion objekti ja avataan yhteys tietokantaan. dbconn.open(); dbtrans = dbconn.begintransaction();. Aloitetaan transaktio. Itse SQL-lauseen suoritus tapahtuu tässä (koodi on seuraavalla kalvolla) catch (SqlException ex){ b = false; if (dbtrans!= null) { dbtrans.rollback(); finally { if (dbconn.state == ConnectionState.Open) { dbconn.close(); return b; Virhetilanteissa paluuarvo on false ja transaktiolle tehdään tarvittaessa Rollback. Lopuksi suljetaan yhteys tietokantaan mikäli se on vielä auki. HUOMAA: Tämä perusrunko sopii transaktionhallinnan kannalta muidenkin toimintojen kuin tietokantaan lisäämisen perusrungoksi.

Tietokantaan lisäämisen toteutus (jatkoa edelliseltä sivulta) SqlCommand sqlcmd = new SqlCommand(); sqlcmd.commandtext = "INSERT INTO asiakas (anumero, animi, alahiosoite, apostitoimipaikka, " + "apostinumero, aalennusprosentti, aversio) VALUES (" + asi.asiakasnumero.tostring() + ", '" + asi.nimi + "', '" + asi.lahiosoite + "', '" + asi.postitoimipaikka + "', '" + asi.postinumero + "', " + asi.alennusprosentti.tostring() + ", " + asi.versio.tostring() + ") "; sqlcmd.connection = dbconn; sqlcmd.transaction = dbtrans; sqlcmd.executenonquery(); dbtrans.commit(); b = true; Luodaan SqlCommand-objekti ja asetetaan sen sisällöksi käytetty SQL-lause Kiinnitetään SqlCommand-objektiin SqlConnection-objekti ja SqlTransaction-objekti Suoritetaan SQL-lause Onnistuneen suorituksen jälkeen tehdään transaktiolle Commit eli hyväksytään transaktio. Palautetaan tieto onnistumisesta.

Sovellus toteutettuna siten, että tietokantaan lisääminen onnistuu, löytyy zip-tiedostosta FillariVaihe2.zip Koko sovellus toteutettuna siten, että tietokannan ylläpitäminen onnistuu, löytyy zip-tiedostosta FillariVaihe4.zip