Como guardar Archivos e Imágenes en una Base datos sqlite c#
En este articulo se explica, como guardar archivos e imágenes en una Base datos sqlite, con el lenguaje de programación C#. En SQLite al usar el tipo dato Binary y Blob permite almacenar cadenas de bits con una longitud hasta 231-1 or 2147483647, con lo cual implementaremos un ejemplo sencillo.
En el ejemplo se utiliza Visual Estudio 2015 para la codificación, y también usted debe descargarse la biblioteca según a la arquitectura de tu PC.
En el primer paso crearemos una tabla en la base de datos, campos y sus tipos datos, a continuación se muestra en la siguiente imagen.
CREATE TABLE "Archivo" ( "ID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "NombArch" VARCHAR(250), "Extesion" VARCHAR(250), "Archivo" BINARY, "TipoArch" VARCHAR(250) );
A continuación se crea el proyecto en el visual estudio en el lenguaje de programación C#.

En el siguiente imagen se muestra como agregar, la librería System.Data.SQLite.dll, SQLite.Interop.dll y System.Data.SQLite.Linq.dll.

En el siguiente ejemplo de código se realiza la acción de registrar en el evento click, cuyos archivos PDF y comprimido ZIP, de la cual se captura el detalle del archivo, y sea convertido en una cadenas de bits para guardar en la base de datos.
/// <summary>
/// Método abrir archivo y captura
// de información y conversión a byte
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void agregarArchivoToolStripMenuItem_(object sender, EventArgs e){
OpenFileDialog Archivo = new OpenFileDialog();
Archivo.Filter = "(Archivos pdf y zip)|*.pdf;*.zip";
Archivo.Title = "Agregar archivo";
if (Archivo.ShowDialog() == DialogResult.OK) {
Byte[] BinarioArchiv = new Byte[0];
FileInfo ArchivoDetalle= new FileInfo(Archivo.FileName);
BinarioArchiv = File.ReadAllBytes(ArchivoDetalle.FullName);
BajasaltasSQLITE AgregarDatos = new BajasaltasSQLITE(BinarioArchiv, ArchivoDetalle.Name, ArchivoDetalle.Extension,TipoArchivo(ArchivoDetalle.Extension));
AgregarDatos.RutaBaseDatos = RutaDB;//Ruta del archivo de la base de datos.
AgregarDatos.AgregarDatos();
AgregarDatos.CargarTablas(dataGridView1);
}
}
Al observar en el ejemplo se instancia la clase llamado BajasaltasSQLITE, el cual encapsula, Propiedades, campos y métodos para agregar datos, escribir archivo y buscar, cuya clase se muestra en el siguiente ejemplo.
using System;
using System.Data.SQLite;
using System.Windows.Forms;
using System.Data;
using System.IO;
namespace Imagenes_archivo_sqlite{
class BajasaltasSQLITE{
/// <summary>
/// Constructor por defecto
/// </summary>
public BajasaltasSQLITE(){
}
/// <summary>
/// Contructor con
/// argumentos
/// </summary>
/// <param name="RutaArchivo"></param>
/// <param name="NombreArch"></param>
/// <param name="Extension"></param>
/// <param name="TipoArch"></param>
public BajasaltasSQLITE(byte[] Archivo, String NombreArch, String Extension, String TipoArch){
Archivo_ = Archivo;
NombreArchivo_ = NombreArch;
Extension_ = Extension;
TipoArchivo_ = TipoArch;
}
private Byte[] Archivo_;
private String RutaDB_;
private String NombreArchivo_;
private String Extension_;
private String TipoArchivo_;
/// <summary>
/// Establece y devuelve
/// la ruta de la base
/// de datos
/// </summary>
public String RutaBaseDatos {
get { return RutaDB_; }
set { RutaDB_ = value; }
}
//Sector de propiedades
/// <summary>
/// Establece y devuelve
/// la nombre del archivo
/// </summary>
public String NombreArchivo {
get { return NombreArchivo_; }
set { NombreArchivo_ = value; }
}
/// <summary>
/// Establece y devuelve
/// la extesion del archivo
/// </summary>
public String Extesion
{
get { return Extension_; }
set { Extension_ = value; }
}
/// <summary>
/// Establece y devuelve
/// El tipo de archivo
/// </summary>
public String TipoArchivo{
get { return TipoArchivo_; }
set { TipoArchivo_ = value; }
}
/// <summary>
/// Agrega datos
/// a la base de datos.
/// </summary>
public void AgregarDatos() {
//Estableciendo la cenexion
SQLiteConnection Conexion = new SQLiteConnection("Data Source="+RutaDB_+ ";Versión=3");
Conexion.Open();
SQLiteCommand Comando = new SQLiteCommand("INSERT INTO Archivo(NombArch,Extesion,TipoArch,Archivo) VALUES(@Nombres,@Extesions,@Tipos,@Archivos)",Conexion);
Comando.Parameters.AddWithValue("@Nombres",NombreArchivo_);
Comando.Parameters.AddWithValue("@Extesions", Extension_);
Comando.Parameters.AddWithValue("@Tipos", TipoArchivo_);
Comando.Parameters.AddWithValue("@Archivos", Archivo_);
Comando.ExecuteNonQuery();
Conexion.Close();
}
/// <summary>
/// Metodo que
/// carga al objeto
/// DataGridView
/// </summary>
/// <param name="Lista"></param>
public void CargarTablas(DataGridView Lista) {
try{
DataSet Tabla = new DataSet();
//DataTable Tabla = new DataTable();
//BusquedaArch Tabla = new BusquedaArch();
SQLiteConnection ConexionSqlite = new SQLiteConnection(@"Data Source=" + RutaDB_ + ";Versión=3");
ConexionSqlite.Open();
SQLiteDataAdapter Insertar = new SQLiteDataAdapter("SELECT Archivo.ID,Archivo.NombArch,Archivo.Extesion,Archivo.TipoArch FROM Archivo", ConexionSqlite);
Insertar.Fill(Tabla, "TablBusqueda");
Lista.DataSource = Tabla;
ConexionSqlite.Close();
Lista.DataMember = "TablBusqueda";
if (Lista.ColumnCount > 0){
Lista.Columns[0].Visible = false;
Lista.Columns[1].HeaderText = "Nombre";
Lista.Columns[1].Width = 300;
Lista.Columns[2].HeaderText = "Extesion";
Lista.Columns[2].Width = 50;
Lista.Columns[3].HeaderText = "Tipo";
Lista.Columns[3].Width = 300;
Lista.AllowUserToAddRows = false;
}
}
catch (Exception e){
//MessageBox.Show(e.Source);
}
}
/// <summary>
/// Recupera cadena de bytes desde la base de datos
/// para escribir el archivo en el lugar
/// donde se genera el ejecutable
/// </summary>
/// <param name="Id"></param>
/// <param name="Nombre"></param>
public void RecuparByt(string Id,string Nombre){
try{
Byte[] Archivo = new byte[0];
DataTable Tabla = new DataTable();
SQLiteConnection ConexionSqlite = new SQLiteConnection("Data Source="+RutaDB_+";Version=3");
ConexionSqlite.Open();
SQLiteDataAdapter comando = new SQLiteDataAdapter("SELECT Archivo FROM Archivo WHERE ID='"+ Id + "'", ConexionSqlite);
comando.Fill(Tabla);
DataRow Row;
Row = Tabla.Rows[0];
Archivo = ((byte[])Row[0]);
File.WriteAllBytes(Application.StartupPath + @"\"+Nombre,Archivo );
ConexionSqlite.Close();
}
catch (Exception e) {
MessageBox.Show(e.Message);
}
}
/// <summary>
/// Simple buscador
/// de nombre de archivos
/// </summary>
/// <param name="Datos"></param>
/// <param name="textbuscar"></param>
public void Buscar(DataGridView Datos, String textbuscar) {
try{
DataSet Tabla = new DataSet();
SQLiteConnection ConexionSqlite = new SQLiteConnection(@"Data Source=" + RutaDB_ + ";Versión=3");
ConexionSqlite.Open();
SQLiteDataAdapter Insertar = new SQLiteDataAdapter("SELECT Archivo.ID,Archivo.NombArch,Archivo.Extesion,Archivo.TipoArch FROM Archivo WHERE Archivo.NombArch LIKE '%"+ textbuscar + "%'", ConexionSqlite);
Insertar.Fill(Tabla, "TablBusqueda");
Datos.DataSource = Tabla;
ConexionSqlite.Close();
Datos.DataMember = "TablBusqueda";
if (Datos.ColumnCount > 0){
Datos.Columns[0].Visible = false;
Datos.Columns[1].HeaderText = "Nombre";
Datos.Columns[1].Width = 300;
Datos.Columns[2].HeaderText = "Extesion";
Datos.Columns[2].Width = 50;
Datos.Columns[3].HeaderText = "Tipo";
Datos.Columns[3].Width = 300;
Datos.AllowUserToAddRows = false;
}
}
catch (Exception error) {
}
}
}
}
Como ya habrá visto, es un ejemplo sencillo como guardar archivos e imágenes en una base datos sqlite en c#, en el siguiente link dejo el ejemplo completo para que puedan probar.
Ejemplo: