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

