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