sábado, 1 de maio de 2010

Dot Net: Ler e gravar imagem no banco de dados

Esse exemplo mostra como enviar uma imagem com o controle FileUpload e salvar em uma tabela do banco de dados Sql Server e como recuperar essa imagem usando um Generic Handler (ASHX).

Gravando a imagem no banco de dados
Exemplo em C#:

protected void btnEnviar_Click(object sender, EventArgs e)
{
SqlConnection conexao = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConnectionStringSqlServer"].ConnectionString);
try
{
conexao.Open();
SqlCommand comando = new SqlCommand("INSERT INTO [DotNet_Gravar_e_Ler_Imagem_no_Banco_de_dados] (Imagem) VALUES (@Imagem) ", conexao);
comando.Parameters.Add("@Imagem", SqlDbType.Image).Value = FileUploadImagem.FileBytes; // O "FileUploadImagem" é a ID do controle FileUpload
comando.ExecuteNonQuery();
GridView1.DataBind();
}
finally
{
conexao.Close();
}
}


Exemplo em VB.NET:

Protected Sub btnEnviar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEnviar.Click
Dim conexao As New SqlConnection(ConfigurationManager.ConnectionStrings("SqlConnectionStringSqlServer").ConnectionString)
Try
conexao.Open()
Dim comando As New SqlCommand("INSERT INTO [DotNet_Gravar_e_Ler_Imagem_no_Banco_de_dados] (Imagem) VALUES (@Imagem) ", conexao)
comando.Parameters.Add("@Imagem", Data.SqlDbType.Image).Value = FileUploadImagem.FileBytes ' O "FileUploadImagem" é a ID do controle FileUpload
comando.ExecuteNonQuery()
GridView1.DataBind()
Finally
conexao.Close()
End Try
End Sub





Recuperando a imagem do banco

Para recuperar ou transformar de volta em imagem o que está no banco de dados, é usado um arquivo do tipo "Generic Handler", com o seguinte código.

Exemplo em C#:

public void ProcessRequest (HttpContext context) {
if(string.IsNullOrEmpty(context.Request.QueryString["id"])) {
context.Response.ContentType = "text/plain";
context.Response.Write("Está faltando a querystring id.");
} else {
context.Response.ContentType = "image/jpeg";
SqlConnection conexao = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConnectionStringSqlServer"].ConnectionString);
try {
conexao.Open();
SqlCommand comando = new SqlCommand("SELECT Imagem FROM DotNet_Gravar_e_Ler_Imagem_no_Banco_de_dados WHERE IDImagem = @IDImagem", conexao);
comando.CommandType = CommandType.Text;
comando.Parameters.Add("@IDImagem", SqlDbType.Int).Value = context.Request.QueryString["id"];
context.Response.Clear();
context.Response.BinaryWrite((byte[])comando.ExecuteScalar());
} finally{
conexao.Close();
}
}
}


Exemplo em VB.NET:

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
If String.IsNullOrEmpty(context.Request.QueryString("id")) Then
context.Response.ContentType = "text/plain"
context.Response.Write("Está faltando a querystring id.")
Else
context.Response.ContentType = "image/jpg"
Dim conexao As New SqlConnection(ConfigurationManager.ConnectionStrings("SqlConnectionStringSqlServer").ConnectionString)
Try
conexao.Open()
Dim comando As New SqlCommand("SELECT Imagem FROM DotNet_Gravar_e_Ler_Imagem_no_Banco_de_dados WHERE IDImagem = @IDImagem", conexao)
comando.CommandType = CommandType.Text
comando.Parameters.Add("@IDImagem", SqlDbType.Int).Value = context.Request.QueryString("id")
context.Response.Clear()
context.Response.BinaryWrite(comando.ExecuteScalar)
Catch ex As Exception

Finally
conexao.Close()
End Try
End If
End Sub




Se você quiser mostrar as imagens direto na gridview, é só adicionar uma coluna na grid e passar o link do .ASHX com a querystring "id". Igual ao exemplo abaixo:







Porém essa não é a melhor solução, porque a cada linha da grid o ASHX vai fazer uma conexão no banco para retorna a imagem. Para isso, a melhor solução é salvar a imagem em um diretório e guardar apenas o link no banco de dados.



O projeto completo de exemplo, com os codigos está armazenado no Google Code (VB.NET e C#).

Nenhum comentário:

Postar um comentário