Shop Notas de implementação (continuação). 1 Em Resumo 1. Criar o componente ShopClassLibrary com os diversos serviços de Acesso a Dados (implememtar.

Slides:



Advertisements
Apresentações semelhantes
Programação em Java Prof. Maurício Braga
Advertisements

Programação em Java Prof. Maurício Braga
C# e Programação Genérica
Circuitos Lógicos e Organização de Computadores Capítulo 6 – Blocos com Circuitos Combinacionais Ricardo Pannain
ADO.NET (cont.). 1 Acesso a Bases de DadosADO.NET Namespace System.Data Modos de aceder à informação OLE DB – namespace System.Data.OleDb SQL - namespace.
Shop Notas de implementação (continuação). 1 Em Resumo 1. Criar o componente ShopClassLibrary com os diversos serviços de Acesso a Dados (implememtar.
ASP.NET e ADO.NET.
Shop Notas de implementação [Exercício da Disciplina de ADAV]
Tipos de Sites Web gerados pelo VS2005
Maria da Conceição Neves
Criar uma Aplicação Web em ASP.NET v Tipos de Sites Web gerados pelo VS2005 File-system Web sites Ficheiros armazenados num directório local É utilizado.
Personalização Objecto Profile. 1 O objecto Profile O objecto Profile permite armazenar informação única de um utilizador. Quando o utilizador visita.
BD em.NET: Passo a passo conexão com SQL Server 1º Semestre 2010 > PUCPR > BSI Bruno C. de Paula.
Windows Forms 2º Semestre 2010 > PUCPR > TPU Bruno C. de Paula.
Prof. Alessandro J. de Souza
Interação entre objetos
ADT – Arvore Binária de Pesquisa
GESTSOLA v0.1 Trabalho realizado por: Ana Rita Soares Jorge Oliveira Mafalda Oliveira Ricardo Pedrosa Sérgio Tavares.
1 Java: Tratamento de Exceções Alcides Calsavara.
1 MODELAGEM COM A UML (UNIFIED MODELING LANGUAGE) BREVE HISTÓRICO CARACTERÍSTICAS CONCEITOS DE PROGRAMAÇÃO ORIENTADA A OBJETOS MODELAGEM DE ANÁLISE E DE.
Listas Encadeadas Circulares Listas Duplamente Encadeadas
Listas Encadeadas Circulares Listas Duplamente Encadeadas
1 Objetos Relacionados a um banco de dados. 2 Introdução Visual Basic dispõe de um conjunto de objetos, que através de suas propriedades e métodos, nos.
UML NO PROJETO DE COMPONENTES:
1 A Linguagem SQL Todo Banco de Dados apresenta uma Linguagem para definição e uma para manipulação de dados. Com relação aos Bancos de Dados Relacionais,
PL/SQL (Procedural Language/Structured Query Language)
Procedimentos e Funções
Arrays Profa. Isabel Harb Manssour (Material adaptado das aulas dos Profs.: Luciana Nedel, Júlio Machado e Bernardo Copstein) Arrays Exercícios.
Ronaldo Celso Messias Correia
Html5- Desenvolvendo Aplicações. Html5- Introdução a SQL Métodos OpenDatabase (utilizado para criar ou abrir uma Base de Dados); Transaction (permite.
Auditoria de Segurança da Informação
SQL Procedural Junho/2006.
SQL procedural – parte 2.
Subconsultas em SQL. Subconsulta Estrutura geral SELECT.... FROM.... WHERE [at] OPERADOR ( SELECT... FROM... [WHERE... ]) Declaração SELECT localizada.
Funções de Linha 17/04/06. Funções de Linha Gerar ou construir novo valor não existente na tabela inicial. Valor construído a partir de dados de uma ou.
Funções de Linha 24/04/06. Funções de Linha Gerar ou construir novo valor não existente na tabela inicial. Valor construído a partir de dados de uma ou.
Sql-3 ( final ).
Aplicação com PHP Desenvolvendo. Conteúdo parte 2 Um script MySQL para a table (blg_blog.sql) e um script para popular a table com uma conta de administrador.
ITA - Instituto Tecnológico de Aeronáutica Aula #1.1 – Tutorial de Web Services utilizando o NetBeans 5.5 Disciplina: CE 262 – Ontologias e Web Semântica.
Stored Procedure, Function and Trigger
Programação orientada a aspectos com C#
Transporte Escolar Fluvial
A linguagem C#.
Banco de dados Profª Kelly Medeiros.
Microsoft SQL Server 2008 SPARSE. Ambiente de teste Uma tabela é criada com 3 campos: CREATE TABLE [dbo].[Cliente_com_campos_basicos] ( [IdCliente] int.
Calculada a solução óptima
Prof. Eduardo Mantovani Prof. Fábio de P. Santos AES 2007.
Sincronização com Locks. Locks É um mecanismo de sincronização de processos/threads em que estas devem ser programadas de modo que seus efeitos sobre.
INPE / CAP-315 Airam J. Preto, Celso L. Mendes Aula 30 (1) Empacotamento de Dados em MPI Tópicos: Buffer de Mensagem Empacotamento/Desempacotamento.
Vânia Maria Ponte Vidal
Salas de Matemática.
Principais operações em Listas TPA Listas Simples Inserção no Final 1.void insereNofinalDaLista(Lista *l, Elemento e){ 2.Lista paux,p; 3. p.
Tipos de Linguagens do Banco de Dados
Prof. Alessandro Gonçalves
Análise Sintática – Parte 1
Análise e Projeto de Sistemas
Sample Fill LINQ (Language Integrated Query) Objects XML SQL User Data OData.
Funções ou procedures Professor Esp. Diego André Sant’Ana
1 2 Observa ilustração. Cria um texto. Observa ilustração.
Cursor Professor Esp. Diego André Sant’Ana
Os métodos equals() e hashCode()
CALENDÁRIO SEXY Ele & Ela. CALENDÁRIO SEXY Ele & Ela.
Tipos Especiais de Listas
Rio Verde - Goiás - Brasil
Programação Orientada à Objetos
Criação de Tabelas. CREATE TABLE nome_da_tabela ( >>. >> ) Ex.: SQL SERVER 2008 CREATE TABLE pessoa ( CPF VARCHAR(11) NOT NULL, NOME VARCHAR(100) NOT.
GINÁSTICA LABORAL UM NOVO CAMINHO.
Bruno Inojosa MCP.NET Framework.NET com C#. SQL Básico.
ASP.NET Conteúdo Introdução
ADOQuery ADOConnection.
Transcrição da apresentação:

Shop Notas de implementação (continuação)

1 Em Resumo 1. Criar o componente ShopClassLibrary com os diversos serviços de Acesso a Dados (implememtar todos os serviços) 2. Criar um Web Site que será cliente do componente ShopClassLibrary 3. Porque o Web Site vai utilizar serviços do componente é preciso adicionar ao Web Site uma referência ao componente 4. No Web Site criado, no directório App_Data, adicionar a BD existente sales.mdb 5. Atendendo ao pathname da BD actualizar no componente o valor da string de conexão à BD 6. Criar as várias WebForms constituintes do site

2 Implementar na classe Customer o método public DataSet GetByID(string user, string pass, int clientID) { OleDbConnection conn = null; DataSet ds = null; try { // criar objecto de conexão à base de dados e abrir a conexão conn = new OleDbConnection(UtilDB.CONN); conn.Open(); // validar utilizador if (UtilDB.ValidateUser(conn, null, user, pass) !=ShopStatusEnum.OK) return null; // efectuar pesquisa ds = UtilDB.GetByID(conn, null, Customers", CustomerID", clientID); } catch (OleDbException ) { // tratar a excepção!!!! ….. } finally { // fechar a conexão if (conn.State == ConnectionState.Open) conn.Close(); } return ds; }

3 Implementar na classe Customer o método public DataSet FindByName (string user, string pass, string name) { OleDbConnection conn = null; DataSet ds = null; try { // criar objecto de conexão à base de dados e abrir a conexão conn = new OleDbConnection(UtilDB.CONN); conn.Open(); // validar utilizador if (UtilDB.ValidateUser(conn, null, user, pass) !=ShopStatusEnum.OK) return null; // efectuar pesquisa ds = UtilDB.FindByStringField(conn, "Customers", "Name", name); } catch (OleDbException ) { // tratar a excepção!!!! ….. } finally { // fechar a conexão if (conn.State == ConnectionState.Open) conn.Close(); } return ds; }

4 static public DataSet FindByStringField(string table, string field, string key) { OleDbConnection conn = null; DataSet ret = new DataSet(); try { // criar objecto de conexão à base de dados conn = new OleDbConnection(UtilDB.CONN); // invocar método auxiliar ret = FindByStringField(conn, table, field, key); } catch (OleDbException ex) { // tratar a excepção!!!! System.Console.WriteLine("EXCEPÇÃO no componente 'UtilDB': " + ex); } finally { // fechar a conexão if (conn != null && conn.State != ConnectionState.Closed) conn.Close(); } // retornar valo return ret; }

5 static public DataSet FindByStringField(OleDbConnection conn, string table, string field, string key) { DataSet ret = new DataSet(); try { // criar um Datadapter para executar o comando e devolver o ret OleDbDataAdapter da = new OleDbDataAdapter( "SELECT * FROM " + table + " WHERE " + field + " LIKE ?", conn); da.SelectCommand.Parameters.AddWithValue("key", key + "%"); // executar o comando e preencher um Dataset da.Fill(ret, table); } catch (OleDbException ex) { // tratar a excepção!!!! System.Console.WriteLine( "EXCEPÇÃO no componente 'UtilDB': " + ex); } // retornar valor return ret; }

6 Interface associada à Pesquisa de Cliente por ID Pesquisar Cliente ClienteID O Cliente não existe Pesquisar Visible true or false

7 Página Pesquisa.aspx.cs public partial class PesquisarID : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Label2.Visible = false; DetailsView1.Visible = false; } } protected void Button1_Click(object sender, EventArgs e) { DetailsView1.Visible = false; Label2.Visible = false; long idCustomer = long.Parse(TextBox1.Text); ICustomer customer = Factory.CreateCustomerService(); DataSet ds = customer.GetByID("Joao", "Joao", idCustomer); try { if (ds.Tables[0].Rows.Count != 0) { DetailsView1.Visible = true; DetailsView1.DataSource = ds; DetailsView1.DataBind(); } else Label2.Visible = true; } catch (System.Exception) { Label2.Visible = true; } }

8 public long Add(string user, string pass, string name, string address, string phone, string fax, string , out ShopStatusEnum status) { long customerID = -1; OleDbConnection conn = null; // validar dados de entrada if (name == null || name.Trim().Length == 0) { status = ShopStatusEnum.InvalidArgument; return -1; } try { // criar objecto de conexão à base de dados e abrir a conexão conn = new OleDbConnection(UtilDB.CONN); conn.Open(); // validar o utilizador status = UtilDB.ValidateUser(conn, null, user, pass); if (status != ShopStatusEnum.OK) return -1; Implementar na classe Customer o método

9 // criar comando SQL a executar string sqlCmd = "INSERT INTO Customers (Name, Address, PhoneNb, FaxNb, ) Values (?, ?, ?, ?, ?)"; OleDbCommand cmd = new OleDbCommand(sqlCmd, conn); cmd.Parameters.AddWithValue("name", name); if (address == null || address.Length == 0) cmd.Parameters.AddWithValue("address", DBNull.Value); else cmd.Parameters.AddWithValue("address", address); if (phone == null || phone.Length == 0) cmd.Parameters.AddWithValue("phone", DBNull.Value); else cmd.Parameters.AddWithValue("phone", phone); if (fax == null || fax.Length == 0) cmd.Parameters.AddWithValue("fax", DBNull.Value); else cmd.Parameters.AddWithValue("fax", fax); if ( == null || .Length == 0) cmd.Parameters.AddWithValue(" ", DBNull.Value); else cmd.Parameters.AddWithValue(" ", ); // executar o comando // int insRows = cmd.ExecuteNonQuery( );

10 // verificar o resultado if (insRows == 0) // não inseriu registo status = ShopStatusEnum.NOT_OK; else { // inseriu registo // obter novo código de id gerado pela BD OleDbCommand idCmd = new OleDbCommand( "SELECT conn); customerID = (int)idCmd.ExecuteScalar(); status = ShopStatusEnum.Ok; } catch (OleDbException ex) { // tratar a excepção!!!! status = ShopStatusEnum.ERROR; } finally { // fechar a conexão if (conn != null && conn.State == ConnectionState.Open) conn.Close( ); } return customerID; }

11 Implementar na classe Customer o método public DataSet getAll(string user, string pass) { OleDbConnection conn; ShopStatusEnum status; try { // criar objecto de conexão à base de dados e abrir a conexão conn = new OleDbConnection(UtilDB.CONN); conn.Open(); // validar o utilizador status = UtilDB.ValidateUser(conn, null, user, pass); if (status != ShopStatusEnum.OK) return null; DataSet ds = UtilDB.getAllFromTable(conn, "Customers"); return ds; } catch (System.Exception) { return null; }

12 Interface associada à Inserção de Cliente Inserir Cliente Name Registo inserido / não inserido Inserir Phone Address Fax

13 protected void ButtonInserir_Click(object sender, EventArgs e) { try { ShopStatusEnum st; string user = "Joao"; string pass = "Joao"; string name = TextBox1.Text; string address = TextBox2.Text; string phone = TextBox3.Text; string fax = TextBox4.Text; string = TextBox5.Text; ICustomer customer = Factory.CreateCustomerService(); long id = customer.Add(user, pass, name, address, phone, fax, , out st); if (id == -1) { Label6.Text = "Registo Não Inserido"; Label6.Visible = true; } else { Label6.Text = "Registo Inserido. ID=+id.ToString(); Label6.Visible = true; TextBox1.Text = ""; TextBox2.Text = ""; TextBox3.Text = ""; Textox4.Text = ""; Textox5.Text = ""; } } catch (SystemException) { } }

14 Interface associada a Encomenda de Cliente Venda Cliente Produtos Comprados Add Produto Quantidade Fechar Facturta

15 Carregar as DropDownLists ICustomer clientes = Factory.CreateCustomerService(); DataSet dsClientes = clientes.getAll("Joao", "Joao"); if (dsClientes != null) { DropDownList1.DataTextField = "Name"; DropDownList1.DataValueField = "CustomerID"; DropDownList1.DataSource = dsClientes; DropDownList1.DataBind(); } IProduct produtos = Factory.CreateProductService(); DataSet dsProdutos = produtos.GetAll("Joao", "Joao"); if (dsProdutos != null) { DropDownList2.DataTextField = "Description"; DropDownList2.DataValueField = "ProductID"; DropDownList2.DataSource = dsProdutos; DropDownList2.DataBind(); }

16 Criar DataSet Vazio a partir da tabela SaleDetails ISale2 sale = Factory.CreateSale2Service(); DataSet dsDetalhes = sale.CreateDetails("Joao", "Joao"); //adicionar ao DataSet nova coluna Produto dsDetalhes.Tables[0].Columns.Add( "Produto"); //guardar o DataSet numa variável de Session Session["Detalhes"] = dsDetalhes;

17 public DataSet CreateDetails(string User, string Pass) { OleDbConnection conn = null; DataSet ds; try { // criar objecto de conexão à BD e abrir a conexão conn = new OleDbConnection(UtilDB.CONN); conn.Open(); // validar o utilizador if (UtilDB.ValidateUser(conn, null, User, Pass) !=ShopStatusEnum.OK) return null; // criar o dataset ds = UtilDB.GetById(conn, null, "SaleDetails", "SaleID", -1); if (ds == null) return null; // configurar as colunas para utilização ds.Tables["SaleDetails"].Columns["SaleID"].AllowDBNull = true; } catch (OleDbException ex) { // tratar a excepção!!!! return null; } finally { // fechar a conexão if (conn.State == ConnectionState.Open) conn.Close(); } return ds; } Implementar na classe Sales o método

18 Página Sales.aspx.cs public partial class Sales : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ICustomer clientes = Factory.CreateCustomerService(); DataSet dsClientes = clientes.getAll("Joao", "Joao"); if (dsClientes != null) { DropDownList1.DataTextField = "Name"; DropDownList1.DataValueField = "CustomerID"; DropDownList1.DataSource = dsClientes; DropDownList1.DataBind(); } IProduct produtos = Factory.CreateProductService(); DataSet dsProdutos = produtos.GetAll("Joao", "Joao"); if (dsProdutos != null) { DropDownList2.DataTextField = "Description"; DropDownList2.DataValueField = "ProductID"; DropDownList2.DataSource = dsProdutos; DropDownList2.DataBind(); } GridView1.Visible = false; ISale2 sale = Factory.CreateSale2Service(); DataSet dsDetalhes = sale.CreateDetails("Joao", "Joao"); dsDetalhes.Tables[0].Columns.Add("Produto"); Session["Detalhes"] = dsDetalhes; } }

19 GridView RowCreated Event O evento RowCreated é accionado quando cada linha da Gridview é criada. Para esconder colunas da GridView Aceder a uma célula específica da linha e.Row.Cells[0].Visible = false; EXEMPLO protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { e.Row.Cells[0].Visible = false; e.Row.Cells[1].Visible = false; e.Row.Cells[3].Visible = false; }

20 Acrescentar linhas de encomenda Obter dados do Cliente Obter dados do produto Obter quantidade Aceder ao DataSet Detalhes guardado em Session para actualizar Criar nova linha Preencher campos Adicionar linha ao data set Guardar o novo DataSet Detalhes em Session Visualizar o dataSet na Gridview

21 Evento associado a Adicionar linha encomenda protected void Button1_Click(object sender, EventArgs e { // Obter dados string clienteID = DropDownList1.SelectedValue; string produtoID = DropDownList2.SelectedValue; string produtoname = DropDownList2.SelectedItem.Text; int qtd = int.Parse(TextBox1.Text); // Obter DataSet de variável de Session DataSet dsDetalhes = (DataSet)Session["Detalhes"]; // Criar linha na tabela 0 do data Set DataRow dr = dsDetalhes.Tables[0].NewRow(); // Preencher campos da linha dr["ProductID"] = produtoID; dr["Quantity"] = qtd; dr["Produto"] = produtoname; // Acrescentar linha à Tabela dsDetalhes.Tables["SaleDetails"].Rows.Add(dr); // Actualizar GridView GridView1.DataSource = dsDetalhes; GridView1.DataBind(); GridView1.Visible = true; // Guardar DataSet em variável de Session Session["Detalhes"] = dsDetalhes; }

22 Evento associado a Fechar Encomenda protected void Button2_Click(object sender, EventArgs e) { DataSet dsDetalhes = (DataSet)Session["Detalhes"]; ISale2 sale = Factory.CreateSale2Service(); sale.Add("Joao", "Joao", 22, DateTime.Now, dsDetalhes); GridView1.Visible = false; Button2.Visible = false; }

23 Método Add da classe Sales.cs public ShopStatusEnum Add(string User, string Pass, int CustomerID, DateTime Date, DataSet RsDetails) { //Abrir conexão com a BD conn = new OleDbConnection(UtilDB.CONN); conn.Open(); //Iniciar Transacção tx = conn.BeginTransaction(); //Validar User Pass if (UtilDB.ValidateUser(conn, tx, User, Pas s) != ShopStatusEnum.Ok) return ShopStatusEnum.InvalidLogOn; //Validar Cliente DataSet dsCust = UtilDB.GetById(conn, tx, "Customers", "CustomerID", CustomerID); if (dsCust.Tables["Customers"].Rows.Count == 0) return ShopStatusEnum.InvalidCustomerId; …

24 Validar Produtos e Quantidade… if (RsDetails.Tables["SaleDetails"].Rows.Count == 0) return ShopStatusEnum.InvalidArgument; int[ ] listaProd = new int[RsDetails.Tables["SaleDetails"].Rows.Count]; int i = 0; foreach (DataRow regDetails in RsDetails.Tables["SaleDetails"].Rows) { if (regDetails.IsNull("ProductID")) return ShopStatusEnum.InvalidArgument; if (regDetails.IsNull("Quantity")) return ShopStatusEnum.InvalidArgument; // verificar se este produto tem quantidade suficiente em stock e se existe! Product p = new Product(); ret = p.InStock(conn, tx, (int)regDetails["ProductID"], (int)regDetails["Quantity"]); if (ret != ShopStatusEnum.Ok) return ret; //guardar o código de produto para pesquisar listaProd[i++] = (int)regDetails["ProductID"]; }

25 RsDetails DataSet Detalhes da Encomenda //Criar um DataSet de produtos e preencher apenas com os produtos desejados DataSet pDS = UtilDB.GetById(conn, tx, "Products", "ProductID", listaProd) if (pDS == null) return ShopStatusEnum.InvalidProductId; //Calcular custo por linha foreach (DataRow regDetails in RsDetails.Tables["SaleDetails"].Rows) { // procurar o produto desejado DataRow[ ] row = pDS.Tables["Products"].Select("ProductId=" + regDetails["ProductID"].ToString()); // calcular custo desta linha da venda regDetails["TotalCost"] = (int)regDetails["Quantity"] * (float)row[0]["UnitPrice"]; }

26 Inserir Venda // criar comando para inserção OleDbCommand cmd = new OleDbCommand("INSERT INTO sales (customerid, dateofsale) VALUES (?, ?)", conn); cmd.Transaction = tx; cmd.Parameters.AddWithValue("custid", CustomerID); OleDbParameter parm = cmd.Parameters.Add("dt", OleDbType.Date); parm.Value = Date; // inserir registo cmd.ExecuteNonQuery(); // obter id autogerado OleDbCommand cmd2 = new OleDbCommand("SELECT conn); cmd2.Transaction = tx; int id = (int)cmd2.ExecuteScalar();

27 // inserir chave estrangeira nas linhas de detalhe foreach (DataRow regDetails in RsDetails.Tables["SaleDetails"].Rows) { regDetails["SaleID"] = id; } // inserir linhas de detalhe OleDbDataAdapter da = new OleDbDataAdapter( "SELECT * FROM SaleDetails", conn); da.SelectCommand.Transaction = tx; OleDbCommandBuilder cb = new OleDbCommandBuilder(da); da.Update(RsDetails, "SaleDetails"); //

28 RsDetails DataSet Detalhes da Encomenda //actualizar quantidades de produto em stock OleDbCommand cmd3 = new OleDbCommand( "UPDATE Products SET StockQtd=StockQtd-? WHERE ProductId=?", conn); cmd3.Transaction = tx; OleDbParameter p1 = cmd3.Parameters.Add("qtd", OleDbType.Integer); OleDbParameter p2 = cmd3.Parameters.Add("pid", OleDbType.Integer); foreach (DataRow regDetails in RsDetails.Tables["SaleDetails"].Rows) { p1.Value = regDetails["Quantity"]; p2.Value = regDetails["ProductID"]; cmd3.ExecuteNonQuery(); } // fechar transacção tx.Commit();

29 verifica se existe uma determinada quantidade de um produto em armazem. internal ShopStatusEnum InStock (OleDbConnection conn, OleDbTransaction tx, int ProductID, int Quant) { DataSet rs = UtilDB.GetById(conn, tx, "Products", "ProductID", ProductID); if (rs == null) return ShopStatusEnum.NotOk; // validar stock if (rs.Tables["products"].Rows.Count > 0) return ((int)(rs.Tables["Products"].Rows[0]["StockQtd"]) >= Quant ? ShopStatusEnum.Ok :ShopStatusEnum.InsufficientStock); else return ShopStatusEnum.InvalidProductId; }

30 Em UtilDB GetByID static public DataSet GetById(OleDbConnection conn, OleDbTransaction tx, string table, string keyName, int[] keys) { DataSet ds = null; try { // criar objecto DataSet ds = new DataSet(); // criar um Datadapter para executar o comando e devolver o datase System.Text.StringBuilder sb = new System.Text.StringBuilder("Select * From " + table + " Where " + keyName + " IN ("); foreach (int k in keys) { sb.Append(k.ToString()); sb.Append(","); } sb.Length = sb.Length - 1; sb.Append(")"); string sSqlCmd = sb.ToString(); OleDbDataAdapter oAdapter = new OleDbDataAdapter(sSqlCmd, conn); oAdapter.SelectCommand.Transaction = tx; // executar o comando e preencher um Dataset oAdapter.Fill(ds, table); } catch (OleDbException ex) { // tratar a excepção!!!! System.Console.WriteLine("EXCEPÇÃO no método 'UtilDB.GetByID': " + ex.Message); ds = null; } return ds; }