miércoles, 10 de junio de 2009

Trabajar con imágenes desde SQL Server

Este artículo muestra como insertar imágenes en SQLServer utilizando el insert. En varios casos las personas desean trabajar con fotos, texto, documentos. Este artículo muestra como trabajar con imágenes en SQL Server. Posteriormente voy a utilizar el sqlimageviewer para visualizar imágenes. Para insertar imágenes en una tabla Primero vamos a crear una foto. La vamos a llamar imagen1 del tipo jpg.

Crear una tabla. Una vez que tenemos la foto el siguiente paso es crear una tabla que pueda almacenar la foto: CREATE TABLE graficos(colGrafico varbinary(max)) El tipo de dato que estamos usando para la columna colGrafico es varbinary. Insertar el gráfico en la tabla. INSERT INTO graficos(colGrafico) SELECT * FROM OPENROWSET(BULK N'C:\Imagen1.jpg', SINGLE_BLOB) as T1 Para visualizar imagenes. Si usted hace un select * from grafico no verá nada. Hay muchas herramientas para visualizar gráficos. En este caso decidí utilizar al sqlimageviewer. Este programa puede funcionar para Oracle, MySQL, SQLServer, Posgre, DB2. Usted puede bajarlo de su sitio web: http://www.sqlimageviewer.com/ Una vez que lo tenga instalado hay que escoger la instancia, la autentificación y escoger la base de datos en la cual creó la tabla. Estoy creando un video mostrando cómo usar imageviewer. BAJAR VIDEO (para ver el video, descargue el archivo zip, descomprímalo y abra el archivo htm)
Si tienen dudas, escríbanme al blog.

People who read this post also read :



7 comentarios:

  1. Hola. Soy novato en esto de sql, de hecho apenas llevo un par de días aprendiendo. Quisiera saber si con sql server express se puede asociar una imagen a cada registro de una tabla y si al realizar después una consulta, que en esta salgan no solo los datos de los registros solicitados, sino también sus imágenes. Gracias

    ResponderEliminar
  2. Se puede, pero tienes que crear o usar herramientas externas para visualizar los datos.

    ResponderEliminar
  3. muchs gracias me ha servido bastante pero para consultar esa imagen desde asp.net es necesario alguna herramiente externa?

    ResponderEliminar
  4. Yo use este código en C#:


    private void btn_add_Click(object sender, System.EventArgs e)
    {
    OpenFileDialog dlg = new OpenFileDialog();
    dlg.Filter = "All Pictures|*.bmp;*.gif;*.jpg|Bitmaps|*.bmp|GIFs|*.gif|JPEGs|*.jpg";

    if ( dlg.ShowDialog() ==DialogResult.OK )
    {
    pictureBox1.Image = new Bitmap(dlg.FileName);
    string name=dlg.FileName.Substring(dlg.FileName.LastIndexOf(@"\")+1,dlg.FileName.Length-dlg.FileName.LastIndexOf(@"\")-1);
    MemoryStream mstr = new MemoryStream();
    pictureBox1.Image.Save(mstr, pictureBox1.Image.RawFormat);
    byte[] arrImage = mstr.GetBuffer();
    string cmd = "insert into Picture (PictureName, Picture) values (@PName, @Pic)";

    SqlConnection c = new SqlConnection(c_string);
    SqlCommand comm = new SqlCommand(cmd,c);
    comm.Parameters.Add( new SqlParameter("@PName", SqlDbType.VarChar,40)).Value = name;
    comm.Parameters.Add( new SqlParameter("@Pic",SqlDbType.Image)).Value = arrImage;
    //comm.Parameters

    try
    {
    c.Open();
    comm.ExecuteNonQuery();
    listBox1.Items.Add(name);
    }
    catch(System.Data.SqlClient.SqlException err)
    {
    MessageBox.Show(err.Message);
    }
    finally
    {
    c.Close();
    }


    }
    }

    private void btn_display_Click(object sender, System.EventArgs e)
    {
    if (listBox1.SelectedIndex<0)
    {
    MessageBox.Show("Por favor seleccione una imagen del ListBox");
    }
    else
    {
    string cmd = "select picture from Picture where PictureID="+ listBox1.SelectedIndex +";";
    SqlConnection cc = new SqlConnection(c_string);
    SqlCommand com = new SqlCommand(cmd,cc);


    try
    {
    cc.Open();
    byte[] b = (byte [])com.ExecuteScalar();//ds.Tables[0].Rows[listBox1.SelectedIndex]["Picture"];
    MemoryStream mem = new MemoryStream(b);
    pictureBox1.Image = Image.FromStream(mem);
    }
    catch (Exception ee)
    {
    MessageBox.Show(ee.Message);
    }
    finally
    {
    cc.Close();
    }

    }
    }

    private void Form1_Load(object sender, System.EventArgs e)
    {
    string cmd = "select PictureName from Picture;";

    SqlConnection c = new SqlConnection(c_string);
    SqlCommand cm = new SqlCommand(cmd, c);


    try
    {
    c.Open();


    SqlDataReader TheReader = cm.ExecuteReader();

    while (TheReader.Read())
    {
    listBox1.Items.Add(TheReader["PictureName"].ToString());


    }

    c.Close();

    }
    catch (SqlException ee)
    {
    MessageBox.Show(ee.Message);
    }
    finally
    {
    c.Close();
    }
    }


    }
    }

    ResponderEliminar
  5. funciona perfecto
    menos mal encontré esto por la red
    saludos

    ResponderEliminar
  6. Y como seria en este caso: uso la base de datos northwind y trabajo con la tabla Categories tengo un Windows Forms con un datagridview al q le asigno los datos por codigo, las imagenes se muestran bien hasta q ingreso una nueva categoria y una nueva imagen todos los datos se guardan correctamente menos la imagen de la categoria la columna q deberia mostrar la imagen sale con una [X] se que esta base de datos usa cabeceras de 78 bits pero no se como podria guardar la imagen y luego cargar el datagridview. Esto ya lo he hecho en una aplicacion web usando la tabla empleados y los 78 bits guardo los datos del empleado y la imagen y al presionar el boton se acualiza el gridview y los datos se muestran sin problemas

    ResponderEliminar
  7. Como agregar imagen con INSERT INTO desde una imagen del disco duro local, sin usar SELECT que lo que hace es tomar una foto desde otra tabla.

    ResponderEliminar