ASP.NET -  Trabalhando com BLOBs no SQL Server II


Na primeira parte definimos nosso objetivo e criamos o banco de dados Album.mdf , a tabela Fotos e a classe Foto; agora vamos criar a classe FotoHelper que será responsável pelas tarefas relacionadas com o acesso e a manutenção de dados do nosso Álbum de fotos.

Vamos então incluir uma nova classe no projeto. Clique com o botão direito sobre a pasta App_Code e selecione Add New Item;

Selecione o template Class e informe o nome FotoHelper.vb ;

Esta classe deverá possuir os seguintes métodos:

Além disso devemos definir um construtor na classe para obter a string de conexão com o banco de dados que estará armazenada no arquivo de configuração Web.Config.

Antes de iniciar vamos declarar os namespaces para termos acesso as classes da ADO.NET e o provedor SQL pois estamos usando o banco de dados SQL Server:

Imports System.Data
Imports
System.Data.SqlClient

Para que o valor da string de conexão com o banco de dados esteja disponível no projeto vamos criar uma variável estática (Shared) e definir um construtor Shared com o seguinte código:

Shared sConexaoBD As String

Shared Sub New()

sConexaoBD = ConfigurationManager.ConnectionStrings("conexaoBD").ConnectionString

End Sub

Agora vamos definir o método Inserir na mesma classe:

  Public Shared Function Inserir(ByVal f As Foto) As Integer
        'cria uma nova conexao e um objeto command
        Dim cnn As New SqlConnection(sConexaoBD)
        Dim cmd As New SqlCommand()

        'define a conexão e a string sql para incluir dados na tabela
        cmd.Connection = cnn
        cmd.CommandText = "INSERT INTO Fotos(titulo,descricao,foto) values(@titulo,@descricao,@foto)"

        'Define e obtem os valores dos parametros
        Dim titulo As New SqlParameter("@titulo", f.Titulo)
        Dim descricao As New SqlParameter("@descricao", f.Descricao)
        Dim foto As New SqlParameter("@foto", SqlDbType.VarBinary)
        foto.Value = f.FotoDados

        'inclui os valores dos parametros
        cmd.Parameters.Add(titulo)
        cmd.Parameters.Add(descricao)
        cmd.Parameters.Add(foto)

        'abre a conexão e executa a consulta SQL retornando um inteiro : 1 se bem sucedido -1 se houver erro
        cnn.Open()
        Dim i As Integer = cmd.ExecuteNonQuery()
        'fecha a conexão
        cnn.Close()
        'retorna o valor obtido na execução da consulta sql via 
        Return i
 End Function

O código acima já esta comentado mas eu quero que você atente para os seguintes detalhes:

  1. Estamos usando a conexão definida e obtida no construtor da classe armazenada em sConexaoBD;
  2. Montamos uma string SQL usando o comando INSERT INTO para incluir os dados na tabela. O código não esta sendo usado pois foi definido como do tipo Identity e é portanto gerenciado pelo banco de dados sofrendo incremento automático;
  3. Estamos usando parâmetros que estão sendo obtidos a partir do objeto Foto. Com isso evitamos a injeção SQL;
  4. Usamos o método ExecuteNonQuery pois ele Este método é usado para enviar para executar um comando SQL que não retorna registros. O método ExecuteNonQuery retorna o número de linhas afetados pelas operações de Insert , Update e Delete.
-Além do método acima podemos usar os seguintes métodos:

- 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;

Agora vamos ao método Atualizar :

Public Shared Function Atualizar(ByVal f As Foto) As Integer
        'cria uma nova conexao e um objeto command
        Dim cnn As New SqlConnection(sConexaoBD)
        Dim cmd As New SqlCommand()

        'define a conexão e a string sql para incluir dados na tabela
        cmd.Connection = cnn
        cmd.CommandText = "UPDATE fotos SET titulo=@titulo,descricao= @descricao,foto=@foto where fotoid=@fotoid"

        'Define e obtem os valores dos parametros
        Dim titulo As New SqlParameter("@titulo", f.Titulo)
        Dim descricao As New SqlParameter("@descricao", f.Descricao)
        Dim foto As New SqlParameter("@foto", SqlDbType.VarBinary)
        foto.Value = f.FotoDados

        Dim fotoid As New SqlParameter("@fotoid", f.FotoID)

        'inclui os valores dos parametros
        cmd.Parameters.Add(titulo)
        cmd.Parameters.Add(descricao)
        cmd.Parameters.Add(foto)
        cmd.Parameters.Add(fotoid)

        'abre a conexão e executa a consulta SQL retornando um inteiro : 1 se bem sucedido -1 se houver erro
        cnn.Open()
        Dim i As Integer = cmd.ExecuteNonQuery()
        'fecha a conexão
        cnn.Close()
        'retorna o valor obtido na execução da consulta sql via 
        Return i
    End Function

 

No método Atualizar estamos usando a instrução SQL para UPDATE SET para atualizar os dados da tabela e precisamos do parâmetro fotoid que é o código da foto pois queremos atualizar somente um registro cujo código seja igual ao informado.

Agora vamos  ao método Deletar:

Public Shared Function Deletar(ByVal fotoid As Integer) As Integer
 
        'cria uma nova conexao e um objeto command
        Dim cnn As New SqlConnection(sConexaoBD)
        Dim cmd As New SqlCommand()

        'define a conexão e a string sql para incluir dados na tabela
        cmd.Connection = cnn
        cmd.CommandText = "DELETE FROM fotos where fotoid=@fotoid"
        'Define e obtem os valores dos parametros
        Dim codigo As New SqlParameter("@fotoid", fotoid)
        cmd.Parameters.Add(codigo)

        'abre a conexão e executa a consulta SQL retornando um inteiro : 1 se bem sucedido 
        cnn.Open()
        Dim i As Integer = cmd.ExecuteNonQuery()

        'fecha a conexão
        cnn.Close()
        'retorna o valor obtido na execução da consulta sql via 
        Return i
    End Function

 

Este método usa a instrução SQL DELETE FROM para excluir uma foto da tabela de Fotos com base no código da foto (fotoid) informado.

Estão faltando dois métodos que devemos definir e eu vou deixar isso para o próximo artigo...

Aguarde no próximo artigo :  ASP.NET -  Trabalhando com BLOBs no SQL Server III

Até mais ver...

referências:


José Carlos Macoratti