11.07.2015 Views

Editorial - Vitajte na stránkach www.einsty.hostujem.sk

Editorial - Vitajte na stránkach www.einsty.hostujem.sk

Editorial - Vitajte na stránkach www.einsty.hostujem.sk

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

P R O G R A M U J E M EASP.NET / 10. èas: ADO.NET princípy a komponentyV predošlej èasti sme sa venovali komponentu DataSet <strong>na</strong> prístup k údajom v databáze.Struène sme predstavili aj DataGrid – zobrazovací prvok, ktorý umoòuje výpis údajov zdatabázy vo forme tabu¾ky. Pretoe jed<strong>na</strong> èas seriálu má obmedzený rozsah, volili smestruèné predstavenie týchto komponentov, aby sme mohli vytvori síce jednoduchú, alezato kompletnú databázovú aplikáciu. Teraz <strong>na</strong>stal èas <strong>na</strong> ich podrobnejšie predstaveniea vysvetlenie širších súvislostí.ADO.NET. Triedy objektového modelu ADO.NET môeme rozdeli <strong>na</strong> dve <strong>sk</strong>upiny: sprostredkovatelia údajov (Data Providers alebo Ma<strong>na</strong>ged Providers), konzumenti údajov, <strong>na</strong>príklad formuláre Windows, formuláre webových aplikáciía podobne.Medzi nimi je situovaný objekt DataSet. Pokúsime sa vyjadri zjednodušene tento vzahv textovej forme:Sprostredkovatelia údajov −−− DataSet −−− Konzumenti údajovPozrime sa <strong>na</strong>jprv <strong>na</strong> ¾avú stranu tohto vzahu (obr. 1).Zaèneme súèasami sprostredkovate¾ov údajov.Obr. 1 Vzah Sprostredkovatelia údajov −−− DataSetConnection (objekt pripojenia) slúi <strong>na</strong> fyzické pripojenie k zdroju údajov. Pripojeniemôeme otvori, zatvori, realizova transakcie, prípadne zmeni databázu. Uvedieme prí−klad <strong>na</strong> vytvorenie, otvorenie a zatvorenie pripojenia:Dim strConn As StringstrConn = "Provider=SQLOLEDB;Data Source=(local)" & _"Initial Catalog=Northwind;Trusted_Connection=Yes;"Dim cn As New OleDbConnection(strConn)cn.Open()...cn.Close()Command (objekt príkazu) slúi <strong>na</strong> prácu s príkazmi databázového jazyka SQL, <strong>na</strong>príklad:Dim strConn, strSQL As StringstrConn = "Provider=SQLOLEDB;Data Source=(local);..."Dim cn As New OleDbConnection(strConn)cn.Open()strSQL = "SELECT OrderID, OrderDate FROM Orders " & _"WHERE CustomerID = ?"Dim cmd As New OleDbCommand(strSQL, cn)cmd.Parameters.Add("@CustomerID", OleDbType.WChar, 5)cmd.Parameters("@CustomerID").Value = "ALFKI"Dim rdr As OleDbDataReader = cmd.ExecuteReader()...rdr.Close()cn.Close()Príkazy jazyka SQL môeme rozdeli <strong>na</strong> dve <strong>sk</strong>upiny: <strong>na</strong> výkonné (INSERT, DELETE,UPDATE...), ktoré vyko<strong>na</strong>jú nejakú akciu, <strong>na</strong>príklad pridajú alebo vymaú záz<strong>na</strong>m v data−báze, ale nevracajú iadnu hodnotu, a dopytovacie (SELECT), ktoré vracajú jeden aleboviac záz<strong>na</strong>mov. Pre výkonné príkazy slúi metóda ExecuteNonQuery(), <strong>na</strong>príklad:Dim cn As New OleDbConnection(strConn)cn.Open()strSQL = "DELETE FROM Products WHERE ProductID = ?"Dim cmd As New OleDbCommand(strSQL, cn)cmd.Parameters.Add("@ProductID", OleDbType.Integer)cmd.Parameters("@ProductID").Value = 7Dim intRowsAffected As Integer = cmd.ExecuteNonQuery()Pre dopytovacie príkazy, ktoré vrátia len jeden záz<strong>na</strong>m, teda <strong>sk</strong>alár, slúi metóda Exe−cuteScalar()Dim cn As New OleDbConnection(strConn)cn.Open()Obr. 2 ZákladnáschémaDataSetustrSQL = "SELECT COUNT(OrderID) FROM Orders WHERE CustomerID = ?"Dim cmd As New OleDbCommand(strSQL, cn)cmd.Parameters.Add("@CustomerID", OleDbType.WChar, 5)cmd.Parameters("@CustomerID").Value = "ALFKI"Dim intNumOrders As Integer = cmd.ExecuteScalar()DataReader (objekt <strong>na</strong> èítanie údajov) slúi <strong>na</strong> prácu s údajmi, no len <strong>na</strong> ich dopred−né èítanie. Toto obmedzenie je však vyváené vysokou rýchlosou prístupu k údajom. Uká−eme si príklad èítania údajov pomocou objektu DataReader:Dim strConn, strSQL As StringDim cn As New OleDbConnection(strConn)Dim cmd As New OleDbCommand(strSQL, cn)cn.Open()Dim rdr As OleDbDataReader = cmd.ExecuteReader()Do While rdr.Read()Console.WriteLine(rdr("OrderID"))Console.WriteLine(rdr(1))Console.WriteLine(rdr.GetDateTime(2))Looprdr.Close()cn.Close()Transaction (objekt <strong>na</strong> riadenie transakcií) slúi <strong>na</strong> prácu s údajmi pomocou transak−cií. Databázové servery nám prostredníctvom transakcií umonia zachováva v kadomokamihu konzistenciu údajov v databázových tabu¾kách a nedelite¾nos vykonávanýchzmien <strong>na</strong> princípe „Buï všetko, alebo niè“. Klasická transakcia je takáto: ak klient A pre−vádza fi<strong>na</strong>nènú sumu <strong>na</strong> úèet klienta B, musí sa spomí<strong>na</strong>ná suma <strong>na</strong>j<strong>sk</strong>ôr odpoèíta z úètuklienta A a následne pripoèíta <strong>na</strong> úèet klienta B. Je to triviál<strong>na</strong> operácia, ale len v tom prí−pade, ak všetko prebehne bez problémov. Predstavme si však situáciu, e klient B svojúèet medzièasom zrušil alebo klient A sa pomýlil pri zadávaní èísla úètu klienta B. V ta−komto prípade sa predmetná fi<strong>na</strong>nèná suma odpoèíta z úètu klienta A, ale pre spomí<strong>na</strong>−né príèiny nie je moné uloi tieto peniaze <strong>na</strong> úèet klienta B. Našastie sa niè nestane,pretoe systém riadenia databázy transakciu stornuje a peniaze sa bezpeène vrátia <strong>na</strong>úèet klienta A. Takáto transakcia buï prebehne celá, to z<strong>na</strong>mená, e peniaze sa z úètuodosielate¾a odpoèítajú a pripoèítajú sa <strong>na</strong> úèet príjemcu, alebo sa transakcia zruší a pe−niaze nebudú z úètu odosielate¾a odpoèítané. Priebeh transakcie riadime v jazyku SQL prí−kazmi COMMIT, SAVEPOINT a ROLLBACK. Pomocou objektu Transaction vykonáme jed−noduchú transakciu pomocou kódu:Dim cn As New OleDbConnection(strConn)cn.Open()Dim txn As OleDbTransaction = cn.BeginTransaction()Dim cmd As New OleDbCommand(strSQL, cn, txn)intRowsAffected = cmd.ExecuteNonQuery()If intRowsAffected = 1 Then 'Uspesne ukoncenie transakcie!txn.Commit()Else'Chyba!txn.Rollback()End Ifcn.Close()DataAdapter vytvára adaptér (prepojenie) medzi objektom pripojenia a súborom úda−jov. Obsahuje štyri príkazy – SelectCommand, InsertCommand, DeleteCommand a Up−dateCommand –, ktoré výz<strong>na</strong>movo zodpovedajú príkazom jazyka SQL SELECT, INSERT,DELETE a UPDATE. Príklad kódu:Dim strConn, strSQL As StringDim da As New OleDbDataAdapter(strSQL, strConn)Dim tbl As New DataTable()da.Fill(tbl)...Dim cb As New OleDbCommandBuilder(da)da.Update(tbl)DATASET. Mnohým programátorom èi u klasických de<strong>sk</strong>topových, alebo webovýchdatabázových aplikácií urèite netreba predstavova objekt RecordSet – mnoinu záz<strong>na</strong>mov.Tento objekt má však mnohé obmedzenia. Ako <strong>na</strong>jdôleitejšie spomenieme, e mohol zobra−zi len jednu mnoinu údajov a problematická bola aj práca s relaène zviazanými objektmi.Teda aj <strong>na</strong>priek tomu, e RecordSet bol jednoduchý objekt, nebol dostatoène univerzálny.Naproti tomu DataSet umoòuje prácu s heterogénnymi objektmi, <strong>na</strong>príklad môeme praco−va s viacerými databázovými tabu¾kami v jednom DataSete. A èo je <strong>na</strong>jzaujímavejšie, DataSetdokáe pracova aj v odpojenom reime, èím sa minimalizuje potrebná konektivita <strong>na</strong> data−bázu. DataSet môeme teda povaova za akúsi zjednodušenú relaènú databázu. Keby smechceli zhrnú vlastnosti DataSetu do nieko¾kých bodov, dopadlo by to zhruba takto:DataSet môe pracova s viacerými databázovými tabu¾kami, nemá informácie o zdroji údajov, nesie informácie o všetkých reláciách medzi databázovými tabu¾kami, dá sa s ním ve¾mi pohodlne pracova z h¾adi<strong>sk</strong>a programovania, obsahuje objektypre tabu¾ky, ståpce, relácie...108 PC REVUE 1/2003

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!