ASP.NET 2.0 - Criando um Álbum de fotos  na Web - I


Que tal criar um álbum de fotos para compartilhar suas fotos na web usando ASP .NET 2.0 ?

A primeira coisa a fazer é criar um novo web site; eu chamei de AlbumFotos, mas você pode alterar a seu critério. Abra o Visual Web Developer Express e no menu File selecione New Web Site, usando o template ASP. NET Web Site, e, informando o nome sugerido. A página Default.aspx que é criada por padrão deve ser excluída do projeto.

Vamos definir a estrutura do banco de dados onde iremos armazenar as imagens das fotos. Vamos usar o SQL Server 2005 Express e criar um banco de dados chamado Imagens.mdf contendo duas tabelas que possuem a seguinte estrutura:

tabela Albuns tabela Fotos

Para criar o banco de dados no menu Web Site selecione Add New Item e na janela Templates seleciona o item SQL DataBase informando o nome Imagens.mdf. O arquivo será colocado na pasta App_Data.

Para criar as tabelas , na janela DataBase Explorer , expanda os objetos do banco de dados Imagens , e clique com o botão direito do mouse sobre o objeto Table selecionando Add New table. A seguir digite diretamente no editor o campos e os tipos de dados mostrados acima lembrando de definir a chave primária e os campos como Identity.

Agora precisamos definir a nossa classe de acesso a dados. Para isso , no menu Web Site selecione Add New Item, e na janela templates selecione Class informando o nome AcessoBD.vb. O arquivo será colocado na pasta App_Code.

Abra o arquivo AcessoBD.vb e declare os seguintes namespaces:

Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration

A seguir defina a variável strConn que representará a string de conexão;

Shared strConn As String = ""

Crie um construtor para obter a string de conexão do arquivo de configuração Web.config:

Shared Sub New()
     strConn = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
End Sub

Vamos agora definir métodos de acesso a dados, nossa estratégia será criar os seguintes métodos:

- ExecuteNonQuery - Executa uma operação que não retorna dados; Usado para INSERT , UPDATE e DELETE;
- ExecuteReader - Retorna um DataReader; Retorna um conjunto de registro via instrução SQL ou stored Procedure;
- ExecuteScalar - Executa um operação unitária, retorna um único valor;
- ExecuteDataSet - Retorna um DataSet;

Iremos ter dois métodos sobrecarregados para cada um dos métodos acima um recebendo parâmetros e outro sem parâmetros.

Public Shared Function ExecuteNonQuery(ByVal query As String) As Integer

Dim cnn As New SqlConnection(strConn)
Dim cmd As New SqlCommand(query, cnn)

cnn.Open()
Dim retval As Integer = cmd.ExecuteNonQuery()
cnn.Close()

Return retval
End Function

Public Shared Function ExecuteNonQuery(ByVal query As String, ByVal p As SqlParameter()) As Integer
Dim cnn As New SqlConnection(strConn)
Dim cmd As New SqlCommand(query, cnn)

FillParameters(cmd, p)
cnn.Open()

Dim retval As Integer = cmd.ExecuteNonQuery()
cnn.Close()
Return retval
End Function
Public Shared Function ExecuteReader(ByVal sql As String) As SqlDataReader

Dim cnn As New SqlConnection(strConn)
Dim cmd As New SqlCommand(sql, cnn)

Return cmd.ExecuteReader(CommandBehavior.CloseConnection)

End Function

Public Shared Function ExecuteReader(ByVal sql As String, ByVal p As SqlParameter()) As SqlDataReader

Dim cnn As New SqlConnection(strConn)
Dim cmd As New SqlCommand(sql, cnn)

FillParameters(cmd, p)
cnn.Open()

Return cmd.ExecuteReader(CommandBehavior.CloseConnection)
End Function
Public Shared Function ExecuteScalar(ByVal sql As String) As Object
Dim cnn As New SqlConnection(strConn)
Dim cmd As New SqlCommand(sql, cnn)

cnn.Open()

Dim retval As Object = cmd.ExecuteScalar()
cnn.Close()

Return retval
End Function

Public Shared Function ExecuteScalar(ByVal sql As String, ByVal p As SqlParameter()) As Object

Dim cnn As New SqlConnection(strConn)
Dim cmd As New SqlCommand(sql, cnn)

FillParameters(cmd, p)
cnn.Open()

Dim retval As Object = cmd.ExecuteScalar()
cnn.Close()
Return retval
End Function
Public Shared Function ExecuteDataSet(ByVal sql As String) As DataSet
Dim cnn As New SqlConnection(strConn)
Dim cmd As New SqlCommand(sql, cnn)
Dim da As New SqlDataAdapter()

