Dot Net: Ler e gravar imagem no banco de dados

Category : Post

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#:

View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    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:

1
2
3
4
5
6
7
8
9
10
11
12
    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#:

View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    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:

1
2
3
4
5
	<asp:TemplateField HeaderText="Imagem">
		<ItemTemplate>
			<asp:Image ID="Image1" ImageUrl='<%# String.Concat("GerarImagem.ashx?id=", Eval("IDImagem")) %>' runat="server" />
		</ItemTemplate>
	</asp:TemplateField>

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#).

Post a comment