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.

como-crear-base-datos-en-sqlite-para-guardar-archivos-e-imagenes

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

proyecto-en-visual-studio

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

agregar-la-biblioteca

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:

Descargar Ejemplo 1MB
Sobre el autor
Rodrigo Chambi Q.

Desarrollador de aplicaciones web y de escritorio, amante de la tecnología y autodidacta, me gusta conocer otras tecnologías, escribir artículos para compartir en la web y para estar al tanto en los nuevos paradigmas, respeto las políticas de software privativo y libre, ya que estas políticas son las normas que permite el desarrollo tecnológico social de la humanidad. filvovmax@gmail.com -- info@gitmedio.com

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

7 Comentarios

  1. De Victor

    Responder

  2. De Luis

    Responder

  3. De Pati

    Responder

  4. De Roberto

    Responder

  5. De Rodrigo

    Responder

  6. De Emerson

    Responder