da.SelectCommand = cmd
Dim ds As New DataSet()
da.Fill(ds)

Return ds
End Function

Public Shared Function ExecuteDataSet(ByVal sql As String, ByVal p As SqlParameter()) As DataSet
Dim cnn As New SqlConnection(strConn)
Dim cmd As New SqlCommand(sql, cnn)

FillParameters(cmd, p)

Dim da As New SqlDataAdapter()
da.SelectCommand = cmd

Dim ds As New DataSet()
da.Fill(ds)

Return ds
End Function

Em todos os métodos abrimos uma conexão com a fonte de dados e executamos um comando com um instrução SQL e parâmetros preenchidos dinamicamente.

Vamos definir agora o método para preencher os parâmetros usados:

Private Shared Sub FillParameters(ByVal cmd As SqlCommand, ByVal parameters As SqlParameter())
For i As Integer = 0 To parameters.Length - 1
      cmd.Parameters.Add(parameters(i))
Next
End Sub

Todos os métodos foram definidos como sendo estáticos.(Shared)

Agora precisamos definir a nossa classe de negócios onde iremos definir os seguintes métodos:

Estes métodos definem instruções SQL para selecionar dados das tabelas Albuns e Fotos.

No menu Web Site selecione Add New Item, e na janela templates selecione Class informando o nome cAlbum.vb. O arquivo será colocado na pasta App_Code. Abra o arquivo e digite o código abaixo:

Public Shared Function getMiniatura(ByVal fotoid As Integer) As Image
Dim sql As String = "SELECT imagem,imgAltura,imgLargura FROM Fotos WHERE fotoID=@fotoid"
Dim p As SqlParameter() = New SqlParameter(0) {}

p(0) = New SqlParameter("@fotoid", fotoid)

Dim reader As SqlDataReader = AcessoBD.ExecuteReader(sql, p)
Dim dadosImagem As Byte = Nothing
Dim height As Integer = 0, width As Integer = 0

While reader.Read()
   dadosImagem = CByte(reader.GetValue(0))
   height = reader.GetInt32(1)
   width = reader.GetInt32(2)
End While

reader.Close()

Dim ms As New MemoryStream(dadosImagem)
Dim imagemMaior As Image = Image.FromStream(ms)
Dim imagemMenor As Image = imagemMaior.GetThumbnailImage(width, height, Nothing, IntPtr.Zero)

Return imagemMenor
End Function

Public Shared Function getMiniaturaPorAlbum(ByVal albumid As Integer) As Image
Dim p As SqlParameter() = New SqlParameter(0) {}

p(0) = New SqlParameter("@albumid", albumid)

Dim photoid As Integer = Integer.Parse(AcessoBD.ExecuteScalar("SELECT TOP 1 fotoID FROM fotos WHERE albumID=@albumid ORDER BY dataCriacao DESC", p).ToString())
Return GetMiniatura(photoid)

End Function

Public Shared Function getFoto(ByVal fotoid As Integer) As Image
Dim sql As String = "SELECT imagem from fotos where fotoID=@fotoid"
Dim p As SqlParameter() = New SqlParameter(0) {}

p(0) = New SqlParameter("@fotoid", fotoid)

Dim reader As SqlDataReader = AcessoBD.ExecuteReader(sql, p)
Dim dadosImagem As Byte = Nothing

While reader.Read()
   dadosImagem = CByte(reader.GetValue(0))
End While

reader.Close()

Dim ms As New MemoryStream(dadosImagem )
Dim imagemMaior As Image = Image.FromStream(ms)

Return imagemMaior

End Function

Precisamos criar o arquivo web.config e definir no mesmo a string de conexão usada no projeto. No menu Web Site selecione Add New Item e na janela templates selecione Web Configuration File aceitando o nome padrão web.config.

Abra o arquivo e defina a string de conexão conforme abaixo:

<?xml version="1.0"?>
<configuration>
<appSettings/>
<connectionStrings>
<add name="ImagensConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Imagens.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<pages theme="Tema">

</pages>
<compilation debug="true"/>
<authentication mode="Windows"/>
</system.web>
</configuration>

Com isso temos a infra-estrutura de suporte e já podemos criar a camada de interface que será composto pelas nossas páginas .aspx.

No próximo artigo iremos dar continuidade criando a nossa Master Page.

Aguarde a continuação do artigo : ASP.NET 2.0 - Criando um Álbum de fotos na web II

Até lá...


José Carlos Macoratti