Use as informações EXIF capturadas pela câmera para montar um supercadastro de fotos
Quer criar um cadastro de fotos bem completo sem perder tempo digitando? Ponha a idéia em prática aproveitando as informações Exif (Exchangeable Image File Format), que as câmeras fotográficas digitais, na maioria, gravam nas imagens. Estão entre essas informações a data e a hora em que a foto foi tirada, a abertura do obturador, a exposição, o nome do fabricante e o modelo da máquina. Neste tutorial, criaremos um cadastro de fotos com informações Exif no SQL Server 2005 Express, a versão gratuita do banco de dados da Microsoft, rodando no Windows Server 2003. Nossa base terá três tabelas: Clientes, Fotógrafos e Pictures. Vamos aos passos.
1. A BASE DE DADOS
Abra o gerenciador SQL Server Management Studio Express. Clique com o botão direito em Databases e selecione Create New Database. Do lado esquerdo da janela New Database, selecione a opção General. No campo Database name, digite Fotos, o nome do nosso banco de dados. Clique OK. O banco Fotos se constitui de dois arquivos: fotos.mdf e fotos_log.ldf. Você pode verificar isso acionando Programs > Microsoft SQL Server > MSQL > DATA.
2. AS TABELAS
De volta ao Management Studio, expanda o banco de dados Fotos, clicando no ícone +. Agora vamos criar as três tabelas: Clientes, Fotógrafos e Pictures, partindo do princípio que um fotógrafo pode ter várias fotos e que um cliente também pode ter várias fotos.
Primeiro, criamos a tabela Fotógrafos. Com o botão direito, clique em Tables e selecione NEW TABLE. Na janela Properties, digite o nome da tabela — fotografos — no campo ObjectName. Agora vamos criar os campos dessa tabela. Aparece uma lista com as opções na janela Table — dbo.table-1, o nome padrão de tabela criada pelo Management Studio, contendo o nome da coluna (Column Name), tipo de dados (Data Type) e permissão de nulos (Allow Nulls).
O primeiro campo que criaremos é o da chave primária. A chave deve ser um valor exclusivo da tabela e de preenchimento obrigatório. No nosso caso, ela será chamada Id_fotografo. Digite esse nome no campo Column Name. A janela Column Properties deve ser alterada para as características desejadas. Primeiro, determinamos qual tipo de dados o campo suportará. Clique em Data Type e selecione int, pois esse campo será a identificação do fotógrafo e chave primária. Dê TAB até abrir a próxima linha da janela Table — dbo. table-1, nome provisório da tabela.
3. MAIS CAMPOS
Vamos criar agora os campos Nome do fotógrafo, Endereço, Cidade, Estado. Todos eles serão do tipo varchar, que consumirá somente o espaço necessário no disco para a quantidade de caracteres armazenada. Assim, um nome com dez caracteres consumirá dez bytes no banco de dados. Nos campos do tipo char, o tamanho de 50 caracteres sempre ocupará 50 bytes no disco. Para cada um defina no campo lenght o tamanho que você deseja.
O último campo será o do CEP. Defina-o como campo numérico de tamanho 8. Preencha as opções Precision como 8 e scale 0 na janela Properties. Como não queremos que falte informação na tabela, desmarque Allow Nulls de todos os campos.
4. CHAVE PRIMÁRIA
Vamos definir a chave primária. Clique com o botão direito sobre o campo desejado e selecione Set Primary Key. Vamos fazer isso com o campo Id_fotografo. A chave primária é identificada graficamente por uma pequena chave à frente do nome do campo. Salvamos nossa tabela, acionando File > Salvar Fotografos. Pronto, a primeira tabela está criada na base de dados Fotos.
Faça o mesmo para a tabela Clientes. Ela terá os campos Id_cliente, nome_cliente, endereço_cliente, cidade_cliente, estado_cliente, CEP_cliente como colunas. Como não queremos registros incompletos, todos eles não permitirão campos nulos.
Vamos fazer do Id_cliente a chave primária dessa tabela. Salve a tabela Clientes clicando no ícone de fechar tabela. Uma janela aparecerá perguntando se você deseja salvar as alterações. Clique YES.
5. TABELA DE FOTOS
Chegou a vez da tabela Pictures, que terá informações Exif sobre as fotos. O padrão Exif é bastante completo, mas não queremos todos os dados. Usaremos o nome do fabricante da câmera, o modelo, a data e a hora da foto e sua largura e altura. Defina todos os campos (exceto a chave primária) como varchar com o tamanho desejado. Crie uma chave primária chamada Id_pictures. Aqui, permitiremos nulos nos outros campos, pois podemos não ter alguns dados.
6. RELACIONAMENTOS
A tabela Pictures não está completa ainda. É preciso relacioná-la aos fotógrafos e aos clientes. Primeiro, vamos definir as chaves de pesquisa para os fotógrafos e clientes. Elas serão chamadas de id_fotografos e id_clientes, respectivamente. Crie como campos do tipo int.
Agora, clique com o botão direito na janela de campos e escolha a opção indexes/Key. Clique no botão ADD. Selecione o índice criado. Em Columns, escolha primeiro a coluna Id_fotografos, abrindo a janela com a opção “...”. Na coluna Identity (name), dê o nome desse índice. Vamos chamá-lo de indice_fotografos. Note que há uma coluna chamada is unique. Mantenha a opção NO. Por quê? Queremos que esse valor se repita para cada foto que pertença a um fotógrafo. Crie outro índice para clientes e nomeie como indice_clientes.
7. TABELA COM TABELA
Vamos relacionar as tabelas. No banco de dados Fotos, clique com o botão direito em Database Diagrams na janela da esquerda. O sistema avisará que esse banco de dados não tem um ou mais objetos necessários para utilizar o recurso de diagramas. Clique YES. Selecione New Database Diagram. A janela Add Tables aparece. Selecione uma tabela e clique em Add. Faça isso com todas as tabelas. Ao final, clique em Close.
Uma representação gráfica das tabelas e seus relacionamentos é mostrada. Selecione a coluna de chave no cliente (Id_cliente) com o mouse e arraste até a coluna Id_clientes. A janela Table and Columns será mostrada. Isso fará com que o sistema gere uma relação entre a tabela Clientes e a tabela Pictures usando o campo Id_clientes. Essa relação é de um para muitos, ou seja, de um cliente para várias fotos. Clique OK. Faça o mesmo para a tabela Fotógrafos, usando a coluna Id_fotografo, e para a tabela Pictures, usando a coluna Id_fotografos. Os relacionamentos estão feitos.
A identificação de cada uma dessas relações é feita por uma linha que une os campos de índices e cada lado contém a forma dessa relação, um para um, um para muitos ou muitos para muitos. No nosso caso, você verá uma chave de um dos lados da relação e um símbolo de infinito do outro lado, o que significa uma relação de um para muitos.
Quando você executar consultas que contenham as tabelas Clientes e Pictures ou Fotografos e Pictures, as informações relacionadas de ambas serão trazidas automaticamente. Salve o diagrama, clicando em SALVAR ou fechando a janela. Dê um nome para esse diagrama — no nosso caso, diagrama mesmo.
8. IMPORTANDO DADOS
Neste ponto, já podemos utilizar essa base. Primeiro, precisamos cadastrar alguns dados nela. Usamos um programa de extração de dados Exif em lote para gerar as informações das fotos, o EasyExif (www.info.abril.com.br/download/ 4457.shtml), de Kevin Hu. O programa gera arquivos CSV (texto separado por vírgulas) de cada imagem.
Abra o programa e selecione a opção Save Directory as CSV Text no menu Save Exif. Uma janela do Windows permitirá selecionar o diretório das imagens. O sistema lerá as informações de todas as fotos e, para cada uma, gerará um arquivo CSV, no diretório Exifdata. Junte todos os arquivos gerados em um único.
9. IMPORTADO
Para importar os dados CSV para o banco, vamos usar o EMS Data Import for SQL Server, da EMS. Faça o download em www.info. abril.com.br/ download/4458.shtml.
Esse utilitário tem um assistente que o leva passo a passo pelo processo. O primeiro é a conexão com a base de dados. Isso depende da instalação que foi feita no SQL Express. No nosso caso, escolhemos Remote, preenchemos o nome da máquina, e a autenticação configurada foi a do Windows. Clique no botão NEXT.
No próximo passo escolhemos o arquivo com os dados, clicando no botão ADD FILE. A janela Select Table é mostrada. Selecione o banco de dados Fotos e a tabela dbo.pictures. Clique OK e depois em NEXT.
Agora mude o delimitador para vírgula no campo Delimiter. Na janela Field, selecione o campo CameraManufacture. Escolha na janela Columns a coluna que corresponde a esse campo — no nosso caso, a coluna 2.
Faça o mesmo para os campos CameraModel, DateTime, Width e Lenght com as colunas 4, 16, 54 e 55 respectivamente. Clique em NEXT.
10. CAMPOS DE ÍNDICE
Vamos tratar da geração automática dos campos de índice da tabela. Primeiro, a chave primária (Id_pictures). Selecione-a no campo Field. No campo Generator Step da janela Field Tunning, digite 1. Isso significa que, para cada registro, um novo índice adicionado de 1 será gerado. Como nossa base é virgem, ele começará do 1, pois é a soma de Generator Value (que é 0) mais o Generator Step (que é 1). Nas demais vezes, você terá que descobrir qual é o número a ser colocado em Generator Value.
11. ID DO FOTÓGRAFO
Vamos gerar o valor de Id_fotografos. Temos dois registros e queremos que o primeiro seja do fotógrafo que está cadastrado em nossa base com o índice 1, e o segundo, do fotógrafo com índice 2.
Selecione id_fotografos na janela Fields e, em Fields Tunning, coloque Generator Value 0 e Generator Step 1. Isso fará com que o primeiro registro seja do fotógrafo com índice de número 1 (campo com o valor 1) e o segundo registro seja do fotógrafo 2 (campo com valor 2).
Agora vamos gerar as informações de cliente. Queremos que todas as fotos pertençam ao mesmo cliente, o que tem índice 1 em nossa tabela de clientes. Selecione o campo Id_clientes na janela Fields e digite o número 1 em Constant Values na janela Fields Tunning. Todos os registros terão o valor 1 no campo de índice id_clientes, pertencendo assim ao mesmo cliente. Clique NEXT neste e nos próximos passos até o de número 10. No último, clique IMPORT. Os dois registros foram importados para o banco Fotos.
12. A PESQUISA
Agora, vamos fazer uma consulta. Na janela Object Explorer, clique com o botão direito no banco de dados Fotos e selecione a opção New Query.
Queremos primeiro descobrir todos as fotos do cliente 1. Clique com o botão direito na janela de Query e selecione Query Designer. Adicione as tabelas Cliente e Pictures. Na coluna Column_Name, selecione Nome_Cliente da lista. Nas demais, selecione DateTime, CameraModel e Id_clientes. Em filter, na linha de id_clientes, digite 1. O próprio Query Designer gerou um comando SQL para ser executado. Clique em OK.
Clique com o botão direito na janela Query e escolha EXECUTE. Eis o resultado da pesquisa: data e hora de cada foto, o modelo de câmera e para qual cliente isso foi feito.