ADO.NET Access Data Object (cont.)
What is a Dataset? DataTable DataSet DataTable DataTable SqlDataAdapter SqlConnection OleDbDataAdapter Web server memory Physical storage SQL Server 2000 OleDbConnection OleDb Database 1
Data Adapters DataSet DataAdapter SelectCommand UpdateCommand InsertCommand DeleteCommand DataReader Command Command Command Command Connection sp_select sp_update sp_insert sp_delete Database 2
DataAdapter Store the query in a DataAdapter SqlDataAdapter da = new SqlDataAdapter ("select * from Authors",conn); SelectCommand Properties da.selectcommand.commandtext da.selectcommand.connection Definir os comandos InsertCommand, UpdateCommand, and DeleteCommand, se necessário da.insertcommand da.updatecommand 3
Creating a DataSet Create a DataSet Fill executa o SelectCommand DataSet ds = new DataSet(); da.fill(ds, "Authors"); Access a DataTable ds.tables["authors"].rows.count; string str=""; foreach(datarow r in ds.tables["authors"].rows) { str += r[2]; str += r["au_lname"]; } 4
DataAdapder / DataSet DataSource de um Controlo string strconn="provider=microsoft.jet.oledb.4.0;. String strsql= "Select * from Produtos where IdCat= + id; conn=new OleDbConnection(); conn.connectionstring=strconn; OleDbDataAdapter da; da = new OleDbDataAdapter (strsql,conn); DataSet ds= new DataSet(); da.fill(ds, Produtos ); //Populating DataSet gvprodutos.datasource=ds; gvprodutos.databind(); 5
DataAdapder / DataSet Aceder às tabelas no DataSet Usar Tables para aceder à tabela Produtos Objecto DataTable DataTable dt =dataset.tables[ Produtos"] Aceder às linhas da tabela Usar Rows Objecto DataRow DataRow dr= dataset.tables["produtos ].Rows[0]; foreach (DataRow dr in dataset.tables[ Produtos"].Rows) 6
Data-Bound Web Server Controls ASP.NET Data-Bound Web Server Controls GridView displays data as a table and provides the capability to sort columns, page through data, and edit or delete a single record DetailsView renders a single record at a time as a table and provides the capability to page through multiple records, as well as to insert, update, and delete records. FormView renders a single record at a time from a data source and provides the capability to page through multiple records, as well as to insert, update, and delete records. FormView control does not specify a built-in layout. 7
Data-Bound Web Server Controls Repeater renders a read-only list from a set of records returned from a data source. Repeater control does not specify a built-in layout. DataList renders data as table and enables you to display data records in different layouts, such as ordering them in columns or rows ASP.NET Data-Bound Web Server Controls Overview https://msdn2.microsoft.com/en-us/library/ms228214.aspx 8
Data-Bound Web Server Controls Edit, Update, Delete e Insert num Data-Bound Web Server Controls Exemplificado com um DetailView As propriedades e eventos são semelhantes para os outros controlos Todos os métodos não estão protegidos para salientar o código ADO e programação dos eventos Cada método deveria: Tratar excepções Validar parâmetros de entrada 9
DetailsView Populate DetailsView void binddetailview() { DataAccess dal = new DataAccess(); DataSet ds = dal.getdatasetprodutos(); DetailsView1.DataSource = ds; DetailsView1.DataBind(); } } 10
DetailsView Configuration 11
DetailsView Events: DataBinding Occurs when the server control binds to a data source. (inherited from Control) ItemCreated Occurs when a record is created in a DetailsView control. ItemDeleted Occurs when a Delete button within a DetailsView control is clicked, but after the delete operation. ItemDeleting Occurs when a Delete button within a DetailsView control is clicked, but before the delete operation. ItemInserting Occurs when an Insert button within a DetailsView control is clicked, but before the insert operation. ItemUpdated Occurs when an Update button within a DetailsView control is clicked, but after the update operation. 12
Events: ItemUpdating Occurs when an Update button within a DetailsView control is clicked, but before the update operation. Load Occurs when the server control is loaded into the Page object. (inherited from Control) ModeChanging Occurs when a DetailsView control attempts to change between edit, insert, and read-only mode, but before the CurrentMode property is updated. PageIndexChanged Occurs when the value of the PageIndex property changes after a paging operation. PageIndexChanging Occurs when the value of the PageIndex property changes before a paging operation. http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.detailsview_events.aspx 13
DetailsView Paging Property: AllowPaging=true; Event : PageIndexChanging Property: PageIndex protected void DetailsView1_PageIndexChanging(object sender, DetailsViewPageEventArgs e) { DetailsView1.PageIndex = e.newpageindex; binddetailview(); } 14
DetailsView Edit Property: AutoGenerateEditButton=true; Event: ModeChanging Property: DetailsViewMode (Edit, Insert, ReadOnly ) protected void DetailsView1_ModeChanging(object sender, DetailsViewModeEventArgs e) { if ( e.newmode == DetailsViewMode.Edit) { DetailsView1.ChangeMode(DetailsViewMode.Edit); } else if (DetailsView1.CurrentMode == DetailsViewMode.Edit && e.cancelingedit) { DetailsView1.ChangeMode(DetailsViewMode.ReadOnly); }... 15
DetailsView DetailsView Structure (GridView, FormView, etc) Contains a collection of Rows Row contains a collection of Cells Cell contains a collection of Controls Rows[0] Cells[0] Cells[1] Controls[0] > (TextBox) nome=((textbox)detailsview1.rows[2].cells[1].controls[0]).text; 16
DetailsView Fields Values protected void getdetailsview_values() { idcat = Convert.ToInt32(((TextBox)DetailsView1.Rows[1].Cells[1]. Controls[0]).Text); nome = ((TextBox)DetailsView1.Rows[2].Cells[1].Controls[0]).Text; preco = Convert.ToDouble(((TextBox)DetailsView1.Rows[3].Cells[1]. Controls[0]).Text); stock = Convert.ToInt32(((TextBox)DetailsView1.Rows[4].Cells[1]. Controls[0]).Text); } 17
DetailsView Update Event: ItemUpdating protected void DetailsView1_ItemUpdating(object sender, DetailsViewUpdateEventArgs e) { int idprod = Convert.ToInt32(DetailsView1.DataKey.Value); DataAccess dal = new DataAccess(); getdetailsviewvalues(); dal.updateproduct(idprod,idcat,nome,preco,stock); DetailsView1.ChangeMode(DetailsViewMode.ReadOnly); binddetailview(); } 18
DetailsView Insert ( New) Property: AutoGenerateInsertButton Event: ItemInserting protected void DetailsView1_ItemInserting(object { sender, DetailsViewInsertEventArgs e) DataAccess dal = new DataAccess(); getdetailsviewvalues(); dal.insertproduct(idcat, nome, preco, stock); DetailsView1.ChangeMode(DetailsViewMode.ReadOnly); binddetailview(); } 19
DetailsView Delete Property: AutoGenerateDeleteButton=true; Event: ItemDeleting protected void DetailsView1_ItemDeleting(object sender, DetailsViewDeleteEventArgs e) { DataAccess dal = new DataAccess(); int idprod = Convert.ToInt32(DetailsView1.DataKey.Value); dal.deleteproduct(idprod); binddetailview(); } 20
Métodos na Class Data Access Layer getconnection private OleDbConnection getconnection() { } string strcon = DEFAULT_CONN + DEFAULT_DBPATH; OleDbConnection conn = new OleDbConnection(); conn.connectionstring = strcon; conn.open(); return conn; 21
Métodos na Classe Data Access Layer getdatasetproduts public DataSet getdatasetprodutos() { } OleDbConnection conn = getconnection(); OleDbCommand cmd = new OleDbCommand(); cmd.connection = conn; string strsql = "select * from Produtos "; cmd.commandtext = strsql; OleDbDataAdapter da = new OleDbDataAdapter(); da.selectcommand = cmd; DataSet ds = new DataSet(); da.fill(ds); return ds; 22
Métodos na Class Data Access Layer updateproduct public int updateproduct(int idprod, int idcat,string nomeprod,double preco, int stock) { string strsql = "update Produtos SET IdCat=?, NomeProd=?, Preco=?, Stock=? where IdProd=?"; OleDbConnection conn = getconnection(); OleDbCommand cmd = new OleDbCommand(); cmd.connection = conn; cmd.commandtext = strsql; cmd.parameters.addwithvalue("idcat", idcat); cmd.parameters.addwithvalue("stock", stock); cmd.parameters.addwithvalue("idprod", idprod); int result=cmd.executenonquery(); conn.close(); return result; } 23
Class Data Access Layer insertproduct public int insertproduct( int idcat, string nomeprod, double preco, int stock){ string strsql = "insert into Produtos (IdCat, NomeProd, Preco, Stock ) values(?,?,?,?)"; OleDbConnection conn = getconnection(); OleDbCommand cmd = new OleDbCommand(); cmd.connection = conn; cmd.commandtext = strsql; cmd.parameters.addwithvalue("idcat", idcat); cmd.parameters.addwithvalue("nomeprod", nomeprod); cmd.parameters.addwithvalue("preco", preco); cmd.parameters.addwithvalue("stock", stock); int idprod = cmd.executenonquery(); conn.close(); return idprod; } 24
Class Data Access Layer deleteproduct public int deleteproduct(int idprod) { } string strsql = "Delete from Produtos where IdProd=?"; OleDbConnection conn = getconnection(); OleDbCommand cmd = new OleDbCommand(); cmd.connection = conn; cmd.commandtext = strsql; cmd.parameters.addwithvalue("idprod", idprod); int res = cmd.executenonquery(); conn.close(); return res; 25