O documento discute conceitos básicos de banco de dados, SQL e ADO.Net. Ele apresenta os principais conceitos de banco de dados como tabelas, registros, campos e chaves. Também revisa comandos SQL como SELECT, INSERT, UPDATE e DELETE. Por fim, introduz os objetos e funcionalidades principais da biblioteca ADO.Net para acesso a dados, como Connection, Command, DataReader e DataAdapter.
1. Programação C
Faculdade Dom Bosco de Porto Alegre
Bacharelado em Sistemas de Informação
Prof. Filipo Mór
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
2. Agenda
• Conceitos Básicos.
• Banco de Dados.
• Revisão SQL.
• Acesso a dados com ADO.Net.
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
4. Conceitos
• Banco de Dados
• É uma coleção de dados inter-relacionados, representando informações sobre um
domínio específico
• Ex.: Lista Telefônica, Fichas de acervo de Biblioteca
• Sistema Gerenciador de Banco de Dados
• São softwares que permitem a definição de estruturas para armazenamento de
informações e fornecimento de mecanismos para manipulá-las
• Características:
• Integridade, Restrições, Segurança/Privacidade, Restauração, Eficiência
• Ex.: SQL Server, Oracle, PostgresSQL, MySQL
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
5. Conceitos
• Dado
• Conjunto de símbolos “arranjados” a fim de representar a informação fora da mente
humana.
• Elementos de Dados
• Subconjunto de símbolos que compõem um dado com significado específico, mas não
representa a informação completa.
• Ex.: O número de alunos na turma MAT01 de 2008 é 79.
• Os elementos de dados são:
• Turma: MAT01
• Ano: 2008
• Alunos: 79
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
7. Banco de Dados
• Tabelas
• Objeto criado para armazenar os dados fisicamente
• Os dados são armazenados em linhas (registros) e colunas
(campos)
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
8. Banco de Dados
• Registros
• São linhas de uma tabela
• Armazenam um conjunto de dados pré-definido pela tabela
• Campos
• São as colunas de uma tabela
• Possuem um tipo de dado definido
• Armazenam um dado
• Chave Primária
• Campo que permite a identificação única de um registro em uma tabela
• Chave Estrangeira
• Campo que referencia uma Chave Primária de um outro registro
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
9. Banco de Dados
• Índices
• É uma ferramenta usada pelo gerenciador de Banco de Dados para facilitar a busca de
linhas dentro de uma tabela.
• Índice Único
• Índice criado a partir de uma coluna ou de um conjunto de colunas. Não permite a
inclusão de linhas duplicadas.
• Índice de Performance
• Otimiza o processo de busca de linhas na tabela.
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
10. Banco de Dados
• Exemplo:
• Um editora possui vários livros
• Um livro é de somente uma editora
• Um livro possui vários autores
• Um autor possui vários livros de sua autoria
Editora
PK codigo
nome
Livro
PK codigo
titulo
ano
FK1 codEditora
Autor
PK codigo
primeiroNome
ultimoNome
LivroAutor
PK,FK1 codLivro
PK,FK2 codAutor
Notação:
PK – chave primária (nome do campo sublinhado)
FK – chave estrangeira
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
12. Banco de Dados
CLIENTE
PK CLI_COD
CLI_NOME
CLI_END
I1 CLI_CNPJ
NOTA_FISCAL
PK NF_NRO
NF_DATA
NF_CLI
NF_CFOP
FK1 CLI_COD
PRODUTO
PK PROD_COD
PROD_DESC
PROD_IPI
PROD_UNIT
PROD_QTD
ITEM_NF
PK,FK2 NF_NRO
PK ITEM_COD
ITEM_VALOR
ITEM_QTD
FK1 PROD_COD
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
13. Criar Tabelas
CREATE TABLE [cliente](
[cli_cod] [int] PRIMARY KEY IDENTITY(1,1),
[cli_nome] [varchar](50) NOT NULL,
[cli_end] [varchar](50) NULL,
[cli_cnpj] [char](11) NOT NULL
)
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
14. Inserir Registro
INSERT INTO [cliente]
([cli_nome],[cli_end],[cli_cnpj])
VALUES
('Bill Gates','Quinta Avenida','12345678900')
• Se a tabela possui um campo identity, não é permitido definir
manualmente o valor para este campo
• Se um campo foi definido como NOT NULL então é necessário especificar
seu valor
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
15. Alterar Registro
UPDATE [cliente]
SET [cli_end] = 'Sete de Setembro'
WHERE [cli_cnpj] = '12345678900'
• Ao atualizar um registro, especifique as colunas a serem alteradas
• A cláusula WHERE é opcional, se for omitida então a atualização ocorrerá
em todos os registros, senão ela ocorrerá somente nos registros
selecionados
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
16. Deletar Registro
DELETE FROM [cliente]
WHERE [cli_cnpj] = '12345678900'
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
17. Selecionar Registros
• Todas as colunas da tabela cliente
SELECT * FROM cliente
• Coluna com o código e o nome da tabela cliente
SELECT cli_cod, cli_nome FROM cliente
• Todos as colunas da tabela cliente onde o nome comece com
Bil
SELECT * FROM cliente WHERE cli_nome LIKE 'Bil%'
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
18. Selecionar Registros
• INNER JOIN
• Une o conteúdo de duas tabelas por meio de uma cláusula de junção gerando um novo
conjunto de dados. Retorna apenas os registros que atendam a cláusula de junção.
• Todos os clientes juntamente com suas notas fiscais.
SELECT *
FROM cliente
INNER JOIN nota_fiscal
ON cliente.cli_cod = nota_fiscal.cli_cod
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
19. Selecionar Registros
• LEFT JOIN
• Une o conteúdo de duas tabelas por meio de uma cláusula de junção gerando um novo
conjunto de dados. Retorna todos os registros da tabela da esquerda mesmo que não
haja um registro que atenda a cláusula de junção na tabela da direita.
• Todos os produtos e as linhas das notas fiscais onde foram comprados, caso foram
comprados.
SELECT *
FROM produto
LEFT JOIN item_nf
ON produto.prod_cod = item_nf.prod_cod
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
21. Acesso a Dados
• .NET oferece alternativas de acesso aos dados de um banco de dados
relacional:
• Biblioteca de classes ADO.NET
• Uma API de acesso e manipulação.
• TableAdapters
• Camada de acesso a dados fornecida por geradores de código do Visual Studio.
• Entity Framework
• Framework para mapeamento objeto/relacional.
• LINQ
• Linguagem de acesso e manipulação de alto nível embutida.
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
23. O que é ADO.NET
• ADO.NET compreende:
• Um conjunto de classes, interfaces, estruturas e enumerações que gerenciam
acesso a dados de dentro do .NET Framework
• Um modelo de programação projetado para ambientes desconectados
• Um modelo de programação com avançado suporte a XML
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
24. Modelo de objetos do ADO.NET
Banco de
Dados
.NET Data Provider
Connection
Transaction
Command
Parameters
DataReader
TableAdapter
SelectCommand
InsertCommand
UpdateCommand
DeleteCommand
DataSet
DataTableCollection
DataTable
DataRowCollection
DataColumnCollection
ConstraintCollection
DataRelationCollection
XML
25. Providers
• Conjunto de classes especializadas que implementam a interface de
acesso ao dados;
• Existe por padrão no Framework, providers específicos para cada tipo
de banco de dados;
• SQL Provider: acesso à banco de dados do SQL Server.
• OleDB Provider: acesso à banco de dados com driver OleDB.
• ODBC Provider: acesso à banco de dados com driver ODBC.
• Providers específicos oferecem aumento da performance.
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
26. Acesso ao Banco de Dados
Gerencia a conexão ao banco
de dados
Executa a consulta/comando
no banco de dados
Troca dados entre o data set
e o banco de dados
Provê acesso a conjuntos de
dados para leitura apenas
Banco de
Dados
Connection
Command
DataReader
DataAdapter
27. Connection String
• É uma string estática, de somente leitura, responsável por
informar o nome do servidor, nome do banco de dados, usuário
e senha para acessar a base de dados utilizada pela aplicação.
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
28. Objeto Connection
• Utilizado para fazer a conexão com o banco de
dados;
• Existe um para cada tipo de provider;
• Permite o pooling de conexões;
• A conexão é feita através de uma string de
conexão.
SqlConnection cn = new SqlConnection();
cn.ConnectionString = "Data Source=localhost;" +
"Integrated Security=SSPI;" +
"Initial Catalog=Northwind";
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
29. Objeto Command
• Utilizado para a execução de comandos no banco de dados;
• Pode ser criado através de uma conexão:
• Para definir o comando a ser executado utilize a propriedade
CommandText:
SqlCommand cmd = cn.CreateCommand();
cmd.CommandText = "SELECT * FROM Tabela";
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
30. Objeto Command
• Como existem diferentes tipos de comandos, existem também
diferentes tipos de execução:
• ExecuteReader()
• Retorna um objeto DataReader, com o resultado da consulta
• ExecuteNonQuery()
• Não retorna nenhum tipo de dado, apenas o número de células afetadas
• ExecuteScalar()
• Retorna um único valor (object) escalar
• ExecuteXMLReader()
• Retorna um XMLReader
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
31. Command-ExecuteNonQuery
• É responsável pela execução de comandos SQL para manipulação dos
dados no banco de dados.
• São comandos como DELETE e UPDATE que não retornam nenhum
resultado de SELECT e não utilizam nenhum parâmetro de saída.
• Possui duas definições:
• Recebendo um CommandType (Text ou StoredProcedure), uma string com a
instrução SQL (Query ou nome do procedimento) e um vetor de parâmetros SQL
• Ou recebendo, além destes parâmetros, uma transação SQL. A transação é utilizada
para garantir a atomicidade de vários comandos, ou seja, fazer com que um conjunto
de comandos sejam executados ou descartados totalmente
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
32. Command-ExecuteNonQuery
• Exemplo de uso :
SqlConnection cnn = new SqlConnection(
"Data Source=localhost;" +
"Initial Catalog=Videos;Integrated Security=True");
SqlCommand cmd = new SqlCommand("UPDATE titulos SET
Nome = 'Sem Nome' WHERE Nome = ''", cnn);
cnn.Open();
int qtidade =cmd.ExecuteNonQuery();
Console.WriteLine(qtidade + " linhas foram afetadas.");
cnn.Close();
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
33. Command-ExecuteScalar
• Exemplo de uso :
SqlConnection cnn = new SqlConnection(
"Data Source=localhost;" +
"Initial Catalog=Videos;Integrated Security=True");
SqlCommand cmd = new SqlCommand("SELECT COUNT(*)
FROM titulos", cnn);
cnn.Open();
object qtidade = cmd.ExecuteScalar();
Console.WriteLine("Existem " + (int)qtidade + " títulos");
cnn.Close();
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
34. Objeto DataReader
• Utilizado para leitura de dados.
• Existe um para cada tipo de provider.
• Vantagens:
• Velocidade.
• Usado para leitura de grandes quantidades de dados.
• Desvantagens:
• Não permite a modificação dos dados lidos.
• Permite somente leitura sequencial.
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
35. Command-ExecuteReader
• Ele é utilizado para retornar um DataReader para a classe.
• Uma particularidade deste método é que, devido ao fato de
trabalhar conectado ao banco de dados, não podemos fechar a
conexão.
• Para que a conexão não fique aberta após a leitura, é utilizada
a cláusula CommandBehavior.CloseConnection.
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
36. Objeto DataReader
• Inicia sempre na posição BOF (Begin Of File);
• Para ler o conteúdo de um campo específico utilize:
• Para ir para o próximo registro, utilize:
SqlDataReader dr = cmd.ExecuteReader();
string str = dr["NomeDoCampo"];
dr.Read();
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
37. Objeto DataReader
• Exemplo de uso (1):
SqlConnection cn = new SqlConnection(
"Data Source=localhost;" +
"Initial Catalog=Northwind;Integrated Security=True");
SqlCommand cmd = new SqlCommand("select * from Customers", cn);
cn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read()) {
comboBox1.Add(dr["CompanyName"]);
}
dr.Close();
cn.Close();
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
38. Objeto DataReader
• Exemplo de uso (2):
SqlConnection cn = new SqlConnection(
"Data Source=localhost;" +
"Initial Catalog=Northwind;Integrated Security=True");
SqlCommand cmd = new SqlCommand("select * from Customers", cn);
cn.Open();
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
cn.Close();
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
39. Objeto DataAdapter
• Responsável pela comunicação entre um objeto DataSet e o banco de
dados;
• Específico para cada tipo de provider;
• Agrega objetos do tipo Command, facilitando a inserção, atualização e
remoção de registros no banco de dados;
• Possui métodos específicos para popular e atualizar um DataSet.
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
40. Objeto DataAdapter
• Exemplo de uso :
SqlConnection cnn = new SqlConnection("Data Source=localhost;" +
"Initial Catalog=Videos;Integrated Security=True");
SqlCommand cmd = new SqlCommand("SELECT * FROM titulos", cnn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
41. CommandBuilder
• Permite a criação automática de objetos do tipo Command, através
de um DataAdapter;
• Pode ser utilizado somente quando os dados a serem modificados
não são resultados de consultas mais complexas, utilizando cláusulas
como por exemplo, Join;
• Ao ser chamado, o CommandBuilder:
• Conecta-se à base de dados e obtém o esquema da tabela;
• Prepara os comandos correspondentes, usando a lista de campos obtida;
• Instancia objetos Parameter, de acordo com o tipo de cada campo.
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
42. CommandBuilder
• Exemplo de uso (1):
SqlConnection cn = new SqlConnection("Data Source=localhost;" +
"Integrated Security=SSPI;" +
"Initial Catalog=Northwind");
SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", cn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
da.UpdateCommand = cb.GetUpdateCommand();
da.InsertCommand = cb.GetInsertCommand();
da.DeleteCommand = cb.GetDeleteCommand();
da.Update(ds.Tables["Clientes"]);
cn.Close();
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
43. CommandBuilder
• Exemplo de uso (2):
SqlConnection cn = new SqlConnection("Data Source=localhost;" +
"Integrated Security=SSPI;" +
"Initial Catalog=Northwind");
SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", cn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
cb.DataAdapter.Update(ds.Tables["Clientes"]);
cn.Close();
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
44. Objeto DataSet
• Utilizado para acesso em geral a um banco de dados;
• Independente de provider;
• Trabalha desconectado do banco de dados;
• Os dados são armazenados dentro de uma coleção de objetos
DataTable;
• Mantém os relacionamentos existentes no banco de dados, entre os
DataTables.
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
45. Objeto DataSet
• DataSets armazenam dados de
forma semelhante a um modelo de
banco de dados relacional
• São constituídos de coleções de
tabelas (Tables) e relacionamentos
(Relations)
• Tabelas (Tables) contém coleções
de colunas (Columns), restrições
(Constraints) and registros (Rows)
• Implementa interface IListSource
para utilização com componentes
visuais
DataSet
Constraints
Table
Column
Constraint
Rows
Row
Relations
Relation
Object Collection
Tables
Columns
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
46. Objeto DataSet
• Preenchimento de um DataSet:
• Atualização do DataSet no Banco de dados:
da.Update(ds);
SqlDataAdapter da;
da = new SqlDataAdapter("SELECT * FROM Clientes");
DataSet ds = new DataSet("Clientes");
da.Fill(ds, "Clientes");
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
47. Objeto DataSet
• Exemplo de uso:
SqlConnection cn = new SqlConnection("Data Source=localhost;" +
"Integrated Security=SSPI;" +
"Initial Catalog=Northwind");
SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", cn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet("Customers");
da.Fill(ds, "Customers");
foreach (DataRow dr in ds.Tables["Customers"].Rows){
Console.WriteLine("{0}:{1}", dr[0], dr["ContactName"]);
}
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
48. Objeto DataTable
• Representa uma tabela do banco de dados;
• Incorporado ao DataSet, mas ainda um objeto independente;
• Podem ter restrições, como chave primárias;
• Podem se relacionar entre si, da mesma maneira que no banco de
dados;
• Possui método para executar filtragens e ordenações;
• Para isso utiliza comandos SQL, que seriam utilizados nas cláusulas
Select e Order By.
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
49. Objeto DataTable
• Filtragem
• Ordenação
DataRow[] rows;
rows = ds.Tables["Clientes"].Select("Country = 'Brazil'",
"CustomerName DESC");
DataRow[] rows;
rows = ds.Tables["Customers"].Select("CustomerID LIKE 'A%'");
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.
50. Programação C
Perguntas???
Faculdade Dom Bosco de Porto Alegre
Bacharelado em Sistemas de Informação
Prof. Filipo Mór
Agradecimento Especial:
Prof. Alexandre Agustini - PUCRS, que gentilmente
cedeu o material para confecção desta aula.
www.filipomor.com – Aula 2 – 2015/II – Acesso a dados com ADO.Net.