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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

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

Comentarios

  1. De Emerson

    Responder

  2. De Rodrigo

    Responder

  3. De Roberto

    Responder

  4. De Pati

    Responder

  5. De Luis

    Responder

  6. De Victor

    Responder