1 / 32

ADO.NET - Pr áca s databázou

ADO.NET - Pr áca s databázou. ADO.NET. ADO.NET představuje soubor tříd pro přístup k datům v technologii .NET. ADO.NET a .NET Framework. Microsoft .NET Framework. Web Services. User Interface. Data and XML. ADO.NET. XML. Base Classes. Common Language Runtime.

felton
Download Presentation

ADO.NET - Pr áca s databázou

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ADO.NET - Práca s databázou

  2. ADO.NET ADO.NET představuje soubor tříd pro přístup k datům v technologii .NET

  3. ADO.NET a .NET Framework Microsoft .NET Framework Web Services User Interface Data and XML ADO.NET XML ... ... Base Classes Common Language Runtime

  4. Základní pojmy a architektura • Základní jmenné prostory • System.Data – třídy reprezentující obecný přístup k datům, bez ohledu na konktrétní databázi (DataSet, DataTable, Constraint) • System.Data.(OleDb|Oracle|SqlClient|Odbc) – třídy poskytovatelů dat (data providers) • System.Data.Common • System.Data.SqlTypes, System.Data.Sql – specifické třídy pro Microsft SQL Server

  5. .NET Data Providers Hierarchie System.Data .OleDb .SqlClient SqlCommandSqlConnectionSqlDataReaderSqlDataAdapter OleDbCommandOleDbConnectionOleDbDataReaderOleDbDataAdapter

  6. Třídy poskytovatelů dat jsou vždy odvozeny od jedné základní třídy a implementují společné rozhraní podle toho, co mají dělat každá třída má čtyři verze, jejichž jména začínají jménem příslušného poskytovatele dat např. (Sql|OleDB|Oracle|ODBC)Connection implementují rozhraní IDbConnection a dědí od třídy DbConnection, umožňují se připojit k databázi

  7. Třídy poskytovatelů

  8. DatabaseConnection • <provider>Connection • třídy representující spojení s databází • spojení je representována řetězcem (connectionstring), který se předá konstruktorunebonastaví ve vlastnosti ConnectionString • příklad řetězce : “server = (local); integrated security = SSPI; database=Northwind” SqlConnectionconn= newSqlConnection(   "server=localhost;database=mojeDatabaze;uid=sa;pwd=");

  9. DatabaseConnection • vlastní spojení se otevře metodou Open • spojení je potřeba nakonec zavřít metodou Close, ideální je následující schéma použití : try { using (SqlConnection c = newSqlConnection(s)) { c.Open(); … ; c.Close() } } catch (SqlException) {…}

  10. RECORD SET • Record set v ADO.NET neexistuje, existoval v ADO • Nahradili ho: • DataReader • DataAdapter • DataSet

  11. DataReader Umožňuje použití souboru záznamů, které jsou výsledkem SQL dotazu. Chová se stejně jako forward-only server-side kursor v klasickém ADO

  12. Príklad Con.Open(); OleDBCommand = new OleDBCommand(“SELECT * FROM Studenti, con”) OleDBDataReader dtr = cmd.ExecuteReader(); While dtr.Read() { listBox.Items.Add(dtr(“meno”)) } … Con.Close();

  13. DataSet a DataAdapter DataSet a DataAdapter, umožňují přenesení dat do lokální cache klienta (tím může být widowsový nebo i webový formulář) a práci s těmito daty i ve stavu, kdy je přerušeno spojení s databází.

  14. DataSet DataSet je výsledkem úsilí spojit klasické ADO s XML datovým formátem DataSet je třída, která se nestará o spojení s databází nebo o SQL dotazy. Jedná se o klientský nástroj pro zpracování dat.

  15. Schema objektu dataTable

  16. Naplnenie DataSetu • Dva spôsoby: • Použití objektu DataAdapter, který vrací výsledek SQL dotazu ve formě XML. • Pracovat přímo s XML. DataSet má metody s jejichž pomocí umí číst a zapisovat XML data a schémata.

  17. IDataAdapter

  18. DataAdapter • adaptér je třída představující spojení do databáze a čtyři příkazy • SelectCommand – slouží k vybrání řádků z databáze • UpdateCommand – ukládání změn v řádcích • InsertCommand – ukládání nových řádků • DeleteCommand – mazání řádků • má metody • Fill, která použije SelectCommand k naplnění daty tabulky v DataSetu • Update, která zavolá příslušné příkazy na řádcích, aby se změny projevily v databázi

  19. DataAdapter příkazy je možno nastavit ručně nebo pomocí třídy providera <provider>CommandBuilder CommandBuilder nastaví ostatní příkazy pomocí již nastaveného SelectCommandu SelectCommand musí vracet alespoň jeden primární klíč nebo alespoň sloupec s UniqueConstraint pokud změníte nějaký parametr SelectCommandu musíte metodou RefreshSchema přegenerovat CommandBuilder metody GetUpdateCommand ap. – vrátí příslušný příkaz

  20. Naplenenie cez DataAdapter OleDbConnection con = new OleDbConnection(conStr); OleDbCommand cmd = new OleDbCommand(“SELECT * FROM Studenti”,con); OleDbDataAdapter da = new OleDbDataAdapter(); Da.SelectCommand = cmd; DataSet ds = new DataSet(); da.Fill(ds,”Studenti”);

  21. Iná možnosť da.Fill() SqlDataAdapter adapter = new SqlDataAdapter(     "select * from zamestnanci",     "server=localhost;database=mojeDatabaze;uid=sa;pwd="); DataSet ds = new DataSet(); adapter.Fill(ds,"zamestnanci");

  22. Update SqlDataAdapter adapter = new SqlDataAdapter("select * from zamestnanci","server=localhost;database=mojeDatabaze;uid=sa;pwd="); DataSet ds = new DataSet(); adapter.Fill(ds,"zamestnanci"); SqlCommandBuilder stavitel = new SqlCommandBuilder(adapter); //Vložení nového řádkuDataTable tabulka = ds.Tables["zamestnanci"]; DataRow novy_radek = tabulka.NewRow(); novy_radek["jmeno"] = "Jan Okoun"; novy_radek["pozice"] = "sef"; novy_radek["adresa"] = "Nekde 12"; novy_radek["telefon"] = "555685"; novy_radek["plat"] = "45000"; tabulka.Rows.Add(novy_radek); //Postoupení změněných řádek zpátky do databázeadapter.Update(ds);

  23. Príklad použitia DataView SqlDataAdapter adapter = new SqlDataAdapter( "select * from zamestnanci","server=localhost;database=mojeDatabaze;uid=sa;pwd="); DataSetds= new DataSet(); adapter.Fill(ds,"zamestnanci"); DataView pohled = new DataView(ds.Tables["zamestnanci"]); pohled.Sort = "jmeno"; pohled.RowFilter = "plat > 20000"; DataGrid.DataSource = pohled; DataGrid.DataBind(); //podla zmeny pohled.RowStateFilter = DataViewRowState.Deleted;

  24. Sql query • Sql príkaz: • SELECT * FROMuzivateleWHEREjmeno=’Maurenc’

  25. Chybná autentifikace – SQL poison bool OveritUzivatele(string login,string heslo){ SqlConnection prip = new SqlConnection ("server=localhost;database=mojeDatabaze;uid=sa;pwd=");try{ prip.Open();SqlCommand prikaz = new SqlCommand ("SELECT count(*) FROM uzivatele WHERE login='"+login+"'"+ "AND heslo='"+heslo+"'",prip);int pocet = (int)prikaz.ExecuteScalar(); return (pocet > 0);}catch(SqlException){returnfalse;}finally{ prip.Close();}}

  26. Možnosti SQl poisoning SELECT count(*) FROM uzivatele WHERE login='Admin' AND heslo='cokoliv' OR 1=1;--‚ Login: cokolivHeslo: x'; INSERT INTO uzivatele VALUES('Hacker','heslo');-- Login: cokolivHeslo: x'; DROP TABLE uzivatele;-- Login: cokolivHeslo: x'; SHUTDOWN WITH NOWAIT;--

  27. Parametrizované príkazy Existujú spôsoby parsovania ako by bolo možné SQL injection predísť Odporučané je ale používať parametrizované príkazy

  28. bool OveritUzivatele(string login,string heslo){ SqlConnection prip = new SqlConnection ("server=localhost;database=mojeDatabaze;uid=sa;pwd="); try{ prip.Open();SqlCommand prikaz = new SqlCommand ("SELECT count(*) FROM uzivatele WHERElogin=@login AND"+ "heslo=@heslo",prip);prikaz.Parameters.Add("@login",SqlDbType.VarChar);prikaz.Parameters.Add("@heslo",SqlDbType.VarChar);prikaz.Parameters["@login"].Value = login;prikaz.Parameters["@heslo"].Value = heslo;int pocet = (int)prikaz.ExecuteScalar();return (pocet > 0); }catch(SqlException){returnfalse;}finally{ prip.Close();}}

  29. bool OveritUzivatele(string login,string heslo){OleDbConnection prip = newOleDbConnection ("provider=sqloledb;server=localhost;database="+ "mojeDatabaze;uid=sa;pwd=");try{ prip.Open();OleDbCommand prikaz = newOleDbCommand ("SELECT count(*) FROM uzivateleWHERE login=? AND"+ "heslo=?",prip);prikaz.Parameters.Add("@login",OleDbType.VarChar);prikaz.Parameters.Add("@heslo",OleDbType.VarChar); prikaz.Parameters["@login"].Value = login;prikaz.Parameters["@heslo"].Value = heslo;int pocet = (int)prikaz.ExecuteScalar();return (pocet > 0);}catch(OleDbException){returnfalse;}finally{ prip.Close();}}

  30. Uložené procedúry CREATEPROCEDURE proc_OveritUzivatele, @loginvarchar(30 ), @heslovarchar(30 ), @pocet int OUTPUTASSELECT @pocet = count(*) FROM uzivatele WHERE login=@login AND heslo=@hesloGO

  31. bool OveritUzivatele(string login,string heslo){ SqlConnection prip = newSqlConnection("server=localhost;database=mojeDatabaze;uid=sa;pwd=");try{prip.Open();SqlCommand prikaz = new SqlCommand("proc_OveritUzivatele",prip);prikaz.CommandType = CommandType.StoredProcedure;prikaz.Parameters.Add("@login",login);prikaz.Parameters.Add("@heslo",heslo);SqlParameter pocet = prikaz.Parameters.Add ("@pocet",SqlDbType.Int);pocet.Direction = ParameterDirection.Output;prikaz.ExecuteScalar();return ((int)pocet.Value > 0); }catch(SqlException){returnfalse;}finally{ prip.Close();}}

More Related