Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Hartigan en 13 Junio 2010, 20:25 pm



Título: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 13 Junio 2010, 20:25 pm
Hola de nuevo compañeros. Necesito guardar una imágen en la base de datos, y he mirao tutoriales pero no hay manera, porque yo intento guardarla como byte, pero no me covierte, me dice que no puedo convertir un System.Drawing.Image en byte[].

que puedo hacer?? como paso o convierto la imágen??.

gracias de antemano.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: .mokk. en 13 Junio 2010, 20:33 pm
Pues yo lo tengo hecho tmb en un programa que hice anteriormente y lo hice con este tutorial

http://www.elguille.info/NET/ADONET/SQL2005Express/imagenes_base_SQLServer.htm

Tambien anteriormente cuando no sabia hacerlo, lo que hacia esque guardaba la imagen a un host o la enviava ahi o a una web local mia, y ya en la DB colocaba el link de la imagen.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 13 Junio 2010, 20:46 pm
gracias voy a probar, pero así leyendo por encima he visto esto:

Código:
img.Save(fs, System.Drawing.Imaging.ImageFormat.Png);

Si la imágen que yo he escogido anteriormente para mi picturebox no es png que hago??.

Es decir: yo tengo un formulario donde se agregan contactos (es una agenda) entonces cada contacto tendrá un picturebox con su imágen y unas serán en png, otras en jpg, otras gif... etc... Con eso todas las imágenes las convierte a png???. o como lo tendría que hacer sino...

Salu2


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 13 Junio 2010, 23:50 pm
Cuando necesite guardar imagenes en una BD los ejemplos que encontre primero guardaban la imagen en disco. Por eso yo lo hice de este modo:

Código
  1. System.IO.Stream derecho = new System.IO.MemoryStream();
  2. this.picDerecha.Image.Save(derecho, System.Drawing.Imaging.ImageFormat.Jpeg);
  3. byte[] imgDerecha = new byte[derecho.Length];
  4. derecho.Position = 0;
  5. derecho.Read(imgDerecha, 0, System.Convert.ToInt32(derecho.Length));
  6. derecho.Close();

Código
  1. myRow["IDerecha"] = imgDerecha;

gracias voy a probar, pero así leyendo por encima he visto esto:

Código:
img.Save(fs, System.Drawing.Imaging.ImageFormat.Png);

Si la imágen que yo he escogido anteriormente para mi picturebox no es png que hago??.

Solo cambias:

Código
  1. System.Drawing.Imaging.ImageFormat.Jpeg

por la extension que necesites.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 13 Junio 2010, 23:52 pm
No guardes imágenes en la Base De Datos, amenos de que esa columna esté físicamente almacenándose en otra partición o disco. Esto es por cuestiones de rendimiento y mantenimiento.

Lo mejor que puedes hacer es guardar la url o localpath (en caso de que sea web) o la dirección de red en caso de que sea Windows Form.

Se que es mucho más fácil almacenarlo en la base de datos, pero es algo que está fuera de las buenas prácticas.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 14 Junio 2010, 00:15 am
No guardes imágenes en la Base De Datos, amenos de que esa columna esté físicamente almacenándose en otra partición o disco. Esto es por cuestiones de rendimiento y mantenimiento.

Lo mejor que puedes hacer es guardar la url o localpath (en caso de que sea web) o la dirección de red en caso de que sea Windows Form.

Se que es mucho más fácil almacenarlo en la base de datos, pero es algo que está fuera de las buenas prácticas.

Que mejor que lea la opinion de un moderador y participantes de technet:

http://social.technet.microsoft.com/Forums/en-SG/sqlserveres/thread/a16a512c-9d43-441d-8585-47840ef09de5

de la cual rescato lo que me parecio una de las mejores respuestas:
La del moderador:

Citar
Dejaré mi opinión también.

Ante este tipo de situaciones, me es complicado ser imparcial. Yo administro servidores de bases de datos, no ficheros. Si puedo evitarme esa gestión y mandar los ficheros a otra parte, pues mejor. Es un riesgo importante administrar una gestión documental, ya que el crecimiento suele ser impredecible. De pronto un día a alguien le da por escanear, no sé, las nóminas del último año y guardarlas en la gestión documental. Puede ser que sean 100 documentos (y no pasa nada) o puede que se trate de una de las mayores empresas de trabajo temporal del mundo y la habremos liado.

Sin embargo, estoy convencido de que gestionado todo ello desde SQL Server, el rendimiento sería muy superior. También se algo más de SQL Server que de File System. Y las últimas versiones de SQL Server han introducido numerosas mejoras en ese aspecto. Filestream es una de ellas, para mí, lo que ha mejorado Full Text Search me parece mucho más importante, aunque también depende del tipo de ficheros a introducir en la base de datos. Si son imágines, da un poco igual, ya que no vas a indexar nada más que los metadatos.

Jesús, testear y hacer una prueba comparativa de concepto (pero una prueba seria) es imprescindible. Y una cosa es segura: tendrás problemas, tanto si lo dejas en el file system como si lo dejas en el servidor de bases de datos. Más copias de seguridad, más entornos de pruebas, etc. Un volumen muy grande para administrar (algo que suele ir unido a este tipo de cosas) suele presentar toda una serie de complejidades adicionales.

Ahora @D4N93R podrias indicarme un enlace o referencia de porque esta fuera de las buenas practicas el almacenar imagenes dentro de una BD.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 14 Junio 2010, 01:46 am
Bueno, lo primero, gracias por las respuestas.

He estado probando y no hay manera. Me da un error en la linea:

Código:
this.picDerecha.Image.Save(derecho, System.Drawing.Imaging.ImageFormat.Jpeg);

y el error que me da es:

Error genérico en GDI+.

Alguna solución???


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 14 Junio 2010, 02:19 am
Si vas a almacenar las imágenes, o cualquier archivo dentro de la base de datos es mejor que lo hagas en otra particion o disco, por que? Defragmentación de indices y data, espacio en disco, condiciones del servidor, etc. Normalmente en apliaciones grandes el webserver está separado de la base de datos, en aplicaciones grandes,  por el mismo motivo.

Otros motivos? Muchos son relevantes o irrelevantes según el escenario.

  • Backup, tomar en cuenta el tamaño del la BD.
  • Es mucho más fácil acceder las imágenes desde el file system. COmo por ejemplo para verlas, o abrir algún documento
  • Muchos hosting cobrab adicional por el espacio en BD

Encontré también algunos links:

http://stackoverflow.com/questions/561447/store-pictures-as-files-or-in-the-database-for-a-web-app (http://stackoverflow.com/questions/561447/store-pictures-as-files-or-in-the-database-for-a-web-app)

Ahora, dependiendo del escenario puedes almacenar archivos en la base de datos, pero, te recomiendo que hagas que la base de dato almacene esa columna en otro disco.


@43H4FH44H45H4CH49H56H45H, he desarrollados muchos sistemas de negocios, aplicaciones, consultorías y asesorías, he respondido a la mayoría problemas de mis clientes, y he sido testigo del problema de almacenar imagenes y archivos en la base de datos.

@Hartigan: que tipo de aplicación haces? describe un poco más la situación.



Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 14 Junio 2010, 02:29 am
Vale ya lo he solucionado. Parece que al selecionar la imágen en el picture box algo no se guardaba bien y luego había conflicto. Ahora ya me va. En principio se me guarda en la base de datos, pero ahora me está fallando al leer de la base de datos.

D4N93R  Estoy haciendo una agenda electronica. Entonces para cada contacto se podrá seleccionar una imágen por eso de guardarla en la base de datos. Otra forma no se como hacerlo. Si dices que es mejor guardando solo la ruta pues la verdad que si me dijeras como te estaría agradecido.

En cualquier caso ahora a ver si me podeis ayudar con esto.

Para leer la imágen de la base de datos hago lo siguiente:

