Não é somente em aplicações Web que se podem ter arquivos salvos em banco de dados, também é possível desenvolver aplicações com Windows Forms para salvar e recuperar imagens ou arquivos do banco de dados.
Para um breve exemplo, vamos criar uma aplicação Windows Forms no Visual Studio, com um formulário com um botão ‘Escolher’ para o “upload” da imagem/arquivo e um botão ‘Mostrar’ para exibir a imagem. Para a caixa de seleção do arquivo, precisaremos de um Open File Dialog e para exibição, um Picture Box:

Desta vez, estaremos utilizando Entity Framework para salvar a imagem/arquivo no banco de dados (ainda com a mesma modelagem do artigo anterior).

Ajustamos os eventos do formulário:
using System;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using Microsoft.Win32;
namespace DemoApp.WinForms
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public int ArquivoId { get; set; }
/// <summary>
/// Clique do botão Escolher abre OpenFileDialog
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnEscolher_Click(object sender, EventArgs e)
{
ofdEscolher.ShowDialog();
}
/// <summary>
/// Retorno do OpenFileDialog
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ofdEscolher_FileOk(object sender, CancelEventArgs e)
{
var file = new FileInfo(ofdEscolher.FileName);
var obj = new Arquivos
{
Nome = file.Name,
Extensao = file.Extension,
Tipo = GetMimeType(file.Extension)
};
using (var stream = ofdEscolher.OpenFile())
using (var reader = new BinaryReader(stream))
obj.Bytes = reader.ReadBytes((int)stream.Length);
using (var context = new DemoAppEntities())
{
context.AddObject("Arquivos", obj);
context.SaveChanges();
}
// Regra somente para efeito de demonstração,
// pois restrições devem ser criadas no Open File Dialog
if (obj.Extensao == ".jpg")
ArquivoId = obj.ArquivoId;
}
/// <summary>
/// Recuperar Content Type do registro do Windows,
/// por compatibilidade às aplicações Web
/// Original.: http://www.codeproject.com/KB/dotnet/ContentType.aspx
/// </summary>
/// <param name="ext"></param>
/// <returns></returns>
public string GetMimeType(string ext)
{
var classesRoot = Registry.ClassesRoot;
var typeKey = classesRoot.OpenSubKey(@"MIME\Database\Content Type");
if (typeKey == null) return string.Empty;
return (
from regExt in typeKey.GetSubKeyNames()
let path = @"MIME\Database\Content Type\" + regExt
let curKey = classesRoot.OpenSubKey(path)
where curKey != null
let value = curKey.GetValue("Extension")
where value != null && value.ToString().ToLower() == ext
select regExt
).FirstOrDefault() ?? string.Empty;
}
/// <summary>
/// Recuperando imagem do banco de dados e exibindo em um PictureBox
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnMostrar_Click(object sender, EventArgs e)
{
if (ArquivoId == 0) return;
Arquivos obj;
using (var context = new DemoAppEntities())
obj = context.Arquivos.FirstOrDefault(a => a.ArquivoId == ArquivoId);
if (obj == null) return;
var stream = new MemoryStream(obj.Bytes);
picImagem.Image = Image.FromStream(stream);
}
}
}
Agora na execução, clicamos no botão “Escolher”:

Escolhemos o arquivo para importação, no caso uma imagem JPG.

Por fim, com um clique sobre o botão Mostrar, teremos a imagem no Picture Box:

Em um cenário real, criem restrições dos tipos de arquivos no processo de importação/download da imagem/arquivo. No caso de aplicações Windows Forms, estas restrições serão no Open File Dialog.
Muito legal, porem salvando esse arquivo no banco de dados, vai dar normalmente né?