Criação de uma DAL com Typed DataSets

Documentos relacionados
Iniciar o Data Adapter Configuration Wizard. Toolbox Data Duplo clique em OleDbDataAdapter. Botão next na caixa de diálogo

Revisão / Exercícios. Prof. Márcio Bueno. {bd2tarde,bd2noited}@marciobueno.com


Tarefa Orientada 5 Aplic. Manutenção de Facturas de Clientes

A interface IDataSource retorna dados em formato tabular e disponibiliza apenas dois métodos: GetView e GetViewNames. O primeiro,

Acesso a Dados ADO.NET

Acesso a Dados: com Wizard (sem escrever código), e Programaticamente

Criar uma aplicação JPA2 com EclipseLink e H2

Tarefa Orientada 2 Aplic. Manutenção de Produtos - DataGridView

Acesso a Dados com Wizard (sem escrever código) e Programaticamente

Connection String usada por uma Class Library

C# - Conexão com MySQL

Repeater no GASweb. Regiões

Bases de Dados. Lab 1: Introdução ao ambiente

Criação de uma aplicação Web ASP.NET MVC usando Code First

Guia e Utilização do Visual Studio 6.0

Os dados no MySQL são armazenado em tabelas. Uma tabela é uma colecção de informação relacionada e consiste em colunas e linhas.

Tarefa Orientada 15 Manipulação de dados

ASP.NET Gerando relatórios com o ReportViewer

Microsoft Visual Studio 2010 C# Volume II

1 Criar uma entity a partir de uma web application que usa a Framework JavaServer Faces (JSF)

Reconhecer alguns dos objectos VBA Automatizar bases de dados recorrendo à programação VBA e scripts SQL

Consulta de endereço através do Cep

MicroMIX Comércio e Serviços de Informática, Lda.

Veja abaixo um exemplo de como os dados são mostrados quando usamos o

Tarefa Orientada 19 Triggers

Construindo Aplicações com ASP.NET MVC 2.0 Aula 03 Luiz Alberto Ferreira Gomes. Ciência da Computação da PUC Minas

A VISTA BACKSTAGE PRINCIPAIS OPÇÕES NO ECRÃ DE ACESSO

Aplicação ReadWriteData

PACWEB Módulo de Pesquisa MANUAL DO UTILIZADOR

INTRODUÇÃO AO MODELO ADO.NET (DESCONECTADO)

Criando uma aplicação Web em C# usando o NHibernate

Tarefa Orientada 16 Vistas

Sistemas de Bases de Dados Relacionais Introdução ao SQL. Interrogações diversas sobre a Base de Dados Northwind

Bases de Dados. O ficheiro create-bank.sql contém um conjunto de instruções SQL para criar a base de dados de exemplo ilustrada na figura 1.

Tutorial exe elearning XHTML editor (versão 1.0x)

Banco de Dados. Conversão para o Banco de Dados SisMoura

Microsoft Office FrontPage 2003

Com criar relatório no Report Services do Microsoft SQL Server 2008 R2 integrado com o

ETEC DR. EMÍLIO HENRNANDEZ AGUILAR PROGRAMAÇÃO DE COMPUTADORES II PROFESSOR RAFAEL BARRETO DELPHI FORMULÁRIO COM ABAS E BUSCAS DE REGISTROS

Figura 1. Figura 2. Prova Escrita de Base de Dados 5 Novembro V2 Número do Aluno: Nome do Aluno: 1º Teste (90 Minutos)

Bases de Dados 1º semestre

Criação de um Web Services em.net

! "! # $ " % & ' ( # ( ) Página: 1

Criação de um Web Services em.net

Tarefa Orientada 1 Base de Dados Editora

Aplicações de Escritório Electrónico

Bases de Dados 2007/2008. Aula 1. Referências

Módulo 3936 ASP.NET. Financiado pelo FSE

Tarefa 18: Criar Tabelas Dinâmicas a partir de Listas de Excel

A interface do Microsoft Visual Studio 2005

Prática em Laboratório N.04 (Parte 01) Criando uma aplicação composta a partir de um serviço Web

1 Code::Blocks Criação de projetos

ASP.Net com MySQL Connector/Net 6.2.5