Código
  1. public override byte[] Obtener_Imagen_Contacto()
  2.        {
  3.            byte[] img = null;            
  4.  
  5.            String sentenciaSQL = "SELECT imagen FROM contactos WHERE apodo = 'pavolino'";
  6.  
  7.            SqlConnection conexion = null;
  8.  
  9.            try
  10.            {
  11.                conexion = new SqlConnection(cadena_conexion);
  12.                SqlDataAdapter data_adapter = new SqlDataAdapter(sentenciaSQL, conexion);
  13.  
  14.                DataTable data_table = new DataTable();
  15.                conexion.Open();
  16.                data_adapter.Fill(data_table);
  17.  
  18.                img = new byte[0];
  19.                img = (byte[])data_table.Rows[0][0];
  20.  
  21.  
  22.  
  23.            }
  24.            catch (SqlException ex)
  25.            {
  26.                img = null;
  27.                MessageBox.Show("No se ha podido acceder a la fuente de datos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  28.            }
  29.            finally
  30.            {
  31.                if(conexion != null)
  32.                {
  33.                    if (conexion.State == ConnectionState.Open)
  34.                    {
  35.                        conexion.Close();
  36.                    }
  37.                }              
  38.            }
  39.            return (img);
  40.        }


luego desde el formulario, para que me cargue la imágen hago esto:

Código
  1. public Interfaz_Datos_Contacto(Factoria_DAO factoria)
  2.        {
  3.            InitializeComponent();
  4.  
  5.            factoriaDAO = factoria;
  6.  
  7.            MemoryStream stream = null;
  8.  
  9.            Gestor_Contacto gestor_contacto = new Gestor_Contacto();
  10.  
  11.            byte[] img = gestor_contacto.Obtener_Imagen_Contacto(factoriaDAO);
  12.  
  13.            stream = new MemoryStream(img);
  14.           pictureBox_FotoImagen.Image = Image.FromStream(stream);


El error me lo da en la última linea. Me dice que el parametro no es válido.

Solución??

Gracias de antemano.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 14 Junio 2010, 04:46 am
Lo puedes hacer asi:

Código
  1. byte[] MyData = new byte[0];
  2. MyData = (byte[])myRow["IDerecha"];
  3. int ArraySize = new int();
  4. ArraySize = MyData.GetUpperBound(0);
  5. System.IO.Stream derec = new System.IO.MemoryStream();
  6. derec.Write(MyData, 0, MyData.Length);
  7. picDerecha.Image = Image.FromStream(derec);

EDIT: Si quieres almacenar solo la ruta de la imagen, lo haces como texto. Osea solo guardas un string en la BD con la ruta donde se guardo la imagen, pero debes recordar como hacer el backup de dichas imagenes, o tb si quieres exportar tu BD.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 14 Junio 2010, 04:57 am
Si vas a almacenar las imágenes, o cualquier archivo dentro de la base de datos es mejor que lo hagas en otra particion o disco, por que? Defragmentación de indices y data, espacio en disco, condiciones del servidor, etc. Normalmente en apliaciones grandes el webserver está separado de la base de datos, en aplicaciones grandes,  por el mismo motivo.

Otros motivos? Muchos son relevantes o irrelevantes según el escenario.

  • Backup, tomar en cuenta el tamaño del la BD.
  • Es mucho más fácil acceder las imágenes desde el file system. COmo por ejemplo para verlas, o abrir algún documento
  • Muchos hosting cobrab adicional por el espacio en BD

Encontré también algunos links:

http://stackoverflow.com/questions/561447/store-pictures-as-files-or-in-the-database-for-a-web-app (http://stackoverflow.com/questions/561447/store-pictures-as-files-or-in-the-database-for-a-web-app)

Ahora, dependiendo del escenario puedes almacenar archivos en la base de datos, pero, te recomiendo que hagas que la base de dato almacene esa columna en otro disco.


Ahora @D4N93R podrias indicarme un enlace o referencia de porque esta fuera de las buenas practicas el almacenar imagenes dentro de una BD.

Al parecer no sabes ni lo que dicen en el enlace que pusiste, por ese motivo te cito lo que pregunte, y al parecer para alguien que:

@43H4FH44H45H4CH49H56H45H, he desarrollados muchos sistemas de negocios, aplicaciones, consultorías y asesorías, he respondido a la mayoría problemas de mis clientes, y he sido testigo del problema de almacenar imagenes y archivos en la base de datos.

y no tiene la capacidad de entender una simple pregunta  :rolleyes:

El tema trata de Guardar Imagen en base de datos. (c#) y no de tu supuesta "experiencia" que me causa sueño la verdad  ;D

Deberias tratar de entender lo que dicen en el enlace que pusiste que solo trata de un tema en particular de almacenamiento y no en general.

Por cierto el mejor lugar para buscar información de determinada plataforma (en este caso .NET) es el lugar donde estan los desarrolladores y personal del mismo.

No iria a preguntar cosas de MSSQL al foro de MySql  :laugh:


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 14 Junio 2010, 06:05 am
Tampoco puedo ayudarlo si ni quiera me dice si es Windows Form o Web Applications.


Citar
El tema trata de Guardar Imagen en base de datos. (c#) y no de tu supuesta "experiencia" que me causa sueño la verdad  

Deberias tratar de entender lo que dicen en el enlace que pusiste que solo trata de un tema en particular de almacenamiento y no en general.

No estoy aquí para discutir nada, simplemente para aportar. Tu crees que el almancenamieto no es un punto importante? o crees que es irrelevante? No voy a pasar toda la tarde buscando fuentes de todos y cada uno de los puntos en pro y en contra de subir archivos a una base de datos, simplemente fue un ejemplo.

Citar
Por cierto el mejor lugar para buscar información de determinada plataforma (en este caso .NET) es el lugar donde estan los desarrolladores y personal del mismo.

Recomendaciones por parte de Microsoft? por favor, que ni ellos saben que es lo que los desarrolladores necesitan, LINQ? muy bonito pero lento. WPF, suena bien, pero no es la vía. Por lo que un sitio con evangelistas de microsoft no siempre es el mejor lugar para buscar respuestas.

Quieres soluciones compruébalo por ti mismo: Una solución es relativa y depende mucho del escenario. Por eso es que hay varias formas de hacer las cosas, son herramientas y tu escoges la que más necesites.

Citar
No iria a preguntar cosas de MSSQL al foro de MySql

Pues si es una pregunta que no tiene nada que ver con la base de datos en si, sino con el tema en general, no hay problema en hacerlo.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: raul338 en 14 Junio 2010, 06:42 am
Che che bajen un cambio que se va a mayores esto :xD

Guardar imagenes en la bd siempre fue mala practica, que hagan cosas para mejorarlo es otra cosa, pero una vez que tiene la fea mirada  es dificil sacarsela.

Es como los GOTOs del viejo vb, antes hacia ***** la pc usarlos, ahora ..... se pueden hacer muchas cosas... pero nadie los usa porque ya inculcaron que es malo usarlos

SQL 2008 lo que hizo al agregar el campo FILESTREAM fue automatizar el agregado de archivos, si vez como funciona, guarda como si fuera un disco NTFS, nada del otro mundo, solo que ahora lo administra el sql y no el usuario comun o administrador.

Creo que el Hartigan ya resolvio su duda, asi que quedaria terminado esto, salvo que el diga lo contrario :P


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 14 Junio 2010, 12:18 pm
43H4FH44H45H4CH49H56H45H  muchas gracias, voy a probar a ver si me funciona lo que me has dicho.

D4N93R   perdona, tienes razón que no expliqué lo que era. Es un windows form. xD gracias.

raul338   como puse arriba sigo teniendo problemas. Voy a probar lo que me ha dicho el compañero a ver si me funciona y os comento. xD


En cuanto a la discusión que llevais sobre almacenar imágenes o no en la bdd, no veo porqué es una mala practica el guardarlas. Veo mucho peor guardar solo la dirección. Si tu cambias la ímagen de sitio que haces??' como la recupera si ya no está en la dirección que tienes almacenada???.


Saludos ;) y gracias a todos.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 14 Junio 2010, 13:26 pm
Nada, no hay menera, me sigue diciendo que el parámetro no es válido...


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: raul338 en 14 Junio 2010, 14:27 pm
Código
  1. //........
  2. byte[] img = gestor_contacto.Obtener_Imagen_Contacto(factoriaDAO);
  3. //..........
  4.  
Estas seguro de que eso es una imagen?
Ponlo en un picturebox de prueba aver si sale :P


En cuanto a la discusión que llevais sobre almacenar imágenes o no en la bdd, no veo porqué es una mala practica el guardarlas. Veo mucho peor guardar solo la dirección. Si tu cambias la ímagen de sitio que haces??' como la recupera si ya no está en la dirección que tienes almacenada???.
La idea es que el directorio sea intocable :xD


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 14 Junio 2010, 14:39 pm
Nada, no hay menera, me sigue diciendo que el parámetro no es válido...

Primero haz una prueba aparte solo con una imagen, es mas fácil localizar el error.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 14 Junio 2010, 14:41 pm
Che che bajen un cambio que se va a mayores esto :xD

No pasa nada  :P , tan solo es un debate  ;D

No estoy aquí para discutir nada, simplemente para aportar. Tu crees que el almancenamieto no es un punto importante? o crees que es irrelevante? No voy a pasar toda la tarde buscando fuentes de todos y cada uno de los puntos en pro y en contra de subir archivos a una base de datos, simplemente fue un ejemplo.


Quieres soluciones compruébalo por ti mismo: Una solución es relativa y depende mucho del escenario. Por eso es que hay varias formas de hacer las cosas, son herramientas y tu escoges la que más necesites.

Y es lo que puse en el 1er enlace y la respuesta que la acompañaba (donde hablan de pruebas que deben hacerse y demás), la cual es similar al enlace que diste (que son opiniones). Y llegamos al punto de inicio y sigues repitiendo lo que ya estaba claro, que no aporta nada nuevo al tema  :-\

Recomendaciones por parte de Microsoft? por favor, que ni ellos saben que es lo que los desarrolladores necesitan, LINQ? muy bonito pero lento. WPF, suena bien, pero no es la vía. Por lo que un sitio con evangelistas de microsoft no siempre es el mejor lugar para buscar respuestas.

Como ejemplo: Si alguien X adquiere un programa, y necesita una solucion del mismo buscara primero al creador del programa o se ira a perder horas en internet preguntando una solución (claro alguien habra que sepa mejor que el creador acerca de ese programa).

Es obvio no?  :rolleyes:

Citar
No iria a preguntar cosas de MSSQL al foro de MySql

Pues si es una pregunta que no tiene nada que ver con la base de datos en si, sino con el tema en general, no hay problema en hacerlo.

Hablo de MSSQL no de SQL  :rolleyes:


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 14 Junio 2010, 15:03 pm
Código
  1. //........
  2. byte[] img = gestor_contacto.Obtener_Imagen_Contacto(factoriaDAO);
  3. //..........
  4.  
Estas seguro de que eso es una imagen?
Ponlo en un picturebox de prueba aver si sale :P


En cuanto a la discusión que llevais sobre almacenar imágenes o no en la bdd, no veo porqué es una mala practica el guardarlas. Veo mucho peor guardar solo la dirección. Si tu cambias la ímagen de sitio que haces??' como la recupera si ya no está en la dirección que tienes almacenada???.
La idea es que el directorio sea intocable :xD


Eso son los bytes de la imagen. Luego hago la conversión. Lo de la factoria es porque llamo a un método que accede a a la base de datos usando el patrón dao.

Gracias por las respuestas. Voy a probar por separado como dice el compañero a ver si saco algo.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 14 Junio 2010, 15:14 pm
Esque depurando el programa me sale que lee bien la imágen de la base de datos, pero al llegar al punto de convertirla da el error...

Aquí dejo una captura: http://img714.imageshack.us/img714/7483/programe.png

en ese momento de la depuración ya se han obtenido los datos y procedo a continuación a pasarlos a sus correspondientes controles como podeis ver...

Salu2.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: raul338 en 14 Junio 2010, 15:50 pm
Esta bien a menos que sepas leer una imagen en hexadecimal a simple vista :silbar:

yo te digo que lo pongas en un picturebox ysi se ve la imagen, es porque el error esta en otro lado. Sino se ve, esporque pusiste mal la imagen :P


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 14 Junio 2010, 15:58 pm
Esta bien a menos que sepas leer una imagen en hexadecimal a simple vista :silbar:

yo te digo que lo pongas en un picturebox ysi se ve la imagen, es porque el error esta en otro lado. Sino se ve, esporque pusiste mal la imagen :P

Esque no me carga, porque da error.

Cuando yo al principio selecciono la imágen en un picture box para guardarla luego en la base de datos lo hace bien. Luego al leerla y sacarla a otro picturebox ya no funciona bien. Y la imágen parece que la coge bien de la base de datos... pero vete tu a saber...


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 14 Junio 2010, 17:57 pm
Acá te dejo esto que acabo de hacer, espero te funcione:

Código C#:
http://pastebin.com/Vp1XLfit

Código del component del formulario:
Código
  1.        private System.Windows.Forms.PictureBox pictureBox1;
  2.        private System.Windows.Forms.Button button1;
  3.        private System.Windows.Forms.ListView listView1;
  4.        private System.Windows.Forms.Button button2;
  5.        private System.Windows.Forms.TextBox m_imageTitle;
  6.        private System.Windows.Forms.Label label1;
  7.  

Base de datos
Una tabla, llamada Image, con las siguientes columnas:

- ID identiy decimal
- Title varchar
- ImageData de tipo Image.


PD: disculpa que no tiene comentarios, y los controles tienen el nombre por defecto, pero no tengo mucho tiempo ahora. Si tienes una duda no dudes en consultar..

Saludos


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 14 Junio 2010, 18:04 pm
Acá te dejo esto que acabo de hacer, espero te funcione:

Código C#:
http://pastebin.com/Vp1XLfit

Código del component del formulario:
Código
  1.        private System.Windows.Forms.PictureBox pictureBox1;
  2.        private System.Windows.Forms.Button button1;
  3.        private System.Windows.Forms.ListView listView1;
  4.        private System.Windows.Forms.Button button2;
  5.        private System.Windows.Forms.TextBox m_imageTitle;
  6.        private System.Windows.Forms.Label label1;
  7.  

Base de datos
Una tabla, llamada Image, con las siguientes columnas:

- ID identiy decimal
- Title varchar
- ImageData de tipo Image.


PD: disculpa que no tiene comentarios, y los controles tienen el nombre por defecto, pero no tengo mucho tiempo ahora. Si tienes una duda no dudes en consultar..

Saludos

Muchas gracias voy a mirarlo a ver.

una pregunta. Es necesario guardar un nombre para imagen?? porque yo solamente guardo el campo imagen y veo que tu y más gente creais tres campos... esque yo tengo una tabla con todos los datos del contacto (nombre, apellidos... ) y uno de ellos es un campo (imagen image). Con eso debería servir no???.-

Salu2. y gracias,


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 14 Junio 2010, 18:28 pm
Si Claro, es esencialmente lo mismo. También podrías usar otra tabla para almacenar las imagenes, de modo de que cada usuario pueda tener más, no se , es solo una idea, así no solamente tienen una sola sino que pueden tener dos, o más.

El nombre de la imagen, no es el nombre sino un titulo, que es el que sale en el listbox, es como la equivalencia al nombre de la persona en tu base de datos.

Saludos


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 14 Junio 2010, 22:08 pm
Lool, no me funciona tu programa. xD


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 15 Junio 2010, 12:20 pm
ya me funciona tu programa D4N93R, a ver si consigo aplicarlo al mio, pero veo un inconveniente que yo no tengo un listview de esos, y entonces como puedo usar el foreach????


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 15 Junio 2010, 13:48 pm
Bueno no hay manera. He seguido tropecientos tutoriales y esque hay algo que no va bien. En la parte en la que se hace la conversión de bytes al tipo image, toma el valor null, no se porqué y entonces no le asigna nada... Creo que voy a desistir y a probar el método de almacenar solo la dirección local de la imágen.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 15 Junio 2010, 15:00 pm
Cómo que no tienes un listview? claro que si, arrástralo de la barra de herramientas. y le pones el mismo nombre que en mi código.

Vamos vamos que si puedes..


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 15 Junio 2010, 15:57 pm
Cómo que no tienes un listview? claro que si, arrástralo de la barra de herramientas. y le pones el mismo nombre que en mi código.

Vamos vamos que si puedes..

si tener lo tengo, pero en mi programa no tengo intención de añadirlo. xDD Probaré aunque sea por ver si funciona. xD


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 15 Junio 2010, 15:58 pm
Bueno no hay manera. He seguido tropecientos tutoriales y esque hay algo que no va bien. En la parte en la que se hace la conversión de bytes al tipo image, toma el valor null, no se porqué y entonces no le asigna nada... Creo que voy a desistir y a probar el método de almacenar solo la dirección local de la imágen.

Puedes leer que almaceno en la BD sin asignar la imagen al picturebox.
Si leemos algunos bytes antes de almacenarlos:

Código
  1. System.IO.Stream derecho = new System.IO.MemoryStream();
  2. this.pictureBox1.Image.Save(derecho, System.Drawing.Imaging.ImageFormat.Jpeg);
  3. byte[] imgDerecha = new byte[derecho.Length];
  4. derecho.Position = 0;
  5. derecho.Read(imgDerecha, 0, System.Convert.ToInt32(derecho.Length));
  6. derecho.Close();
  7. this.textBox1.Text = imgDerecha[0].ToString() + " " + imgDerecha[1].ToString();

y luego con la BD antes de asignar la imagen leemos los mismos bytes para saber si se almaceno correctamente asi podemos comparar con los bytes originales.
Puedes hacerlo con el primero y el ultimo o hacer un foreach para saber donde existe alguna diferencia.
Me parece que no estas guardando correctamente los bytes en la BD.
Pero tienes que hacer las pruebas para estar seguro en que parte tienes el problema.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 15 Junio 2010, 16:39 pm
Bueno no hay manera. He seguido tropecientos tutoriales y esque hay algo que no va bien. En la parte en la que se hace la conversión de bytes al tipo image, toma el valor null, no se porqué y entonces no le asigna nada... Creo que voy a desistir y a probar el método de almacenar solo la dirección local de la imágen.

Puedes leer que almaceno en la BD sin asignar la imagen al picturebox.
Si leemos algunos bytes antes de almacenarlos:

Código
  1. System.IO.Stream derecho = new System.IO.MemoryStream();
  2. this.pictureBox1.Image.Save(derecho, System.Drawing.Imaging.ImageFormat.Jpeg);
  3. byte[] imgDerecha = new byte[derecho.Length];
  4. derecho.Position = 0;
  5. derecho.Read(imgDerecha, 0, System.Convert.ToInt32(derecho.Length));
  6. derecho.Close();
  7. this.textBox1.Text = imgDerecha[0].ToString() + " " + imgDerecha[1].ToString();

y luego con la BD antes de asignar la imagen leemos los mismos bytes para saber si se almaceno correctamente asi podemos comparar con los bytes originales.
Puedes hacerlo con el primero y el ultimo o hacer un foreach para saber donde existe alguna diferencia.
Me parece que no estas guardando correctamente los bytes en la BD.
Pero tienes que hacer las pruebas para estar seguro en que parte tienes el problema.

Tiene que ser eso, que se guardan mal los datos, porque incluso con el programa de D4N93R me sale el mismo error en el listview (parámetro no válido).

Voy a probar a ver. Muchas gracias.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 15 Junio 2010, 17:28 pm
Bueno pues efectivamente ahí está el problema.

Os publico como hago para guardar y para leer de la base de datos a ver si veis el error

Guardar:

Código
  1. private void button_AceptarNC_Click(object sender, EventArgs e)
  2.        {
  3.            bool exito = false;
  4.            //Primero copiamos las strings
  5.            string[] datos = new string[33];
  6.            int imgLength = 0;
  7.  
  8.            /*string temp = Path.GetTempFileName();
  9.             FileStream fs = new FileStream(temp, FileMode.OpenOrCreate, FileAccess.ReadWrite);*/
  10.  
  11.            System.IO.Stream derecho = new System.IO.MemoryStream();
  12.            this.pictureBox_FotoImagen.Image.Save(derecho, System.Drawing.Imaging.ImageFormat.Jpeg);
  13.            byte[] img = new byte[derecho.Length];
  14.            derecho.Position = 0;
  15.            derecho.Read(img, 0, System.Convert.ToInt32(derecho.Length));
  16.            derecho.Close();
  17.            this.textBox1.Text = img[0].ToString() + " " + img[1].ToString() + " " + img[2].ToString() + " " + img[3].ToString();
  18.  
  19.  
  20.  
  21.            //System.IO.Stream stream = new System.IO.MemoryStream();
  22.  
  23.            datos[0] = this.textBox_Titulo.Text;
  24.            datos[1] = this.textBox_Nombre.Text;
  25.            datos[2] = this.textBox_SegundoNombre.Text;
  26.            datos[3] = this.textBox_PrimerApellido.Text;
  27.            datos[4] = this.textBox_SegundoApellido.Text;
  28.            datos[5] = this.textBox_Sobrenombre.Text;
  29.            datos[6] = this.textBox_Direccion.Text;
  30.            datos[7] = this.textBox_Ciudad.Text;
  31.            datos[8] = this.textBox_Provincia.Text;
  32.            datos[9] = this.textBox_CodigoPostal.Text;
  33.            datos[10] = this.textBox_Pais.Text;
  34.            datos[11] = this.textBox_Prefijo_Telefono.Text + this.textBox_Telefono.Text;
  35.            datos[12] = this.textBox_Movil.Text;
  36.            datos[13] = this.textBox_Fax.Text;
  37.            datos[14] = this.listBox_Email.Text;
  38.            datos[15] = this.textBox_Web.Text;
  39.            datos[16] = this.textBox_Twitter.Text;
  40.            datos[17] = this.textBox_Facebook.Text;
  41.            datos[18] = this.textBox_Direccion_Trabajo.Text;
  42.            datos[19] = this.textBox_Ciudad_Trabajo.Text;
  43.            datos[20] = this.textBox_Provincia_Trabajo.Text;
  44.            datos[21] = this.textBox_CP_Trabajo.Text;
  45.            datos[22] = this.textBox_Pais_Trabajo.Text;
  46.            datos[23] = this.textBox_Organizacion_Trabajo.Text;
  47.            datos[24] = this.textBox_Puesto_Trabajo.Text;
  48.            datos[25] = this.textBox_Departamento_Trabajo.Text;
  49.            datos[26] = this.textBox_Oficina_Trabajo.Text;
  50.            datos[27] = this.textBox_Telefono_Trabajo.Text;
  51.            datos[28] = this.textBox_Fax_Trabajo.Text;
  52.            datos[29] = this.comboBox_Sexo.Text;
  53.            datos[30] = this.textBox_Pareja.Text;
  54.            datos[31] = this.listBox_Hijos.Text;
  55.            datos[32] = this.richTextBox_Comentario.Text;
  56.  
  57.  
  58.            /*this.pictureBox_FotoImagen.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
  59.             fs.Position = 0;
  60.  
  61.             imgLength = Convert.ToInt32(fs.Length);
  62.             byte[] img = new byte[imgLength];
  63.             fs.Read(img, 0, imgLength);
  64.             fs.Close();*/
  65.  
  66.            String sentenciaSQL = "insert into contactos values('" + datos[0] + "','" + datos[1] + "','" + datos[2] + "','" +
  67.                     datos[3] + "','" + datos[4] + "','" + datos[5] + "','" + datos[6] + "','" + datos[7] + "','" + datos[8] + "','" +
  68.                     datos[9] + "','" + datos[10] + "','" + datos[11] + "','" + datos[12] + "','" + datos[13] + "','" + datos[14] + "','" +
  69.                     datos[15] + "','" + datos[16] + "','" + datos[17] + "','" + datos[18] + "','" + datos[19] + "','" + datos[20] + "','" +
  70.                     datos[21] + "','" + datos[22] + "','" + datos[23] + "','" + datos[24] + "','" + datos[25] + "','" + datos[26] + "','" +
  71.                     datos[27] + "','" + datos[28] + "','" + datos[29] + "','" + datos[30] + "','" + datos[31] + "','" + datos[32] + "','" + img + "')";
  72.  
  73.            SqlConnection conexion = null;
  74.  
  75.            try
  76.            {
  77.                conexion = new SqlConnection(cadena_conexion);
  78.                conexion.Open();
  79.  
  80.                SqlCommand cmd = new SqlCommand(sentenciaSQL, conexion);
  81.  
  82.                if ((1 != cmd.ExecuteNonQuery()))
  83.                {
  84.                    MessageBox.Show("Se ha producido un error al acceder a la fuente de datos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  85.                    exito = false;
  86.                }
  87.                else
  88.                {
  89.                    exito = true;
  90.                }
  91.  
  92.            }
  93.            catch (SqlException ex)
  94.            {
  95.                // MessageBox.Show(ex.InnerException.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  96.                MessageBox.Show(" ha producido un error al acceder a la fuente de datos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  97.                exito = false;
  98.            }
  99.            finally
  100.            {
  101.                if (conexion != null)
  102.                {
  103.                    if (conexion.State == ConnectionState.Open)
  104.                    {
  105.                        conexion.Close();
  106.                    }
  107.                }
  108.            }
  109. if (exito)
  110.            {
  111.                MessageBox.Show("Contacto añadido con exito", "Éxito", MessageBoxButtons.OK, MessageBoxIcon.Information);
  112.                this.Close();
  113.            }
  114.            else
  115.            {
  116.                MessageBox.Show("No se ha podido añadir el contacto", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  117.                this.Close();
  118.            }
  119.  
  120.  
  121.  
  122.  
  123.  
  124.        }
  125.  

Ahora como leo:

Código
  1. public Interfaz_Datos_Contacto()
  2.        {
  3.            InitializeComponent();
  4.  
  5.  
  6.            string cadena_conexion = @"Server= (local)\SQLEXPRESS; DataBase = agenda; Integrated Security = yes;";
  7.  
  8.            byte[] img = new byte[0];
  9.            string[] datos = new string[33];
  10.  
  11.  
  12.  
  13.            String sentenciaSQL = "SELECT * FROM contactos WHERE apodo = 'pavolino'";
  14.  
  15.            SqlConnection conexion = null;
  16.  
  17.            try
  18.            {
  19.                conexion = new SqlConnection(cadena_conexion);
  20.                SqlDataAdapter data_adapter = new SqlDataAdapter(sentenciaSQL, conexion);
  21.  
  22.                DataTable data_table = new DataTable();
  23.  
  24.                conexion.Open();
  25.                data_adapter.Fill(data_table);
  26.  
  27.                datos = new string[33];
  28.                datos[0] = data_table.Rows[0][0].ToString();
  29.                datos[1] = data_table.Rows[0][1].ToString();
  30.                datos[2] = data_table.Rows[0][2].ToString();
  31.                datos[3] = data_table.Rows[0][3].ToString();
  32.                datos[4] = data_table.Rows[0][4].ToString();
  33.                datos[5] = data_table.Rows[0][5].ToString();
  34.                datos[6] = data_table.Rows[0][6].ToString();
  35.                datos[7] = data_table.Rows[0][7].ToString();
  36.                datos[8] = data_table.Rows[0][8].ToString();
  37.                datos[9] = data_table.Rows[0][9].ToString();
  38.                datos[10] = data_table.Rows[0][10].ToString();
  39.                datos[11] = data_table.Rows[0][11].ToString();
  40.                datos[12] = data_table.Rows[0][12].ToString();
  41.                datos[13] = data_table.Rows[0][13].ToString();
  42.                datos[14] = data_table.Rows[0][14].ToString();
  43.                datos[15] = data_table.Rows[0][15].ToString();
  44.                datos[16] = data_table.Rows[0][16].ToString();
  45.                datos[17] = data_table.Rows[0][17].ToString();
  46.                datos[18] = data_table.Rows[0][18].ToString();
  47.                datos[19] = data_table.Rows[0][19].ToString();
  48.                datos[20] = data_table.Rows[0][20].ToString();
  49.                datos[21] = data_table.Rows[0][21].ToString();
  50.                datos[22] = data_table.Rows[0][22].ToString();
  51.                datos[23] = data_table.Rows[0][23].ToString();
  52.                datos[24] = data_table.Rows[0][24].ToString();
  53.                datos[25] = data_table.Rows[0][25].ToString();
  54.                datos[26] = data_table.Rows[0][26].ToString();
  55.                datos[27] = data_table.Rows[0][27].ToString();
  56.                datos[28] = data_table.Rows[0][28].ToString();
  57.                datos[29] = data_table.Rows[0][29].ToString();
  58.                datos[30] = data_table.Rows[0][30].ToString();
  59.                datos[31] = data_table.Rows[0][31].ToString();
  60.                datos[32] = data_table.Rows[0][32].ToString();
  61.  
  62.  
  63.  
  64.  
  65.  
  66.                foreach (DataRow myRow in data_table.Rows)
  67.                {
  68.                    img = (byte[])myRow["imagen"];
  69.                    this.textBox1.Text = img[0].ToString() + " " + img[1].ToString() + " " + img[2].ToString() + " " + img[3].ToString();
  70.  
  71.                }
  72.  
  73.            }
  74.            catch (SqlException ex)
  75.            {
  76.                datos = null;
  77.                MessageBox.Show("No se ha podido acceder a la fuente de datos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  78.            }
  79.            finally
  80.            {
  81.                if (conexion != null)
  82.                {
  83.                    if (conexion.State == ConnectionState.Open)
  84.                    {
  85.                        conexion.Close();              
  86.  
  87.                    }
  88.                }
  89.            }
  90. if ((datos != null) && ( img != null))
  91.            {
  92.                label_Nombre_Completo.Text = datos[1] + "" + datos[2] + "" + datos[3] + "" + datos[4];
  93.                label_Titulo.Text = datos[0];
  94.                label_Nombre.Text = datos[1];
  95.                label_SegundoNombre.Text = datos[2];
  96.                label_PrimerApellido.Text = datos[3];
  97.                label_SegundoApellido.Text = datos[4];
  98.                label_Sobrenombre.Text = datos[5];
  99.                label_Direccion.Text = datos[6];
  100.                label_Ciudad.Text = datos[7];
  101.                label_EstadoProvincia.Text = datos[8];
  102.                label_CodigoPostal.Text = datos[9];
  103.                label_PaisRegion.Text = datos[10];
  104.                label_Telefono.Text = datos[11];
  105.                label_Movil.Text = datos[12];
  106.                label_Fax.Text = datos[13];
  107.                label_EMail.Text = datos[14];
  108.                label_Web.Text = datos[15];
  109.                label_Twitter.Text = datos[16];
  110.                label_Facebook.Text = datos[17];
  111.                label_Direccion_Trabajo.Text = datos[18];
  112.                label_Ciudad_Trabajo.Text = datos[19];
  113.                label_Provincia_Trabajo.Text = datos[20];
  114.                label_CP_Trabajo.Text = datos[21];
  115.                label_Pais_Trabajo.Text = datos[22];
  116.                label_Organizacion_Trabajo.Text = datos[23];
  117.                label_Puesto_Trabajo.Text = datos[24];
  118.                label_Departamento_Trabajo.Text = datos[25];
  119.                label_Oficina_Trabajo.Text = datos[26];
  120.                label_Telefono_Trabajo.Text = datos[27];
  121.                label_Fax_Trabajo.Text = datos[28];
  122.                label_Sexo.Text = datos[29];
  123.                label_Pareja.Text = datos[30];
  124.                label_Hijos.Text = datos[31];
  125.                richTextBox_Comentarios.Text = datos[32];
  126.  
  127.  
  128.  
  129.                MemoryStream stream = new MemoryStream(img);
  130.                stream.Write(img, 0, img.Length);
  131.                stream = new MemoryStream(img);
  132.                this.pictureBox_FotoImagen.Image = Image.FromStream(stream);      
  133.  
  134.  
  135.  
  136.           }
  137.            else
  138.            {
  139.                MessageBox.Show("Se ha producido un error al obtener los datos del contacto", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  140.            }
  141.  
  142.  
  143.  
  144.        }

He dejado el código donde compruebo los bytes y es ceirto que salen completamente distintos.

Salu2.

EDITO: la tabla de los contactos en la base de datos la tengo así:

Código
  1. CREATE TABLE contactos(
  2. titulo VARCHAR(50),
  3. nombre VARCHAR(50) NOT NULL,
  4. nombre2 VARCHAR(50),
  5. ape1 VARCHAR(50) NOT NULL,
  6. ape2 VARCHAR(50),
  7. apodo VARCHAR(50) NOT NULL,
  8. direccion VARCHAR(150),
  9. ciudad VARCHAR(20),
  10. provincia VARCHAR(20),
  11. cp VARCHAR(10),
  12. pais VARCHAR(20),
  13. telefono VARCHAR(20),
  14. movil VARCHAR(20),
  15. fax VARCHAR(20),
  16. email VARCHAR(50),
  17. web VARCHAR(50),
  18. twitter VARCHAR(50),
  19. facebook VARCHAR(50),
  20. direccion2 VARCHAR(150),
  21. ciudad2 VARCHAR(20),
  22. provincia2 VARCHAR(20),
  23. cp2 VARCHAR(10),
  24. pais2 VARCHAR(20),
  25. organizacion VARCHAR(50),
  26. puesto VARCHAR(50),
  27. departamento VARCHAR(50),
  28. oficina VARCHAR(50),
  29. telefono2 VARCHAR(20),
  30. fax2 VARCHAR(20),
  31. sexo VARCHAR(10),
  32. pareja VARCHAR(50),
  33. hijos VARCHAR(100),
  34. comentario VARCHAR(500),
  35. imagen image,
  36.  
  37. );


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 15 Junio 2010, 17:35 pm
Obviamente mi código era de referencia, y el listview lo cree para listar las imágenes.

Pero bueno ya solucionaste no?

EDIT:

Ahora que veo tu código tienes varios problemas que, creo, deberías echarle un ojo:

1.- Considera usar una struct o clase, para almacenar la data en vez de un arreglo
2.- Qué pasa si la imagen no es jpeg?
3.- Si la aplicación final va a usar SqlServerExpress no pongas las fotos en la BD porque la versión express tiene un límite de almacenamiento.
4.- Considera usar una clase de acceso a datos en vez de hacerlo todo en un método.
5.- En:
Código:
String sentenciaSQL = "SELECT * FROM contactos WHERE apodo = 'pavolino'"; 
Seleccionas * , por lo que la consulta se hace más lenta, considera seleccionar las columnas que necesitas, así sean todas. Además de que nada asegura de que estas usando la imagen correcta al momento de cargar la data ya que estas usando un foreach en vez de validar si hay registros en el datatable y luego usar el primero.
6.- Con respecto a la base de datos, siempre utiliza un primarykey decimal, autoincremental, es decir, identity, con eso creas una identidad para el sistema.

Un saludo!


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 15 Junio 2010, 17:39 pm
Obviamente mi código era de referencia, y el listview lo cree para listar las imágenes.

Pero bueno ya solucionaste no?

ya me imaigno. Que va tio, me sigue pasando lo mismo. El problema es como dice el compañero 43H4FH44H45H4CH49H56H45H  que los datos que guardo y los que recojo son completamente distintos. Al guardar los bytes son: 255 216 255 224....... y al leer de la base de datos, la variable img tiene los siguientes bytes: 83 121 115 116...... como puedes ver no se parecen en nada. Entonces debe ser o que guardo mal, o que recojo mal, pero esque he seguido vuestros códigos y debería estar bien, no veo el fallo por ningun lado... A ver si me podeis ayudar.

Saludos y perdonar todas las molestias que estoy causando.

Gracias.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 15 Junio 2010, 18:04 pm
Hartigan, edite mi post anterior. :)


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 15 Junio 2010, 18:14 pm
@Hartigan en el insert solo inserta la imagen y un string para la consulta, luego prueba nuevamente que valores guarda.

Código
  1. INSERT INTO <nombre_tabla>
  2. [(<campo1>[,<campo2>,...])]
  3. VALUES
  4. (<valor1>,<valor2>,...);

debes especificar el campo y el valor para hacerlo.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 15 Junio 2010, 18:25 pm
Una cosa mas, estas utilizando:

Código
  1. '" + img + "'

saca las dobles comillas.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 15 Junio 2010, 18:38 pm
Ya probé el código de escritura que usas, funciona bien, ahora, yo creo que el problema que tienes esta en la lectura, o carga de data . Específicamente akí:

Código
  1. foreach (DataRow myRow in data_table.Rows)
  2. {
  3.     img = (byte[])myRow["imagen"];
  4.     this.textBox1.Text = img[0].ToString() + " " + img[1].ToString() + " " + img[2].ToString() + " " + img[3].ToString();
  5. }

En donde estas recorriendo un datatable que supuestamente debería tener un solo registro.

Si por casualidad te vienen dos vas a mostrar la imagen que no es, o pueede que sea hasta data corrupta que tengas en un registro mientras hacías las pruebas. y por eso te da error.

Entonces, añadres un brake en el foreach, cosa que es mala práctica, o lo haces de ésta manera:

Código
  1. if(data_table.Rows.Count>0)
  2. {
  3.     DataRow myRow = data_table.Rows[0];
  4.     img = (byte[])myRow["imagen"];
  5.     this.textBox1.Text = img[0].ToString() + " " + img[1].ToString() + " " + img[2].ToString() + " " + img[3].ToString();
  6. }


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 15 Junio 2010, 18:42 pm
Obviamente mi código era de referencia, y el listview lo cree para listar las imágenes.

Pero bueno ya solucionaste no?

EDIT:

Ahora que veo tu código tienes varios problemas que, creo, deberías echarle un ojo:

1.- Considera usar una struct o clase, para almacenar la data en vez de un arreglo
2.- Qué pasa si la imagen no es jpeg?
3.- Si la aplicación final va a usar SqlServerExpress no pongas las fotos en la BD porque la versión express tiene un límite de almacenamiento.
4.- Considera usar una clase de acceso a datos en vez de hacerlo todo en un método.
5.- En:
Código:
String sentenciaSQL = "SELECT * FROM contactos WHERE apodo = 'pavolino'"; 
Seleccionas * , por lo que la consulta se hace más lenta, considera seleccionar las columnas que necesitas, así sean todas. Además de que nada asegura de que estas usando la imagen correcta al momento de cargar la data ya que estas usando un foreach en vez de validar si hay registros en el datatable y luego usar el primero.
6.- Con respecto a la base de datos, siempre utiliza un primarykey decimal, autoincremental, es decir, identity, con eso creas una identidad para el sistema.

Un saludo!


hola, gracias. te comento:

1. lo intentaré hacer así xD
2. Eso es lo que me preguntaba yo unos post más atrás.
3. Seguramente termine usando mysql, de momento ando probando con imágenes pequeñajas. xD
4. Sí, en mi código lo hago por separado, ya que utilizo un patron dao y el acceso lo hago en otra clase.
5. Pero si quiero seleccionar todos los datos??? no entiendo muy bien como se haría..
6. Sí, ahora solo estoy de pruebas, luego tendré que usar un primary key para hacer las búsquedas.


@Hartigan en el insert solo inserta la imagen y un string para la consulta, luego prueba nuevamente que valores guarda.

Código
  1. INSERT INTO <nombre_tabla>
  2. [(<campo1>[,<campo2>,...])]
  3. VALUES
  4. (<valor1>,<valor2>,...);

debes especificar el campo y el valor para hacerlo.

No entiendo muy  bien como sería.... dices que le pase la imagen y un array para los datos???...

Una cosa mas, estas utilizando:

Código
  1. '" + img + "'

saca las dobles comillas.

ok, voy a probar a ver.

Muchas gracias a los 2.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 15 Junio 2010, 18:45 pm
Ya probé el código de escritura que usas, funciona bien, ahora, yo creo que el problema que tienes esta en la lectura, o carga de data . Específicamente akí:

Código
  1. foreach (DataRow myRow in data_table.Rows)
  2. {
  3.     img = (byte[])myRow["imagen"];
  4.     this.textBox1.Text = img[0].ToString() + " " + img[1].ToString() + " " + img[2].ToString() + " " + img[3].ToString();
  5. }

En donde estas recorriendo un datatable que supuestamente debería tener un solo registro.

Si por casualidad te vienen dos vas a mostrar la imagen que no es, o pueede que sea hasta data corrupta que tengas en un registro mientras hacías las pruebas. y por eso te da error.

Entonces, añadres un brake en el foreach, cosa que es mala práctica, o lo haces de ésta manera:

Código
  1. if(data_table.Rows.Count>0)
  2. {
  3.     DataRow myRow = data_table.Rows[0];
  4.     img = (byte[])myRow["imagen"];
  5.     this.textBox1.Text = img[0].ToString() + " " + img[1].ToString() + " " + img[2].ToString() + " " + img[3].ToString();
  6. }

Entonces el código que yo tengo para guardar está bien??? jejej gracias por probarlo. Aun así cambiaré las cosas que me habeis comentado. Voy a probar a cambiar el código de lectura a ver si me funciona con lo que me has dicho.

Saludos , ahora os comento.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 15 Junio 2010, 18:52 pm
Ok, perfecto, esperamos a ver como te va.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 15 Junio 2010, 19:05 pm
Ok, perfecto, esperamos a ver como te va.

Nada, no funciona. sigue sin leer bien la imágen...


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 15 Junio 2010, 19:12 pm
Borra toda la data y creala de nuevo.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 15 Junio 2010, 19:34 pm
Me parece que estas guardando img como si fuera un string entre ' ', debes suprimirlas, osea solo guardas:

Código
  1. INSERT INTO contactos (nombre,imagen)
  2. VALUES
  3. ('Juan',img);


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 15 Junio 2010, 19:50 pm
En efecto, ese es un problema, ya que si no mal recuerdo cuando ejecutas eso se envía a la base de datos algo asi:

0xFFD8FFE000104A46494600010101006000600000FFE1005A.. etc

Por lo que tiene que ser así y no texto..

Saludos


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 15 Junio 2010, 19:50 pm
Me parece que estas guardando img como si fuera un string entre ' ', debes suprimirlas, osea solo guardas:

Código
  1. INSERT INTO contactos (nombre,imagen)
  2. VALUES
  3. ('Juan',img);

me da el siguiente error haciendolo como dices:

Código:
El nombre "img" no es válido en este contexto. Las expresiones válidas son constantes, expresiones de constantes y, en algunos contextos, variables. No se permiten nombres de columna.

y lo he hecho así:

Código:
SqlCommand cmd = new SqlCommand("INSERT INTO contactos(apodo,imagen) VALUES('litos',img)", conexion);

Creo me doy por vencido...

 :-(


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 15 Junio 2010, 20:08 pm
osea usabas
Código
  1. '" + img + "'
haslo asi:
Código
  1. " + img + "


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 16 Junio 2010, 00:21 am
osea usabas
Código
  1. '" + img + "'
haslo asi:
Código
  1. " + img + "

También he probado así, y como te he puesto en el post anterior. De las 2 formas y me sigue fallando. Como me estás diciendo ahora me pasaba lo mismo de siempre, que me dice que el valor no es válido. Y añadiendo solo la imágen y un string me da el error que te he puesto arriba...

y no será cosa del sql??? pruebo con mysql???


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: raul338 en 16 Junio 2010, 00:45 am
Me parece que estas guardando img como si fuera un string entre ' ', debes suprimirlas, osea solo guardas:

Código
  1. INSERT INTO contactos (nombre,imagen)
  2. VALUES
  3. ('Juan',img);

Esta mal porque no puedes transformar un array a texto asi de simple

Código
  1. INSERT INTO contactos (nombre,imagen)
  2. VALUES
  3. ('Juan',img);
Desde C# se convierte a
Código
  1. INSERT INTO contactos (nombre,imagen)
  2. VALUES
  3. ('Juan',System.Array);

ese es el problema, no se como se maneja el tipo de datos image en sql por codigo, pero suponiendo que tienes que poner todos los bytes.... seria algo asi

Código
  1. string sql = "INSERT INTO contactos (nombre,imagen) values ('Juan',";
  2. sql += System.Text.Encoding.Ascii.GetString(img, 0, img.Length);
  3. sql += ");";
  4.  

Espero que esto ayude algo :P


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 16 Junio 2010, 01:11 am
Más facil, crea el sqlCommand, y el INSERT en vez de poner todo ahí, en los valores pones @elnombre, es decir, parámetros, de esta forma creas los parameters y se los pones. El código de ejemplo está en el link que te pasé en este mismo post..

Hazlo así, que no te falla.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 16 Junio 2010, 01:19 am
Más facil, crea el sqlCommand, y el INSERT en vez de poner todo ahí, en los valores pones @elnombre, es decir, parámetros, de esta forma creas los parameters y se los pones. El código de ejemplo está en el link que te pasé en este mismo post..

Hazlo así, que no te falla.

NO entiendo!!!. xDD

Raul, no me funciona lo que me has dicho me sale esto:
Sintaxis incorrecta cerca de '?'.
'.      ??. ..        ........      \a\b   
 ??.? .           .. }   .    !1A  Qa\a' no es un nombre válido, porque contiene un carácter NULL o un carácter Unicode no válido.
El identificador que comienza por '[<?8TA?k??G?|w?K???ea?2H\aa?.? ???|G(?1?7^?  R?a p?w$`W??O????.?r?I?<?9??F1?d?U????Kuu=?[?????88 ????[l?;)+D?s? ????wL?xQ????????' es demasiado largo. La longitud máxima es 128.
El identificador que comienza por '=[??Q??nc??V?5 y ?P={Q????? '?????@.'M????(?? ?#?q????J??6i-?0????-??n???H???k?????UH??>g_???_3?U??B? W?? ?d?3??4 1??&? Ms3???w?' es demasiado largo. La longitud máxima es 128.
El identificador que comienza por 'YN?'x  .?b? ????o?W?y? ??h??????? ??? ??T??w #?Mq???V?H&) ?????}??H?Gr ? ;??? A? ??? K?  ?
sJ???j? ?\a? ???#??:b?`r7????? ?i? ??l' es demasiado largo. La longitud máxima es 128.
El identificador que comienza por '?6'??O??x ??k? ?2?%???H???.?#? ?? ?'? ??? ? ??~ ?^2?E`'? ???????D{ ?\U&??F?RuK_????  ????  ?? ?yt;?;3??n 8<?_RXw ???:4Z???o?$0??' es demasiado largo. La longitud máxima es 128.
El identificador que comienza por '?e?|? ?
?O?????  Mp".-? ?? ??H? b3?????|4??r?[?1??\a? :??q??UE%?.NR?>??@???Gyv _2x??? ?S  ?? ?)u/ ? ???u  ???+=.?3???<? ??\aVc??==' es demasiado largo. La longitud máxima es 128.
El identificador que comienza por '??5??
? ????   _?@=?=?!?????~6 ???'?? ?r??z? * ?
??S??6 { ?^}??8t;?2<y1???? ?(? ???b?=???=o??X???rX???%?r  z?
 LIm!??????_?Y }???!' es demasiado largo. La longitud máxima es 128.
Falta la comilla de cierre después de la cadena de caracteres 'i???q^k?/Y?$???????<?????f?????9-+3 I$?{?e8?lpT??????);'.


 : :¬¬


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: raul338 en 16 Junio 2010, 01:34 am
Más facil, crea el sqlCommand, y el INSERT en vez de poner todo ahí, en los valores pones @elnombre, es decir, parámetros, de esta forma creas los parameters y se los pones. El código de ejemplo está en el link que te pasé en este mismo post..

Hazlo así, que no te falla.
Eso no resuelve el problema!! :xD :xD
:xD si con eso se resuelve, mira este codigo
Inserting and Retrieving images from SQL Server Database using C# (http://www.redmondpie.com/inserting-in-and-retrieving-image-from-sql-server-database-using-c/)

Citar
Hartigan, eso es porque yo no se usar el tipo Image de sql

mirando aca, http://msdn.microsoft.com/en-us/library/ms187993.aspx dicen que proximamente sacaran al tipo image :P y que en su lugar hay que usar varbinary. Aunque sigo sin encontrar como se debe usar


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 16 Junio 2010, 01:39 am
hehe viste raul xD es que yo lo probé y le mandé el código a Hartigan, creo que está en la página 2 xD


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 16 Junio 2010, 01:46 am
Vale voy a probar con ese código. Si con eso ya no funciona. entonces que le den. loool.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 16 Junio 2010, 02:27 am
Haha no te rindas xD


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 16 Junio 2010, 04:10 am
@Hartigan

Hice el ejemplo similar al tuyo a la rapida solo para ver el error, al quitar las comillas simples de img indica el error y referencia el modo de hacerlo (no prestes atencion al button1):

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Data.SqlClient;
  10. using System.IO;
  11.  
  12. namespace WindowsFormsApplication1
  13. {
  14.    public partial class Form1 : Form
  15.    {
  16.        public Form1()
  17.        {
  18.            InitializeComponent();
  19.        }
  20.  
  21.        private void button1_Click(object sender, EventArgs e)
  22.        {
  23.            System.IO.Stream derecho = new System.IO.MemoryStream();
  24.            this.pictureBox1.Image.Save(derecho, System.Drawing.Imaging.ImageFormat.Jpeg);
  25.            byte[] imgDerecha = new byte[derecho.Length];
  26.            derecho.Position = 0;
  27.            derecho.Read(imgDerecha, 0, System.Convert.ToInt32(derecho.Length));
  28.            derecho.Close();
  29.            string cadena_conexion = @"Server= (local)\SQLEXPRESS; DataBase = agenda; Integrated Security = yes;";
  30.            SqlConnection conexion = null;
  31.            conexion = new SqlConnection(cadena_conexion);
  32.            String sentenciaSQL = "insert into contactos (apodo) values('" + imgDerecha + "')";
  33.            SqlDataAdapter data_adapter = new SqlDataAdapter(sentenciaSQL, conexion);
  34.            conexion = new SqlConnection(cadena_conexion);
  35.            conexion.Open();
  36.            SqlCommand cmd = new SqlCommand(sentenciaSQL, conexion);
  37.            if ((1 != cmd.ExecuteNonQuery()))
  38.            {
  39.                MessageBox.Show("Se ha producido un error al acceder a la fuente de datos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  40.            }
  41.        }
  42.  
  43.        private void button2_Click(object sender, EventArgs e)
  44.        {
  45.            System.IO.Stream derecho = new System.IO.MemoryStream();
  46.            this.pictureBox1.Image.Save(derecho, System.Drawing.Imaging.ImageFormat.Jpeg);
  47.            byte[] imgDerecha = new byte[derecho.Length];
  48.            derecho.Position = 0;
  49.            derecho.Read(imgDerecha, 0, System.Convert.ToInt32(derecho.Length));
  50.            derecho.Close();
  51.            string cadena_conexion = @"Server= (local)\SQLEXPRESS; DataBase = agenda; Integrated Security = yes;";
  52.            SqlConnection conexion = null;
  53.            conexion = new SqlConnection(cadena_conexion);
  54.            String sentenciaSQL = "insert into contactos (apodo, imagen) values('"+ textBox1.Text + "',@img)";
  55.            SqlDataAdapter data_adapter = new SqlDataAdapter(sentenciaSQL, conexion);
  56.            conexion = new SqlConnection(cadena_conexion);
  57.            conexion.Open();
  58.            SqlCommand cmd = new SqlCommand(sentenciaSQL, conexion);
  59.            cmd.Parameters.AddWithValue("@img", imgDerecha);
  60.            if ((1 != cmd.ExecuteNonQuery()))
  61.            {
  62.                MessageBox.Show("Se ha producido un error al acceder a la fuente de datos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  63.            }
  64.        }
  65.  
  66.        private void button3_Click(object sender, EventArgs e)
  67.        {
  68.            string cadena_conexion = @"Server= (local)\SQLEXPRESS; DataBase = agenda; Integrated Security = yes;";
  69.            byte[] img = new byte[0];
  70.            string[] datos = new string[33];
  71.            String sentenciaSQL = "SELECT * FROM contactos WHERE apodo = 'pru1'";
  72.            SqlConnection conexion = null;
  73.            conexion = new SqlConnection(cadena_conexion);
  74.            SqlDataAdapter data_adapter = new SqlDataAdapter(sentenciaSQL, conexion);
  75.            DataTable data_table = new DataTable();
  76.            conexion.Open();
  77.            data_adapter.Fill(data_table);
  78.            textBox1.Text = data_table.Rows[0][0].ToString();
  79.            img = (byte[]) data_table.Rows[0][1];
  80.            int ArraySize = new int();
  81.            ArraySize = img.GetUpperBound(0);
  82.            System.IO.Stream derec = new System.IO.MemoryStream();
  83.            derec.Write(img, 0, img.Length);
  84.            pictureBox2.Image = Image.FromStream(derec);
  85.        }
  86.    }
  87. }
  88.  

Solo presta atencion al button 2 y 3 el 1 es para @raul338

Me parece que estas guardando img como si fuera un string entre ' ', debes suprimirlas, osea solo guardas:

Código
  1. INSERT INTO contactos (nombre,imagen)
  2. VALUES
  3. ('Juan',img);

Esta mal porque no puedes transformar un array a texto asi de simple

Código
  1. INSERT INTO contactos (nombre,imagen)
  2. VALUES
  3. ('Juan',img);
Desde C# se convierte a
Código
  1. INSERT INTO contactos (nombre,imagen)
  2. VALUES
  3. ('Juan',System.Array);

En realidad seria asi:
Código
  1. INSERT INTO contactos (nombre,imagen)
  2. VALUES
  3. ('Juan','System.Byte[]');


Y no se que entiendes por texto, pero mira el code del primer boton almaceno en una columna varchar(50) (apodo) el resultado del uso de las comillas simples, si no es texto entonces que es?????  :-\  

Y te dejo una imagen, si no quieres comprobarlos por ti mismo  :laugh:

(http://r.i.elhacker.net/cache?url=http://img189.imageshack.us/img189/8385/93615057.jpg)


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: raul338 en 16 Junio 2010, 05:59 am
Código
  1. //..........
  2. private void button1_Click(object sender, EventArgs e)
  3. {
  4.        //.........
  5.        String sentenciaSQL = "insert into contactos (apodo) values('" + imgDerecha + "')";
  6.        //.........
  7. }
  8.  

Solo presta atencion al button 2 y 3 el 1 es para @raul338
En realidad seria asi:
Código
  1. INSERT INTO contactos (nombre,imagen)
  2. VALUES
  3. ('Juan','System.Byte[]');


Y no se que entiendes por texto, pero mira el code del primer boton almaceno en una columna varchar(50) (apodo) el resultado del uso de las comillas simples, si no es texto entonces que es?????  :-\ 

Y te dejo una imagen, si no quieres comprobarlos por ti mismo  :laugh:

Es un reto? :xD

1º System.Byte[], bueno tengo la documentacion del .net framework en mi cabeza :xD era lo que recordaba, vos te pensas que abro el visual studio a probar?? no! lo saco de lo que se!

2º Cambiaste el codigo, si guarda el string, pero lo que el intentaba hacer era guardar la imagen como si fuera texto (para colmo sin comillas) cosa que no es lo que estas proponiendo (boton2). Estas proponiendo la misma solucion que pusimos yo y danger, usar command con parametros

Asi que cerra la .... (con cariño jajaja :xD)


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 16 Junio 2010, 14:49 pm
Es un reto? :xD
Si  :xD

2º Cambiaste el codigo, si guarda el string, pero lo que el intentaba hacer era guardar la imagen como si fuera texto (para colmo sin comillas) cosa que no es lo que estas proponiendo (boton2). Estas proponiendo la misma solucion que pusimos yo y danger, usar command con parametros

Estas completamente mal, no podria guardar como si fuera texto sin el uso de comillas :rolleyes: y me doy cuenta lo que tratas de decir, pero lo estas diciendo mal, supongo por una falta de conceptos basicos.

En realidad el visual studio te da la solucion al quitar las comillas simples ;D lo que ahorra mucho tiempo en lugar de estar haciendo teorias y buscando enlaces que a la final no sabes si solucionan el problema, y peor confundiendo un system.array con otro diferente que a la final causan mas confusión    :P


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: raul338 en 16 Junio 2010, 16:00 pm
1º que nada System.Byte[] es un array!!! :xD no me crucifiques simplemente por ejemplificar.

2º Me faltan Concepto basicos? Cuales?! :xD

Yo dije que no se como se usa el image de sql porque sinceramente nunca lo use y nunca lo usare. Asi que supuse que se guardaba como archivo binario puro, transformado en texto. Por eso use el GetString y sin las comillas. Luego tu saltaste a decir una gran ovbiedad: que no se puede guardar texto sin comillas :¬¬ cuando en realidad intento guardar datos binarios. Ademas... el primero que tiro esa idea de guardar sin las comillas fuiste vos

La solucion es definitiva. Usar command con parametros (que no recuerdo quien sugirio a principios del hilo y lo pasamos de largo) cosa que es lo que los 3 terminamos proponiendo igual


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 16 Junio 2010, 17:47 pm
Luego tu saltaste a decir una gran ovbiedad: que no se puede guardar texto sin comillas :¬¬ cuando en realidad intento guardar datos binarios.

2º Cambiaste el codigo, si guarda el string, pero lo que el intentaba hacer era guardar la imagen como si fuera texto (para colmo sin comillas)

Al parecer no entiendes ni lo que voz mismo escribes  :laugh:

2º Me faltan Concepto basicos? Cuales?! :xD

Simple no sabes distinguir entre un byte y un .......
A que no te das cuenta  :xD

Y la solucion que propongo es utilizar el visual studio para que nos dee las soluciones, que es muy distinto a no saber utilizarlo y por lo mismo ni abrirlo para buscar las soluciones en internet.



Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 16 Junio 2010, 18:19 pm
Pues cual es tu solución, ponla acá. Porque ya yo di la mía que es usar parámetros. 

:)


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 16 Junio 2010, 19:22 pm
"me canso"  :laugh:

En la noche cuando llegue a mi casa subo un ejemplo de un proyecto que hice hace un par de años  :P

Pero lo que quiero recalcar es que el VS te da las soluciones sin necesidad de estarlas buscando.  >:D


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 16 Junio 2010, 20:26 pm
Lo primero muchas gracias a todos de nuevo..

43H4FH44H45H4CH49H56H45H , el código que me pusistes antes a ti te funciona???

esque a mi me da el siguiente error: "Referencia a objeto no establecida como instancia de un objeto."

En concreto en las lineas:

Código
  1. label_Sobrenombre.Text = data_table.Rows[0][0].ToString();
  2. ...
  3. pictureBox_FotoImagen.Image = Image.FromStream(derec);

De todos modos inspeccionando la imágen parece que sí la toma bien, asíque solo me faltaría resolver eso... y luego ya estaría todo.

Salu2.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 16 Junio 2010, 20:37 pm
lo probe al hacerlo, funciona bien, fijate en las tablas del sql server que datos almaceno, hazlo con el SQL server manage... que esta en la imagen que puse. Si no lo tienes descargalo y compara.

Pega una img de las tablas y el code entero para ver.


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: raul338 en 16 Junio 2010, 22:29 pm
Luego tu saltaste a decir una gran ovbiedad: que no se puede guardar texto sin comillas :¬¬ cuando en realidad intento guardar datos binarios.

2º Cambiaste el codigo, si guarda el string, pero lo que el intentaba hacer era guardar la imagen como si fuera texto (para colmo sin comillas)

Al parecer no entiendes ni lo que voz mismo escribes  :laugh:

2º Me faltan Concepto basicos? Cuales?! :xD

Simple no sabes distinguir entre un byte y un .......
A que no te das cuenta  :xD

Y la solucion que propongo es utilizar el visual studio para que nos dee las soluciones, que es muy distinto a no saber utilizarlo y por lo mismo ni abrirlo para buscar las soluciones en internet.

El visual studio no es la solucion, solo nos da herramientas :P

no entiendo tu punto del byte.

Y no entendiste mi punto, yo queria guardar como texto PURO los mismisimos bytes, No con conmillas.... sino no hubieras hecho todo este lio :P


"me canso"  :laugh:
En la noche cuando llegue a mi casa subo un ejemplo de un proyecto que hice hace un par de años  :P
Pero lo que quiero recalcar es que el VS te da las soluciones sin necesidad de estarlas buscando.  >:D
Bueno, habra que ver ese proyecto :) lo estare esperando

pero.... quien dice lo contrario? solo que yo no busco en internet ni abro el visual studio para confirmar cosas que ya he confirmado antes :P
Si alguien pregunta sobre como se declara un integer, tu no vas y te fijas en el vs "int miEntero = 0;" o si? bueno en esto es lo mismo :P


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: [D4N93R] en 17 Junio 2010, 00:01 am
Si alguien pregunta sobre como se declara un integer, tu no vas y te fijas en el vs "int miEntero = 0;" o si? bueno en esto es lo mismo :P

Yo si, y veo que no se me olvide el ;  :¬¬

 ;-) ;-)


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 17 Junio 2010, 04:19 am
YEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


YEEEEEEEEEEEAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHH!!!!

Por fin!!!!, lo he conseguido. El úlgimo error que me daba era por una tontería, que había quitado el InitialiceComponent(); xDDD


Muchas gracias chicos, de verdad, muchisimas gracias!!!!!, sin vosotros no lo habría conseguido. Sois los mejores!!!!!!!!!!!!!!!!!!!!!!!!!


Al final he utilizado el código que me ha puesto: 43H4FH44H45H4CH49H56H45H y me ha funcionado perfectamente. El fallo estaba en que no se guardaba bien la imagen y por tanto no la leia bien. Asíque na. Tema solucionado.

Gracias de nuevo y un abrazo ;)


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 17 Junio 2010, 06:05 am
@Hartigan  ;-)

Bueno, habra que ver ese proyecto :) lo estare esperando

Que proyecto?  >:(  escribi que subiria un ejemplo de un proyecto que hice ...
Mas clarito, sacaria un ejemplo de ese proyecto para mostrarlo  :P


Saque muchas cosas que no iban al caso para lo que muestro:

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Data.SqlClient;
  10.  
  11. namespace Sql_Imagenes
  12. {
  13.    public partial class Form1 : Form
  14.    {
  15.        public Form1()
  16.        {
  17.            InitializeComponent();
  18.        }
  19.  
  20.        private void button1_Click(object sender, EventArgs e)
  21.        {
  22.            SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=bdprueba;Integrated Security=SSPI");
  23.            SqlDataAdapter dta = new SqlDataAdapter("Select Id,nombre,imagen From tprueba", con);
  24.            SqlCommandBuilder mycb = new SqlCommandBuilder(dta);
  25.            DataSet dts = new DataSet("tprueba");
  26.            dta.InsertCommand = mycb.GetInsertCommand();
  27.            dta.MissingSchemaAction = MissingSchemaAction.AddWithKey;
  28.  
  29.            System.IO.Stream strImg = new System.IO.MemoryStream();
  30.            this.pictureBox1.Image.Save(strImg, System.Drawing.Imaging.ImageFormat.Jpeg);
  31.            byte[] bImagen = new byte[strImg.Length];
  32.            strImg.Position = 0;
  33.            strImg.Read(bImagen, 0, System.Convert.ToInt32(strImg.Length));
  34.            strImg.Close();
  35.            dta.Fill(dts, "tprueba");
  36.  
  37.            DataRow myRow;
  38.            myRow = dts.Tables["tprueba"].NewRow();
  39.            myRow["nombre"] = textBox1.Text.Trim();
  40.            myRow["imagen"] = bImagen;
  41.            dts.Tables["tprueba"].Rows.Add(myRow);
  42.            dta.Update(dts, "tprueba");
  43.            con.Close();
  44.        }
  45.  
  46.        private void button2_Click(object sender, EventArgs e)
  47.        {
  48.            SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=bdprueba;Integrated Security=SSPI");
  49.            SqlDataAdapter dta = new SqlDataAdapter("Select Id,nombre,imagen From tprueba WHERE nombre ='" + textBox1.Text + "'", con);
  50.            SqlCommandBuilder mycb = new SqlCommandBuilder(dta);
  51.            DataSet dts = new DataSet("tprueba");
  52.  
  53.            dta.MissingSchemaAction = MissingSchemaAction.AddWithKey;
  54.  
  55.            dta.Fill(dts, "tprueba");
  56.            DataRow myRow;
  57.            try
  58.            {
  59.                myRow = dts.Tables["tprueba"].Rows[0];
  60.                byte[] MyData = new byte[0];
  61.                MyData = (byte[])myRow["imagen"];
  62.                int ArraySize = new int();
  63.                ArraySize = MyData.GetUpperBound(0);
  64.                System.IO.Stream derec = new System.IO.MemoryStream();
  65.                derec.Write(MyData, 0, MyData.Length);
  66.                textBox1.Text = myRow["nombre"].ToString();
  67.                pictureBox1.Image = Image.FromStream(derec);
  68.            }
  69.            catch (Exception er)
  70.            {
  71.                MessageBox.Show(er.Message);
  72.            }
  73.            con.Close();
  74.  
  75.        }
  76.    }
  77. }
  78.  

Yo lo use de este modo porque me parecia mas legible y otras cosas mas que ya no recuerdo.

La BD:

(http://img180.imageshack.us/img180/3229/dibujocj.jpg)

no entiendo tu punto del byte

Al quitar las comillas simples intentaba guardar un System.Byte[] como si fuera un byte y no como si fuera un texto (lo cual el VS y bla bla bla), mejor prueba lo que te digo...

yo queria guardar como texto PURO los mismisimos bytes No con conmillas....

Luego tu saltaste a decir una gran ovbiedad: que no se puede guardar texto sin comillas

Je je, ya no te entiendo, mejor pon en orden tus ideas.

Si se me fue alguna variable demas o quien sabe favor avisar, la culpa es de @raul338 me hace cansar la vista con sus comentarios  :xD



Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: raul338 en 17 Junio 2010, 15:46 pm
@Hartigan  ;-)

Bueno, habra que ver ese proyecto :) lo estare esperando

Que proyecto?  >:(  escribi que subiria un ejemplo de un proyecto que hice ...
Mas clarito, sacaria un ejemplo de ese proyecto para mostrarlo  :P
Es lo mismo :xD

no entiendo tu punto del byte

Al quitar las comillas simples intentaba guardar un System.Byte[] como si fuera un byte y no como si fuera un texto (lo cual el VS y bla bla bla), mejor prueba lo que te digo...

yo queria guardar como texto PURO los mismisimos bytes No con conmillas....

Luego tu saltaste a decir una gran ovbiedad: que no se puede guardar texto sin comillas

Je je, ya no te entiendo, mejor pon en orden tus ideas.
Mientras yo me entienda y lo haga asi, esta todo bien :P
Nunca me llegaste a entender, y no te lo voy a demostrar como si fuera suma de piedritas :xD

Si se me fue alguna variable demas o quien sabe favor avisar, la culpa es de @raul338 me hace cansar la vista con sus comentarios  :xD
:¬¬


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: 43H4FH44H45H4CH49H56H45H en 18 Junio 2010, 07:27 am
Nunca me llegaste a entender, y no te lo voy a demostrar como si fuera suma de piedritas :xD

Je je, la verdad que quiero que lo expliques asi con piedritas, consegui unas plastilinas para corregirte  :xD , que te parece si abrimos otro tema y ahi detallas tu idea, y yo te demuestro que no se puede hacer como lo planteas...


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: raul338 en 18 Junio 2010, 14:31 pm
Nunca me llegaste a entender, y no te lo voy a demostrar como si fuera suma de piedritas :xD

Je je, la verdad que quiero que lo expliques asi con piedritas, consegui unas plastilinas para corregirte  :xD , que te parece si abrimos otro tema y ahi detallas tu idea, y yo te demuestro que no se puede hacer como lo planteas...
Na, es algo que no tendria sentido. Habran otras mil formas de resolver la situacion :xD, no se si mi idea funcione. Porque era apostar a algo desconocido siguiendo un patron. Ademas, el tema esta resuelto. Hay que ser objetivo, no dar vueltas y vueltas


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: Hartigan en 2 Julio 2010, 10:14 am
Bueno chicos, vengo a decir que tengo un nuevo código que me ha funcionado a la primera, y que me parece más sencillo para lo que yo buscaba, ya que con el otro código si la imagen no era jpg a ver que hacía... y no iba a estar cambiado el código para cada imágen, aquí os lo dejo por si le sirve a alguien:

Código para convertir la imagen a byte[] y poder almacenarla en la bdd:
Código
  1. Bitmap picture;
  2.            picture = (System.Drawing.Bitmap)this.pictureBox_FotoImagen.Image;
  3.  
  4.            byte[] img;
  5.            if (this.pictureBox_FotoImagen.Image != null)
  6.            {
  7.  
  8.                TypeConverter BitmapConverter = TypeDescriptor.GetConverter(picture.GetType());
  9.                img = (byte[])BitmapConverter.ConvertTo(picture, typeof(byte[]));
  10.            }
  11.            else
  12.            {
  13.                img = null;
  14.            }

Código para convertir los bytes a bitmap y poder asignarsela al pictureBox:
Código
  1. if (img != null)
  2.            {
  3.                picture = new Bitmap(new MemoryStream(img));
  4.                this.pictureBox_FotoImagen.Image = picture;
  5.  
  6.            }
  7.            else
  8.            {
  9.                pictureBox_FotoImagen.Image = null;
  10.            }

Eso es todo. xD

Salu2 ;)


Título: Re: Guardar Imagen en base de datos. (c#)
Publicado por: neopuerta en 5 Julio 2010, 19:10 pm
Aguien sabe como hago que cuando alguien se registre en mi pagina automaticamente se les cree un perfil. :huh: :huh: