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
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