Tutorial de Aplicação Simples usando Web Forms e MySQL. Luiz Eduardo Guarino de Vasconcelos

Google Sites. A g r u p a m e n t o C a m p o A b e r t o /

Guia Rápido do Contacts

Manual de Administração Intranet BNI

Login. Criar um novo website File > New > WebSite Framework 4.5 Visual C# ASP.NET Empty Web Site Nome do projeto: WebLogin

Forms Authentication em ASP.NET

MICROSOFT POWERPOINT

Bases de Dados 2007/2008. Aula 9

Projeto de Banco de Dados: Empresa X

MANUAL DO UTILIZADOR

No final desta sessão o formando deverá ser capaz de aceder ao Word e iniciar um novo documento.

COMPETÊNCIAS BÁSICAS EM TIC NAS EB1

7.3. WINDOWS MEDIA PLAYER 12

Oficina de Construção de Páginas Web

MANIPULANDO BANCO DE DADOS NO POSTGRESQL SEM FAZER USO DE COMANDOS SQL

Revisando sintaxes SQL e criando programa de pesquisa. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

Aula 06 Usando controles em ASP.NET

Criar um formulário do tipo Diálogo modal ; Alterar a cor de fundo de um formulário; Inserir botões de comando e caixas de texto;

Criando uma agenda simples com NetBeans 6.5

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE ESCOLA AGRÍCOLA DE JUNDIAÍ EAJ - PRONATEC / REDE etec MÓDULO III DESENVOLVIMENTO PROFESSOR ADDSON COSTA

ZS Rest. Manual Profissional. BackOffice Mapa de Mesas. v2011

P S I 2. º A N O F 5 M E S T R E / D E T A L H E E P E S Q U I S A. Criar uma relação mestre-detalhe. Pesquisa de informação

Aprenda como instalar o plugin EclipseUML no Eclipse e como utilizá-lo para fazer engenharia reversa de seu código-fonte.

Neste tutorial irá criar uma animação simples com base num desenho do Mechanical Desktop.

Manual de Instruções para a Criação de Ficheiros CSR. Microsoft IIS 5/6

Tarefa Orientada 2 Criar uma base de dados

Universidade da Beira Interior. Sistemas Distribuídos /2015 Curso: Engª Informática. Folha 11. JAX-RS: Java API for RESTful Web Services

Gabarito - Programação C# com Visual Studio - Intermediário - 05/08/2013 AULA Perguntas e Respostas

5 - Se o documento estiver completo, com os campos totalmente inseridos e com o aspecto que pretende, poderá guardá-lo.

[Documentação de Utilização Correio Electrónico dos Estudantes da ESTM]

Tarefa Orientada 18 Procedimentos armazenados

Relatórios com Rave Reports

Trabalhando com XML RENATO CORREIA DE MATOS


EXCEL TABELAS DINÂMICAS

MySQL Query Browser. Professor Victor Sotero SGD

Alguns truques do Excel. 1- Títulos com inclinação. 2- Preencha automaticamente células em branco

Tutorial EPF Básico. 1)Vá a File-> New->Method Library. Escolha uma pasta para criar a Method Library.

Administração da disciplina

Transcrição:

Criação de uma DAL com Typed DataSets Do tutorial: Creating a Data Access Layer de Scott Mitchell http://www.asp.net/data-access/tutorials/creating-a-data-access-layer-cs 1. Abrir o Projecto Base Duplo clique no ficheiro.sln Já está adicionada a base de dados NORTHWIND.MDF ao App_Data Alternativa: criação desta versão inicial do programa (Projecto Base) (Step 1 do Tutorial) A. Criar uma Solução File > New Project > Other Project Types > Visual Studio Solutions > Blank Solution > TutorialDALeBLL B. Adicionar à solução uma Aplicação Web Na Solução : Add > New Web Site > ASP.NET Empty Web Site WebSite C. Adicionar à Aplicação Web a base de dados NORTHWND.MDF: No Projecto WebSite Add ASP.NET Folder > App_Data No App-Data Add Existing Item > NORTHWND.MDF D. Adicionar à Aplicação Web 4 páginas: AllProducts.aspx Beverages.aspx NewProduct.aspx SuppliersAndProducts.aspx

