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
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:
Descargar Ejemplo 1MB
Al cambiar la extencion pdf por doc, abre archivos en word pero no deja modificar.
Que interesante. Gracias!
para una conexion sqlserver como seria???
Donde defines la ruta de la base
private String RutaDB = Application.StartupPath + @»\basededatos.db»;
Como sería para una base MySQL?
Saludos!
Roberto para una conexión con Mysql tienes descargar la librería https://dev.mysql.com/downloads/connector/net/8.0.html.
puedes ver este tuto Emerson, http://usandojava.blogspot.com/2012/03/sqlite-java-y-un-ejemplo-practico.html, si estas usando Java.
En java…Con NetBeans por ejemplo…?