Colocar em cada página um cabeçalho, escrever o texto, seleccioná-lo, e clicar em Heading 1 <h1>. A seguir ao cabeçalho, colocar um controlo GridView, e em GridView Tasks, AutoFormat seleccionar um esquema de formatação. E. Adicionar à solução uma Class Library para a camada de acesso a dados: DAL Na Solução : Add > New Project > (Visual C#) Class Library DAL Apagar a classe Class1.cs automaticamente adicionada à Class Library DAL. F. Adicionar à Aplicação Web uma referência para a Class Library DAL 2. Adicione um Typed DataSet (Step 2 do Tutorial) Na Class library DAL Add New Item > DataSet Northwind.xsd (Adiciona o dataset à class library DAL) O ficheiro Northwind.xsd abre em modo Design, visualizando-se a janela DataSet Designer. O dataset fortemente tipado adicionado ao Projecto DAL não inclui informação sobre como aceder aos dados de qualquer tabela da base de dados. Essa informação irá estar contida nos tableadapters. Um dataset tipado é composto de instâncias datatable tipadas, cada uma das quais é composta de instâncias datarow tipadas. Para colocar cada instância datatable no dataset é necessário um objecto de uma classe TableAdapter. Cada tableadapter possui vários métodos para selecção de dados de uma dada tabela da base de dados e também métodos para actualização desses dados. Os dados retribuídos por cada método povoam um datatable dentro do dataset. 3. Adicione TableAdapters Verifique o conteúdo do ficheiro web.config, o qual não contém qualquer elemento connectionstrings. No Server Explorer, expandir a base de dados e arrastar 3 tabelas da base de dados, Categories, Products e Suppliers: Categories(CategoryID, CategoryName, Description, Picture) Products(ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued) Suppliers(SupplierID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax, HomePage)

Verifique agora o conteúdo do ficheiro app.config criado automaticamente na class library, o qual já contém o elemento connectionstrings, com uma connectionstring para a base de dados. O DataSet Designer cria 3 tableadapters, um para cada tabela, com os nomes CategoriesTableAdapter PoductsTableAdapter SuppliersTableAdapter. Estes tableadapters são criados dentro do namespace NorthwindTableAdapters. Estas classes TableAdapter permitem criar objectos que representam a ligação e comandos usados para retribuir e gravar dados. Cada um dos tableadapters criados automaticamente pelo DataSet Designer já possui 2 métodos para retribuir os dados das respectivas tabelas, com os seguintes nomes: Fill este método recebe um datatable como parâmetro e preenche-o com os dados da tabela da base de dados. GetData - este método não recebe qualquer parâmetro e retorna um datatable povoado com os dados da tabela da base de dados. Cada tableadapter também cria os métodos Insert, Update e Delete para inserir, actualizar e apagar registos individuais na respectiva tabela. Na Class Library DAL faça Build > Build Solution 4. Visualize o Código gerado automaticamente Este passo destina-se apenas a visualizar o código gerado automaticamente pelo Visual Studio para as classes DataSet tipada e TableAdapters: Visualizando directamente com Class View no Visual Studio Os TableAdapters e DataTables adicionados ao Typed DataSet são expressos em XML Schema Definition. Pode visualizar este documento seleccionando Northwind.xsd no Solution Explorer e escolhendo Open With XML (Text) Editor. Para ver o código C# gerado automaticamente faça View > Class View. Pode ver propriedades, métodos e eventos das classes Typed DataSet e TableAdapter. Para ver o código de um método particular faça duplo clique no nome do método ou seleccione Go To Definition a partir do nome do método. Neste caso de um dataset adicionado a uma classe library, o código C# gerado está no ficheiro Northwind.Designer.cs mostrado na janela do Solution Explorer.

5. Liste todos os registos da tabela Products Para preencher as tabelas do dataset Northwind, o DataSet Designer criou tableadapters, com os nomes CategoriesTableAdapter, ProductsTableAdapter, e SupliersTableAdapter. Estes tableadapters são criados dentro de um namespace com o nome NorthwindTableAdapters. No WebSite adicionar uma referência para a Class library: Add Reference > DAL (Projects) Build > Build Solution Dá erro na página SuppliersAndProducts.aspx. Excluí-la do Projecto Build > Build Solution Adicione à página AllProducts.aspx o seguinte código no Page_Load: DAL.NorthwindTableAdapters.ProductsTableAdapter taprod = new DAL.NorthwindTableAdapters.ProductsTableAdapter(); GridView1.DataSource = taprod.getdata(); GridView1.DataBind(); //DAL.Northwind.ProductsDataTable dtprod = // new DAL.Northwind.ProductsDataTable(); //taprod.fill(dtprod); //GridView1.DataSource = dtprod; //GridView1.DataBind(); Adicione mais uma página (ListarProdutos.aspx) ao Web Site e coloque o seguinte código no Page_Load: DAL.NorthwindTableAdapters.ProductsTableAdapter taprod = new DAL.NorthwindTableAdapters.ProductsTableAdapter(); DAL.Northwind.ProductsDataTable tabelaprod = taprod.getdata(); foreach (DAL.Northwind.ProductsRow row in tabelaprod) Response.Write("Id = " + row.productid + " Nome do Produto = " + row.productname + "<br />"); 6. Liste todos os registos da tabela Products da Categoria Beverages CategoryID = 1 Adicione os métodos parametrizados (Step 3 do Tutorial) GetProductsByCategoryID(IdCategoria), e

GetProductsByProductID(IdProduto) Estes métodos devem ser adicionados ao tableadapter ProductsTableAdapter. No DataSet Designer, com o botão direito do rato na secção ProductsTableAdapter seleccione: Add > Query Use SQL Statements SELECT which returns rows Next Next Complete a instrucção SQL a usar para aceder aos dados, adicionando a cláusula WHERE SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued FROM dbo.products WHERE CategoryID = @CategoryID O parâmetro @CategoryID indica que o método necessita de um parâmetro de entrada do tipo CategoryID. No último passo escolhe-se o padrão de acesso a usar (Fill e/ou GetData) assim como o nome dos métodos. Altere os nomes para: FillProductsByCategoryID, e GetProductsByCategoryID. Depois de premir Finish o DataSet Designer inclui os novos métodos no tableadapter. Teste estes métodos listando numa página (Beverages.aspx) todos os produtos da categoria Beverages. DAL.NorthwindTableAdapters.ProductsTableAdapter taprod = new DAL.NorthwindTableAdapters.ProductsTableAdapter(); GridView1.DataSource = taprod.getproductsbycategoryid(); GridView1.DataBind(); Adicione o método GetProductsByProductID(int ProductID) usando a mesma técnica. 7. Inserir, Actualizar e Apagar Dados (Step 4 do Tutorial) Existem 2 padrões para inserir, actualizar e apagar dados: Um padrão cria métodos INSERT, UPDATE e DELETE em que a execução de cada método altera apenas um único registo da base de dados. O outro padrão cria métodos UPDATE com um parâmetro - um DataSet, um DataTable ou uma colecção de DataRows - em que a execução de um qualquer destes método actualiza os dados da tabela na base de dados, podendo alterar múltiplos registos da base de dados. O DataSet Designer cria automaticamente estes 2 padrões de métodos.

Para a tabela Products a classe ProductsTableAdapter possui os seguintes métodos: public int Update(DataSet1.ProductsDataTable datatable) public int Update(DataSet1 dataset) public int Update(DataRow[] datarows) public int Delete(int Original_ProductID) public int Insert(string ProductName, int SupplierID, int CategoryID, string QuantityPerUnit, decimal UnitPrice, short UnitsInStock, short UnitsOnOrder, short ReorderLevel, bool Discontinued) public int Update(string ProductName, int SupplierID, int CategoryID, string QuantityPerUnit, decimal UnitPrice, short UnitsInStock, short UnitsOnOrder, short ReorderLevel, bool Discontinued, int Original_ProductID) Estes métodos podem ser inspeccionados e modificados clicando no TableAdapter apresentado no DataSet Designer e seleccionando Properties. Na janela Properties seleccionar o tableadapter no drop-down list. Expandir os métodos DeleteCommand, InsertCommand, SelectCommand, e UpdateCommand para visualizar a sub-propriedade CommandText. Para modificar clicar na Propriedade CommandText, surgindo a janela Query Builder. Teste estes métodos adicionando uma página (AlterarPrecosProdutos.aspx) que permita alterar o preço de todos os produtos da Categoria 2: Double factor =... ; DAL.NorthwindTableAdapters.ProductsTableAdapter taprod = new DAL.NorthwindTableAdapters.ProductsTableAdapter(); DAL.Northwind.ProductsDataTable tabelaprod = taprod.getdata(); foreach (DAL.Northwind.ProductsRow row in tabelaprod) if (row.categoryid == 2) Response.Write( row.productname + " Preco:" + row.unitprice + "<br />"); foreach (DAL.Northwind.ProdutosRow row in tabelaprod) if (row.categoryid == 2) row.unitprice *= factor; // Actualiza a tabela Produtos taprod.update(tabelaprod); foreach (DAL.Northwind.ProductsRow row in tabelaprod) if (row.categoryid == 2) Response.Write( row.productname + " Preco:" + row.unitprice + "<br />"); Teste o método Insert, construindo uma interface gráfica adequada na página NewProduct.aspx: protected void Button1_Click(object sender, EventArgs e) { string nomepoduto = TextBox1.Text; int idfornecedor = int.parse(textbox2.text); int idcategoria = int.parse(textbox3.text); string quantidade = TextBox4.Text; decimal precounitario = decimal.parse(textbox5.text); short stock = short.parse(textbox6.text);

short quantencomendada = short.parse(textbox7.text); short nivel = short.parse(textbox8.text); bool descontinuado = false; DAL.NorthwindTableAdapters.ProductsTableAdapter tableadapterprod = new DAL.NorthwindTableAdapters.ProductsTableAdapter(); int n = tableadapterprod.insert(nomepoduto, idfornecedor, idcategoria, quantidade, precounitario, stock, quantencomendada, nivel, descontinuado); TextBox10.Text = n.tostring(); 8. Criar Métodos Insert, Update e Delete específicos Vamos criar um método para inserir um registo e retornar o valor do campo IDENTITY auto-gerado pela base de dados. No DataSet Designer, com o botão direito do rato na secção ProductsTableAdapter seleccione: Add > Query Use SQL Statements INSERT Next Next Termine a instrução SQL com ponto e vírgula e acrescente no fim: SELECT SCOPE_IDENTITY(), para retornar o último valor identity. INSERT INTO [dbo].[products] ([ProductName], [SupplierID], [CategoryID], [QuantityPerUnit], [UnitPrice], [UnitsInStock], [UnitsOnOrder], [ReorderLevel], [Discontinued]) VALUES (@ProductName, @SupplierID, @CategoryID, @QuantityPerUnit, @UnitPrice, @UnitsInStock, @UnitsOnOrder, @ReorderLevel, @Discontinued); SELECT SCOPE IDENTITY(); Function Name: InserirProduto Finish. Verificar que o tableadapter ProductsTableAdapter contém um novo método, InserirProduto. Por omissão, os métodos Insert são executados pelo método ExecuteNonQuery, o qual retorna o número de linhas afectadas. Contudo nós pretendemos que o método InserirProduto retorne o valor retornado pela query, e não o número de linhas afectadas. Para isso temos de alterar a propriedade ExecuteMode de NonQuery para Scalar. Teste este método, utilizando a interface gráfica da página NewProduct.aspx protected void Button1_Click(object sender, EventArgs e) { string nomepoduto = TextBox1.Text; int idfornecedor = int.parse(textbox2.text); int idcategoria = int.parse(textbox3.text); string quantidade = TextBox4.Text; decimal precounitario = decimal.parse(textbox5.text);

short stock = short.parse(textbox6.text); short quantencomendada = short.parse(textbox7.text); short nivel = short.parse(textbox8.text); bool descontinuado = false; DAL.NorthwindTableAdapters.ProductsTableAdapter tableadapterprod = new DAL.NorthwindTableAdapters.ProductsTableAdapter(); int n = tableadapterprod.inserirproduto(nomepoduto, idfornecedor, idcategoria, quantidade, precounitario, stock, quantencomendada, nivel, descontinuado); TextBox10.Text = n.tostring(); 9. Uso de Subqueries na cláusula Select O tableadapter ProductsTableAdapter retorna os valores CategoryID da tabela Products, mas não inclui o CategoryName (Nome da Categoria) da tabela Categories, embora esta coluna seja mais significativa para mostrar informações de cada produto. Podemos aumentar o método GetData() gerado automaticamente para incluir os valores de CategoryName. Se usarmos um JOIN para modificar o SELECT do método GetData() o DataSet Designer não será capaz de gerar automaticamente os métodos Insert, Update, e Delete usados para alterar registos individuais na Base de Dados. Teremos que os criar manualmente tal como fizemos com o método InserirProduto(). Também teremos de escrever os valores das propriedades InsertCommand, UpdateCommand, e DeleteCommand para usar o método Update do tableadpter para alterar múltiplos resgistos a partir de um DataSet. Se usarmos Subqueries na cláusula Select os métodos gerados automaticamente não serão afectados. Seleccione os métodos Fill e GetData do tableadapter ProductsTableAdapter e prima Configure A seguir ajuste a cláusula Select SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued FROM dbo.products Para: SELECT ProductID, ProductName, SupplierID, CategoryID, (SELECT CategoryName FROM Categories WHERE Categories.CategoryID = Products.CategoryID) as CategoryName, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued FROM dbo.products Testar executando a página AllProducts.aspx.

10. Adicionar Código Específico ao Código Gerado Automaticamente Por vezes o código gerado automaticamente necessita de ser alterado para fornecer as necessidades de uma aplicação. Se alterássemos directamente o código, essas alterações poderiam ser pagadas por uma nova geração automática de código efectuada pelo Visual Studio. Com o conceito de classes parciais é fácil separar uma classe por múltiplos ficheiros. Isto permite-nos adicionar código às classes geradas automaticamente. Vamos adicionar o método GetProducts() à classe SuppliersRow. A classe SuppliersRow representa um único registo na tabela Suppliers. O método GetProducts() deverá retornar os produtos de um fornecedor (registo da tabela Suppliers) particular. Para isso crie uma nova classe (ficheiro SuppliersRow.cs) no directório DAL e adicione o seguinte código: namespace DAL { public partial class Northwind { public partial class SuppliersRow { public Northwind.ProductsDataTable GetProducts() { NorthwindTableAdapters.ProductsTableAdapter tableadapterprod = new NorthwindTableAdapters.ProductsTableAdapter(); return tableadapterprod.getproductsbysupplierid(this.supplierid); Adicione o método GetProductsBySupplierID ao tableadapter ProductsTableAdapter. Recompile a class library DAL. Teste o método GetProducts() da classe CategoriesRow. Utilize a página SuppliersAndProducts.aspx para listar os nomes dos Suppliers e os nomes dos Produtos de cada Supplier. Inclua novamente a página no Projecto. Esta página usa um GridView com 2 campos: Um BoundField que mostra o nome da Categoria. Um TemplateField que contém o controlo BulletedList que lista os resultados retornados pelo método GetProducts() para cada Suplier. Alterar: DataSource='<%# ((DAL.Northwind.SuppliersRow)((System.Data.DataRowView) Container.DataItem).Row).GetProducts() %>' <asp:gridview ID="GridView1" runat="server" AutoGenerateColumns="False"

CssClass="DataWebControlStyle"> <HeaderStyle CssClass="HeaderStyle" /> <AlternatingRowStyle CssClass="AlternatingRowStyle" /> <Columns> <asp:boundfield DataField="CompanyName" HeaderText="Supplier" /> <asp:templatefield HeaderText="Products"> <ItemTemplate> <asp:bulletedlist ID="BulletedList1" runat="server" DataSource='<%# ((DAL.Northwind.SuppliersRow) ((System.Data.DataRowView)Container.DataItem).Row).GetProducts() %>' DataTextField="ProductName"> </asp:bulletedlist> </ItemTemplate> </asp:templatefield> </Columns> </asp:gridview> Na página SuppliersAndProducts.aspx para listar os nomes dos Suppliers coloque: public partial class SuppliersAndProducts : System.Web.UI.Page { DAL.NorthwindTableAdapters.SuppliersTableAdapter tasuppliers = new DAL.NorthwindTableAdapters.SuppliersTableAdapter(); GridView1.DataSource = tasuppliers.getdata(); GridView1.DataBind(); Criação de uma BLL com Typed DataSets Do tutorial: Creating a Business Logic Layer de Scott Mitchell http://www.asp.net/data-access/tutorials/creating-a-business-logic-layer-cs 11. Adicionar à solução uma Class Library para a camada de lógica de negócio: BLL Na Solução : Add > New Project > (Visual C#) Class Library BLL Apagar a classe Class1.cs automaticamente adicionada à Class Library BLL. Adicionar à Class Library BLL uma referência para a Class Library DAL 12. Adicionar classes à BLL BLL Add New Item > Class CategoriesBLL.cs ProductsBLL.cs SuppliersBLL.cs

CategoriesBLL.cs public class CategoriesBLL { private NorthwindTableAdapters.CategoriesTableAdapter tacat = null; protected NorthwindTableAdapters.CategoriesTableAdapter Adapter { get { if (tacat == null) tacat = new NorthwindTableAdapters.CategoriesTableAdapter(); return tacat; public Northwind.CategoriesDataTable GetCategories() { return Adapter.GetCategories(); ProductsBLL.cs public class ProductsBLL { private NorthwindTableAdapters.ProductsTableAdapter taprod = null; protected NorthwindTableAdapters.ProductsTableAdapter Adapter { get { if (taprod == null) taprod = new NorthwindTableAdapters.ProductsTableAdapter(); return taprod; public Northwind.ProductsDataTable GetProducts() { return Adapter.GetProducts(); public Northwind.ProductsDataTable GetProductByProductID( int productid) { return Adapter.GetProductByProductID(productID); public Northwind.ProductsDataTable GetProductsByCategoryID( int categoryid) { return Adapter.GetProductsByCategoryID(categoryID); public Northwind.ProductsDataTable GetProductsBySupplierID( int supplierid) { return Adapter.GetProductsBySupplierID(supplierID); public bool InsertProduct(string productname, int supplierid, int categoryid, string quantityperunit, decimal unitprice, short unitsinstock, short unitsonorder, short reorderlevel, bool discontinued) { int rowsaffected = Adapter.Insert(productName, supplierid, categoryid, quantityperunit, unitprice, unitsinstock, unitsonorder, reorderlevel, discontinued); // Retorna true se exactamente umalinha é inserida, senao false return rowsaffected == 1;

SuppliersBLL.cs public class SuppliersBLL { private NorthwindTableAdapters.SuppliersTableAdapter tasup = null; protected NorthwindTableAdapters.SuppliersTableAdapter Adapter { get { if (tasup == null) tasup = new NorthwindTableAdapters.SuppliersTableAdapter(); return tasup; public Northwind.SuppliersDataTable GetSuppliers() { return Adapter.GetSuppliers(); 13. Alterar o Código das Páginas aspx Apagar a Referência da Aplicação Web à Class Library DAL: remova o directório Bin existente na Aplicação Web WebSite. Adicionar à Aplicação Web uma referência para a Class Library BLL. O código da páginas aspx deve invocar funcionalidades da Camada BLL. AllProducts.aspx public partial class AllProducts : System.Web.UI.Page { ProductsBLL produtos = new ProductsBLL(); GridView1.DataSource = produtos.getproducts(); GridView1.DataBind(); Beverages.aspx public partial class Beverages : System.Web.UI.Page { ProductsBLL produtos = new ProductsBLL(); GridView1.DataSource = produtos.getproductsbycategoryid(1); GridView1.DataBind();

NewProduct.aspx public partial class NewProduct : System.Web.UI.Page { protected void Button1_Click(object sender, EventArgs e) { string nomepoduto = TextBox1.Text; int idfornecedor = int.parse(textbox2.text); int idcategoria = int.parse(textbox3.text); string quantidade = TextBox4.Text; decimal precounitario = decimal.parse(textbox5.text); short stock = short.parse(textbox6.text); short quantencomendada = short.parse(textbox7.text); short nivel = short.parse(textbox8.text); bool descontinuado = false; ProductsBLL produtos = new ProductsBLL(); bool b = produtos.insertproduct(nomepoduto, idfornecedor, idcategoria, quantidade, precounitario, stock, quantencomendada, nivel, descontinuado); TextBox10.Text = b.tostring(); 14. Testar